第一期水循環変動観測衛星「しずく」（GCOM-W1）搭載
高性能マイクロ波放射計 2（AMSR2）データ利用解説文書

第四版

平成 28 年 11 月 17 日

宇宙航空研究開発機構（JAXA）
地球観測研究センター（EORC）

AMSR2 データ利用解説文書

改訂履歴
版
第一版
第二版

日付
平成 25 年 2 月 1 日
平成 25 年 3 月 29 日

改訂内容
第一版発行
L2/L3 データ読込みを追記

第三版
第四版

平成 28 年 3 月 25 日
平成 28 年 11 月 17 日

SST の物理量 2 層化に対応
L1B/L1R Pixel Data Quality の読込方法変更に対応

2

AMSR2 データ利用解説文書

目次
１． 関連文書およびツールとデータの入手方法 ................................................... 4
２． 本書の構成 .............................................................................. 5
３． GCOM-W1/AMSR2 データの基礎知識 ........................................................... 6
３．１ 衛星軌道 ............................................................................ 6
３．２ 観測パス(グラニュール)............................................................... 8
３．３ L1 データと高次データ ................................................................ 9
３．４ ファイル名規則 ..................................................................... 10
３．５ 観測スキャンとオーバーラップ ........................................................ 11
３．６ 時刻形式 ........................................................................... 11
３．７ 観測周波数とフットプリント.......................................................... 12
３．８ L1 リサンプリングデータ(L1R) ........................................................ 14
３．９ 陸海フラグ ......................................................................... 14
３．１０ L1/L2 に格納されている緯度経度 .................................................... 15
３．１１ 緯度経度の標高補正(L1R)........................................................... 15
３．１２ 主なデータの HDF5 格納型・スケール・欠損値 ......................................... 16
４． ライブラリのインストール................................................................ 17
５． AMTK 編(C 言語) ......................................................................... 22
５．１ L1B データ読込み .................................................................... 22
５．２ L1R データ読込み .................................................................... 31
５．３ L2 低解像度データ読込み ............................................................. 40
５．４ L2 高解像度データ読込み ............................................................. 48
５．５ L3 輝度温度データ読込み ............................................................. 55
５．６ L3 物理量データ読込み ............................................................... 62
６． AMTK 編(FORTRAN90) ...................................................................... 68
６．１ L1B データ読込み .................................................................... 68
６．２ L1R データ読込み .................................................................... 77
６．３ L2 低解像度データ読込み ............................................................. 86
６．４ L2 高解像度データ読込み ............................................................. 95
６．５ L3 輝度温度データ読込み ............................................................ 103
６．６ L3 物理量データ読込み .............................................................. 110
７． HDF5 編(C 言語) ........................................................................ 116
７．１ L1B データ読込み ................................................................... 116
７．２ L1R データ読込み ................................................................... 128
７．３ L2 低解像度データ読込み ............................................................ 140
７．４ L2 高解像度データ読込み ............................................................ 150
７．５ L3 輝度温度データ読込み ............................................................ 159
７．６ L3 物理量データ読込み .............................................................. 167
８． HDF5 編(FORTRAN90) ..................................................................... 175
８．１ L1B データ読込み ................................................................... 175
８．２ L1R データ読込み ................................................................... 187
８．３ L2 低解像度データ読込み ............................................................ 199
８．４ L2 高解像度データ読込み ............................................................ 210
８．５ L3 輝度温度データ読込み ............................................................ 220
８．６ L3 物理量データ読込み .............................................................. 228
９． AMSR2 プロダクトデータ一覧 ............................................................. 235
１０． AMTK 定数 ............................................................................ 238

3

AMSR2 データ利用解説文書

１．関連文書およびツールとデータの入手方法
本書では GCOM-W1/AMSR2 データの利用方法および必要な基礎知識について取扱いますが、GCOM-W1
衛星および AMSR2 プロダクトについてのより詳しい情報は、GCOM-W1 データ提供サービスホームペー
ジから以下の関連文書をダウンロードできます。


GCOM-W1 データ利用ハンドブック
AMSR2 レベル 1 処理プロダクトフォーマット説明書
AMSE2 高次処理プロダクトフォーマット説明書(L3 プロダクト)

GCOM-W1 データ提供サービス
http://gcom-w1.jaxa.jp/
GCOM-W1 データ提供サービスホームページでは、AMSR2 プロダクトおよび過去の同一系統センサである AMSR/AMSR-E プロダクトを無償提供しています。ご利用にはユーザ登録が必要です。
本書で解説する AMSR2 Product I/O Toolkit (AMTK)、取扱い説明書、AMTK 用うるう秒ファイルについても GCOM-W1 データ提供サービスホームページからダウンロードできます。その他、GCOM-W1 関
連情報については、GCOM ホームページをご覧ください。
GCOM ホームページ
http://suzaku.eorc.jaxa.jp/GCOM/

本書では、AMSR2 プロダクトのデータフォーマットとして採用されている HDF5 ライブラリについても取扱います。HDF5 ライブラリおよび関連する SZIP ライブラリについては、下記ホームページからダウンロードしてください。
The HDF Group ホームページ
http://www.hdfgroup.org/

本書で使用するサンプルプログラムは、下記 web ページからダウンロードできます。
http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_use_j.html

4

AMSR2 データ利用解説文書

２．本書の構成
本書では GCOM-W1/AMSR2 データを利用するために必要となる GCOM-W1 衛星および AMSR2 センサの基
礎知識について説明を行った後、ライブラリのインストール方法とサンプルプログラムの解説を行います。プログラム言語としては C 言語と FORTRAN90 について取扱います。
AMSR2 プロダクトはデータフォーマットして HDF5 形式を採用しており、HDF5 ライブラリ経由でデータファイルにアクセスします。HDF5 ライブラリ単体でもデータ利用は可能ですが、HDF5 ライブラ
リをベースとした専用のツールキット(AMTK)も用意されています。
本書では、AMTK を利用する方法と HDF5 ライブラリから直接データアクセスする方法を、C 言語とFORTRAN90 で解説します。サンプルプログラム解説は以下の 4 パターンで同じ内容を取り扱いますので、ご使用になる環境に合わせてご利用ください。
- AMTK 編(C 言語)- AMTK 編(FORTRAN90)- HDF5 編(C 言語)- HDF5 編(FORTRAN90)
AMTK には、内部表現時刻形式の自動変換や AMSR2 センサの各周波数毎の観測点緯度経度の算出機
能、整数型格納変数の自動スケール変換機能が実装されています。時刻形式変換と各周波数緯度経度の算出については、本書のサンプルプログラムで同等のサブルーチンを用意していますので、HDF5
ライブラリからも利用可能です。

5

AMSR2 データ利用解説文書

３．GCOM-W1/AMSR2 データの基礎知識
３．１ 衛星軌道
GCOM-W1 衛星の軌道は、先行機である AMSR-E センサーが搭載された Aqua 衛星の軌道と同一です。
GCOM-W1 衛星の軌道諸元を表 1 に、軌道イメージを図 1 に示します。
表1
項目
軌道種別
軌道高度
軌道傾斜角
昇交点通過地方太陽時
回帰日数(周回数)

GCOM-W1 衛星軌道諸元
仕様
太陽同期準回帰軌道699.6km(赤道上)
98.186 度
13 時 30 分±15 分
16 日(233 周)

アセンディング(日照面を観測)
北極

北極
98°

赤道

赤道

南極

南極
ディセンディング
(日陰面を観測)(a)軌道面をななめから見た図
図1(b)軌道面を真横から見た図GCOM-W1 衛星軌道イメージ

GCOM-W1 衛星は赤道に対して約 98 度傾いた南北方向の軌道で地球を周回しています。
南極から北極への上昇をアセンディング、北極から南極への下降をディセンディングと呼びます。
GCOM-W1 衛星の軌道は、太陽同期準回帰軌道です。
太陽同期軌道とは、周期が太陽と同期している軌道です。アセンディングでは地球の日照面(昼)を、ディセンディングでは地球の日陰面(夜)を観測しており、同じ場所は同じ時刻に観測されます。
アセンディングでの赤道交差時刻は、観測領域の地方時刻で 13 時 30 分頃となります。
準回帰軌道とは、一定の期間で同じ地表面上空に戻ってくる軌道です。GCOM-W1 衛星は、16 日間で地球を 233 周すると同じ地表面上空に戻ってきます。1 日では地球を約 15 周します。

6

AMSR2 データ利用解説文書◇参考：Ａ－Ｔｒａｉｎ（A-Train とは）
A-Train（A-Train：The Afternoon Constellation）とは、高度約 700km、昇交点通過地方平均太陽時 13 時
30 分付近を観測軌道とする複数衛星から構成される NASA 主導の地球観測衛星のコンステレーション（衛星群）です。各国の衛星が協力して地球全体を観測するシステムで、現在軌道上で A-Train に参加している衛星は、
Aqua（米 NASA）、CloudSat（米 NASA）、CALIPSO（米 NASA/仏 CNES）、Aura（米 NASA）であり、日本から初めてGCOM-W1(しずく)が参加します。
（A-Train の特長）
地球観測では、いろいろなセンサで同時に同地点を観測することが非常に効果的です。複数の衛星がほぼ同一軌道に隊列を成して飛行することにより、複数の衛星で地球の同一地点をほぼ同じ時刻（約 10 分以内）に観測することができます。
各衛星の位置は厳密に管理されており、A-Train 軌道に入るには、すでに入っている人工衛星を避けて、決められた位置に入る必要があります。GCOM-W1 は、JAXA が培ったランデブーの技術を活かし、A-Train 軌道に入りました。人工衛星をこのようなコンステレーションに投入し、運用するのは、JAXA として初めてのことです。
≪A-Train（衛星コンステレーション）参加衛星≫●Aura NASA（米国） 2004 年 7 月 15 日 打上げ
地球大気の組成、化学反応、ダイナミクスを解明するための観測データを取得する衛星●CALIPSO NASA/CNES （米国／フランス）2006 年 4 月 28 日 打上げ
エアロゾルや雲が地球の気候に与える影響を解明するための観測データを取得する光学ライダー衛星●CloudSat NASA （米国）2006 年 4 月 28 日 打上げ
雲が地球の気候に与える影響を解明するための観測データを取得する電波レーダ衛星●Aqua NASA （米国）2002 年 5 月 4 日 打上げ
ラテン語で水（アクア）を意味する。大気中及び海からの水蒸気、雲、降雨、海氷、土壌水分等の様々な地球の水循環に関する観測データを取得する衛星●OCO-2 NASA（米国）大気中の二酸化炭素（CO2）量を観測(予定)7AMSR2 データ利用解説文書

３．２ 観測パス(グラニュール)
GCOM-W1/AMSR2 標準プロダクトデータは、観測緯度に対する極から極までの半周回を 1 つの観測パス(グラニュール)として作成されます。大きく分けて、北極から南極への半周回(ディセンディング)と南極から北極への半周回(アセンディング)の 2 種類があります。ディセンディングは日陰面(夜)の観測で、アセンディングは日照面(昼)の観測になります。
図 2 に、回帰 1 日目の標準プロダクトの観測パス領域を示します。全球マップが描かれている部分
が観測領域で、白い隙間は観測外領域です。

図2

標準プロダクトの観測パス領域

観測領域に表示されている数字はパス番号です。GCOM-W1 衛星が回帰日数 16 日の間に地球を周回する 233 周には、1～233 の固有番号が付けられており、これをパス番号と呼びます。連続する周回
では、パス番号は 16 ずつ増えていきます。標準プロダクトの観測パスは半周回のパスなので、ディセンディングの D やアセンディングの A を付加して「151D」や「151A」のように呼ばれます。図 2 の赤色の部分は「151D」の観測領域、橙色の部分は「151A」の観測領域です。観測パスおよびパス番号の定義は、先行機である Aqua/AMSR-E と同一です。

◇参考: 観測パス開始位置とパス番号開始位置
観測パスの開始位置は極ですが、パス番号の開始位置はアセンディング赤道交差点として定義されています。観測パスに付与されるパス番号は、観測パス開始位置でのパス番号となります。

図3

パス番号の開始位置

例として、パス番号 151 の領域を図 3 に紫色で示します。
観測パス「151D」は観測開始位置(北極)において、パス番号が 151 の領域から始まっています。
観測パス「151A」は観測開始位置(南極)において、パス番号が 151 の領域から始まっています。

8

AMSR2 データ利用解説文書

３．３ L1 データと高次データ
AMSR2 センサーはマイクロ波放射計です。観測するのは 6.9GHz～89.0GHz の電磁波で、観測されたデータは、観測データカウント値(L1A)→輝度温度(L1B)→地球物理量(L2)と変換されます。AMSR2 プ
ロダクトで算出される地球物理量は表 2 の通りです。
表2

AMSR2 プロダクトで算出される地球物理量
物理量名
可降水量 (Total Precipitable Water)
積算雲水量(Cloud Liquid Water)
降水量(Precipitation)
海面水温 (Sea Surface Temperature)
海上風速 (Sea Surface Wind Speed)
海氷密接度(Sea Ice Concentration)
積雪深(Snow Depth)
土壌水分量(Soil Moisture Content)
L1 は輝度温度(Brightness Temperature; TB)の観測パスデータです。
L2 は地球物理量(Geophysical Data; GEO)に変換された観測パスデータです。
L3 は地図投影されたデータです。L3 には輝度温度(L3TB)と地球物理量(L3GEO)があります。L3 には日集計データと月集計データがあり、アセンディングとディセンディングに分けて作成されます。
地球物理量として算出されるプロダクト(L2 と L3GEO)は高次データと呼ばれます。
L1/L2 データは、観測パスの矩形データです。この矩形データを、観測点の緯度経度を元に地図投
影して L3 データが作成されます。図 4 に地図投影前後の比較図を示します。

地図投影(a)L1/L2 観測パスデータ(b)L3 地図投影データ
図4

観測パスの地図投影

9

AMSR2 データ利用解説文書

３．４ ファイル名規則
AMSR2 プロダクトのファイル名は、グラニュール ID＋拡張子".h5"となっています。
L1/L2 グラニュール ID を図 5 に、L3 グラニュール ID を図 6 に示します。

1
2
3
4
文字位置:
12345678901234567890123456789012345678901
ファイル名: GW1AM2_YYYYMMDDHHmm_PPPX_LLxxKKKrdvaaappp
L1 サンプル: GW1AM2_201209071216_068D_L1SGBTBR_0000000
L2 サンプル: GW1AM2_201209071216_068D_L2SGSSTLA0000000
GW1 : 衛星名(GW1 固定) AM2 : センサ種別(AM2 固定) YYYYMMDDHHmm : 観測開始日時(年は西暦、時刻は UT)
PPP : パス番号(001～233、開始時のパス番号) X : 軌道(A:アセンディング、D:ディセンディング、B:両方)
LL : 処理レベル(L1:レベル 1、L2:レベル 2) xx : 処理種別(SG:標準、SN:準リアル、SL:準リアル日本周辺)
KKK : プロダクト ID
L1 : ADN -> L1A、BTB -> L1B、RTB -> L1R
L2 : CLW -> 積算雲水量(Cloud Liquid Water)
PRC -> 降水量(Precipitation)
SIC -> 海氷密接度(Sea Ice Concentration) SMC -> 土壌水分量(Soil Moisture Content)
SND -> 積雪深(Snow Depth)
SST -> 海面水温(Sea Surface Temperature)
SSW -> 海上風速(Sea Surface Wind Speed)
TPW -> 可降水量(Total Precipitable Water)r: 解像度(L1 では R[Raw]固定、L2 では L[低解像度 243 点]または H[高解像度 486 点])d: 開発者 ID(L1 では_、L2 では A～Z)v
: プロダクトバージョン(0～9、A～Z)
aaa : アルゴリズムバージョン(000～999) ppp : パラメータバージョン(000～999)

図5

L1/L2 グラニュール ID

1
2
3
4
文字位置:
12345678901234567890123456789012345678901
ファイル名:GW1AM2_YYYYMMDD_ttt_PPWX_LLxxKKKrdvaaappp
L3 サンプル(物理量) : GW1AM2_20120907_01D_EQOA_L3SGSSTLA0000000
L3 サンプル(輝度温度): GW1AM2_20120907_01D_EQMA_L3SGT06LA0000000
GW1 : 衛星名(GW1 固定) AM2 : センサ種別(AM2 固定) YYYYMMDD : 観測開始日(年は西暦、時刻は UT)
ttt : 統計期間(01D:日単位、01M:月単位[DD は 00])
PP : 地図投影種別(EQ:等緯度経度、PN:ポーラステレオ北半球、PS:ポーラステレオ南半球)
W: 統計手法(M:平均、O:最新上書き) X : 軌道(A:アセンディング、D:ディセンディング)
LL : 処理レベル(L3:レベル 3) xx : 処理種別(SG:標準)
KKK : プロダクト ID
T06,T07,T10,T18,T23,T36,T89 -> 各周波数輝度温度(1 ファイルに H と V が格納されます)
CLW -> 積算雲水量(Cloud Liquid Water)
PRC -> 降水量(Precipitation)
SIC -> 海氷密接度(Sea Ice Concentration) SMC -> 土壌水分量(Soil Moisture Content)
SND -> 積雪深(Snow Depth)
SST -> 海面水温(Sea Surface Temperature)
SSW -> 海上風速(Sea Surface Wind Speed)
TPW -> 可降水量(Total Precipitable Water)r: 解像度(L:低解像度、H:高解像度)
低解像度ピクセル数
高解像度ピクセル数
地図投影種別経度または横緯度または縦経度または横緯度または縦
EQ
1440
720
3600
1800
PN(輝度温度、SIC)
304
448
760
1120
PS(輝度温度、SIC)
316
332
790
830
PN(SND)
432
574
1080
1435
d
: 開発者 ID(A～Z)
v: プロダクトバージョン(0～9、A～Z)
aaa : アルゴリズムバージョン(000～999) ppp : パラメータバージョン(000～999)

図6

L3 グラニュール ID
10

AMSR2 データ利用解説文書

３．５ 観測スキャンとオーバーラップ
観測スキャン概要図を図 7 に示します。AMSR2 センサーは、衛星進行方向に対して、反時計回りの円弧上に地表面をスキャンしていきます。1 スキャンには複数の観測点があります。L1/L2 データには、連続する観測スキャンが二次元配列データとして格納されています。
オーバーラップ概要図を図 8 に示します。L1/L2 は観測緯度に対する極から極までの半周回データ
ですが、L1 では極の前後 20 スキャンがオーバーラップとして重複して格納されています。L2 には重複部分はありません。同じパスの L1 と L2 を比較すると、L1 の方が 40 スキャン多くデータが格納されています。
オーバーラップ
北極頂点

観測緯度
スキャン方向
観測点

南極頂点
L1

L1

観測スキャン
衛星進行方向

北極頂点

観測緯度

南極頂点
L2

図7

観測スキャン概要図

図8

L2

オーバーラップ概要図

３．６ 時刻形式
AMSR2 プロダクトの L1/L2 には、観測スキャン毎の時刻が TAI93 形式で格納されています。TAI93
形式とは、うるう秒も含めた、1993 年 1 月 1 日 0 時 0 分(UT)からの通算秒です。
うるう秒とは、地球自転の揺らぎにより発生する世界時刻と原子時計時刻との差異を調整するために追加または削除される秒です。うるう秒は地球自転の揺らぎにより不規則に発生しますので、うるう秒が追加または削除された日付の一覧(うるう秒ファイル)がなければ TAI93 形式の変換はできません。
例えば 2012 年 7 月 24 日は、1993 年 1 月 1 日からの通算秒が 617,241,600 で、この間に 8 回うるう秒が追加されていますので、TAI93 形式では 617,241,608 となります。
AMTK を使用する場合は、時刻データは年/月/日/時/分/秒形式に自動的に変換されますが、HDF5 ラ
イブラリを使用して格納データを直接読込む場合は、時刻変換処理を別途行う必要があります。(本文書の HDF5 編サンプルプログラムには TAI93 時刻変換サブルーチンが付属しています。)
11

AMSR2 データ利用解説文書

３．７ 観測周波数とフットプリント
AMSR2 センサーが観測する周波数帯は、6.9GHz、7.3GHz、10.7GHz、18.7GHz、23.8GHz、36.5GHz、89.0GHz の 7 つあります。各周波数帯には、水平偏波チャンネルと、垂直偏波チャンネルがあります。
さらに、89.0GHz では A ホーンと B ホーンに分かれて観測されます。合計で観測チャンネルは 16 になります。表 3 に観測チャンネル一覧を示します。
表3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

AMSR2 センサーの観測チャンネル

6.9GHz 水平偏波
6.9GHz 垂直偏波
7.3GHz 水平偏波
7.3GHz 垂直偏波
10.7GHz 水平偏波
10.7GHz 垂直偏波
18.7GHz 水平偏波
18.7GHz 垂直偏波
23.8GHz 水平偏波
23.8GHz 垂直偏波
36.5GHz 水平偏波
36.5GHz 垂直偏波
89.0GHz A ホーン 水平偏波
89.0GHz A ホーン 垂直偏波
89.0GHz B ホーン 水平偏波
89.0GHz B ホーン 垂直偏波

低周波観測
1 スキャンは 243 点

高周波観測
1 スキャンは 486 点

6.9GHz～36.5GHz は低周波観測で、1 スキャンは 243 点です。89.0GHz は高周波観測で、1 スキャンは 486 点です。物理量算出で参照される観測チャンネルは物理量によって異なりますが、主となる観測チャンネルによって、L2 サンプル数が異なります。表 4 に各物理量の L2 サンプル数を示します。
表4

各物理量の L2 サンプル数

物理量名
可降水量 (Total Precipitable Water)
積算雲水量(Cloud Liquid Water)
降水量(Precipitation)
海面水温 (Sea Surface Temperature)
海上風速 (Sea Surface Wind Speed)
海氷密接度(Sea Ice Concentration)
積雪深(Snow Depth)
土壌水分量(Soil Moisture Content)

L2 サンプル数
243 点
243 点
486 点
243 点
243 点
243 点
243 点
243 点

1 つの観測点で観測される地表面領域はフットプリントと呼ばれますが、フットプリントの大きさ
は周波数によって異なります。表 5 と図 9 に各周波数のフットプリントを示します。
表5

各周波数のフットプリント

フットプリント(スキャン方向×衛星進行方向)
6.9GHz35km × 62km
7.3GHz34km × 58km
10.7GHz24km × 42km
18.7GHz14km × 22km
23.8GHz15km × 26km
36.5GHz7km × 12km
89.0GHz
3km × 5km
注）18.7GHz のフットプリントは、23.8GHz より小さくなります。
周波数12

AMSR2 データ利用解説文書

スキャン 2

スキャン 1

スキャン 1(a)6.9GHz

衛星進行方向スキャン 2

スキャン 1

衛星進行方向衛星進行方向スキャン 2(b)7.3GHz(c)10.7GHz

スキャン 2

スキャン 1

スキャン 1(d)18.7GHz

衛星進行方向スキャン 2

スキャン 1

衛星進行方向衛星進行方向スキャン 2(e)23.8GHz(f)36.5GHz
23.8GHz

6.9GHz
7.3GHzA ホーン スキャン 2

10.7GHz

18.7GHz注）18.7GHz のフットプリントは、
23.8GHz より小さくなります。
89.0GHz A ホーン

A ホーン スキャン 1

B ホーン スキャン 1

衛星進行方向衛星進行方向

B ホーン スキャン 2(g)89.0GHz

89.0GHz Ｂホーン
36.5GHz(h)重ね合わせ
図9

各周波数のフットプリントサンプル

同じ観測点でも、厳密には周波数毎に中心緯度経度が異なります。
図 10 に、同じ観測点の中心緯度経度の比較サンプルを示します。
※10GHz と 23GHz の中心緯度経度は同じです。
※6GHz と 18GHz の中心緯度経度は同じです。

衛星進行方向図 10 同じ観測点の中心緯度経度の比較サンプル
13

AMSR2 データ利用解説文書

３．８ L1 リサンプリングデータ(L1R)
物理量算出等の観測データ処理では複数の周波数データを組合せて使用しますが、その場合、異なるフットプリントのデータを組合せるので、厳密には対象となる地表面領域の整合が取れていません。
AMSR2 プロダクトでは、対象となる地表面領域の整合が取れたデータを提供するため、特定の周波数のフットプリントを基準にして、各周波数のフットプリントをリサンプリングしたデータ(L1R)を用意しています。
L1R では、観測点の中心緯度経度も統一しており、89G A ホーン緯度経度を基準としています。
基準となるフットプリントは 6G/10G/23G/36G の 4 種類で、基準フットプリントより小さいフット
プリント(基準周波数より高い周波数)がリサンプリングデータとして算出されます。表 6 に L1R 輝度
温度データ一覧を示します。
表6
フットプリント

6G
(H/V)
243 点
☆

7G
(H/V)
243 点
○

L1R 輝度温度データ一覧
10G
(H/V)
243 点
○
☆

18G
(H/V)
243 点
○
○
○

23G
(H/V)
243 点
○
○
☆

36G
(H/V)
243 点
○
○
○
☆

89G
(H/V)
243 点
○
○
○
○

6G 解像度10G 解像度
23G 解像度
36G 解像度
89G 解像度○は中心緯度経度とフットプリントをリサンプリングしたデータ☆は中心緯度経度をリサンプリングしたデータ△は観測オリジナルデータ
注）18G は 23G よりフットプリントが小さいため、23G 解像度に含まれます。

89G A-horn
(H/V)
486 点

89G B-horn
(H/V)
486 点

△

△

L1R には、6G/10G/23G/36G 解像度のリサンプリングデータに加えて、89G 解像度としてオリジナルの 89G データも含まれます。
観測点の中心緯度経度を統一してリサンプリングしているため、6G 解像度の 6G データでも、オリジナルの 6G データとは一致しません。
３．９ 陸海フラグAMSR2 プロダクトには、補助データとして観測点の陸海情報が格納されています。この陸海情報は
陸海フラグと呼ばれており、フットプリントに対する陸の割合が 0%～100%の整数で格納されています。水域は 0%、陸域は 100%です。図 11 に陸海フラグ概要図を示します。

フットプリント

陸海 陸海 陸海 陸海 陸海 陸海100% 85% 50% 20% 1%
0%
陸域

水域

図 11 陸海フラグ概要図
高周波用陸海フラグは、A ホーン用と B ホーン用の 2 種類あります。
低周波用陸海フラグは、L1B では 6 種類の周波数(フットプリント)があるので、陸海フラグも 6 種類(6G/7G/10G/18G/23G/36G)あります。L1R では 4 種類の解像度(フットプリント)があるので、陸海フラグも 4 種類(6G/10G/23G/36G)あります。
14

AMSR2 データ利用解説文書

３．１０ L1/L2 に格納されている緯度経度
L1 に格納されている緯度経度は、89G A ホーン緯度経度と 89G B ホーン緯度経度です。
L1B では、緯度経度は周波数毎に異なりますが、低周波の各周波数の緯度経度は、89G A ホーン緯度経度と相対レジストレーション係数を用いて算出できます。
L1R は 89G A ホーン緯度経度を基準にリサンプリングされているので、低周波の各解像度の緯度経度は全て同じで 89G A ホーン緯度経度を使用します。ただし、低周波観測が 243 点なのに対し、高周波観測は 486 点なので、1 から数えて奇数番目の緯度経度を使用します。
L1B の低周波の緯度経度は、AMTK を使用する場合は自動的に算出されますが、HDF5 ライブラリを使用する場合は緯度経度計算を別途行う必要があります。(本文書の HDF5 編サンプルプログラムには
低周波緯度経度算出サブルーチンが付属しています。)
L1R の低周波用緯度経度は、AMTK を使用する場合は自動的に取得されますが、HDF5 ライブラリを使用する場合は 89G A ホーン緯度経度の間引き処理を別途行う必要があります。
L2 に格納されている緯度経度は、L1B を入力とする物理量と、L1R を入力とする物理量で異なります。(入力となった L1 は、L2 プロダクトメタデータの InputFileName で確認できます。)
L1B を入力とする物理量では、輝度温度の緯度経度は周波数毎に異なるので、物理量の緯度経度としては低周波緯度経度の平均値が格納されています。
L1R を入力とする物理量では、輝度温度の緯度経度は全ての解像度で統一されているので、物理量の緯度経度としては L1R の低周波用緯度経度が格納されています。
L2 降水量プロダクトは高解像度 L2 プロダクトなので、89G A ホーン緯度経度と 89G B ホーン緯度
経度が格納されています。
L1/L2 に格納されている緯度経度について表 7 にまとめます。
表7
プロダクト
L1B
L1R
L2(L1B 入力)
L2(L1R 入力)
L2(降水量)L1/L2 に格納されている緯度経度

格納されている緯度経度
89G A ホーン緯度経度
89G B ホーン緯度経度
89G A ホーン緯度経度
89G B ホーン緯度経度

備考
低周波の各周波数の緯度経度は、相対レジストレーション係数を用いて算出します。
低周波の緯度経度は、89G A ホーン緯度経度の1 から数えて奇数番目を使用します。

L1B 低周波平均緯度経度
L1R 低周波用緯度経度(89G A ホーンの奇数番目)
89G A ホーン緯度経度
89G B ホーン緯度経度

３．１１ 緯度経度の標高補正(L1R)
L1B では、観測点の緯度経度を地球楕円体とセンサー視線の交点として求めており、地表面高さは考慮していません。AMSR2 の視線は地表面に対して斜めに入射するので、標高が高い地域では実際の観測点とのずれが大きくなります。
L1R では、L1B 緯度経度に対して標高補正を行って、地表面高さによる緯度経度のずれを補正しています。地表面高さをＨ、観測入射角をθとした時、水平移動距離Ｌを次の式で計算して補正を行います。

Ｈ : 地表面高さ
θ : 観測入射角
Ｌ : 水平移動距離
実際の観測点
地表面高さ

観測点

図 12 標高補正

Ｌ ＝ Ｈtanθ
15

地球楕円高

AMSR2 データ利用解説文書

３．１２ 主なデータの HDF5 格納型・スケール・欠損値
表 8 に主なデータの HDF5 格納型・スケール・欠損値を示します。
表8

主なデータの型・スケール・欠損値

データ
L1/L2 時刻(TAI93)
L1/L2 緯度経度
L1 観測入射角
L1 観測方位角
L1/L3 輝度温度

HDF5 格納型
8byte 浮動小数点型
4byte 浮動小数点型
2byte 整数型(符号あり)
2byte 整数型(符号あり)
2byte 整数型(符号なし)

L2/L3 物理量

2byte 整数型(符号あり)

スケール[単位]1[sec]
1[deg]
0.01[deg]
0.01[deg]
0.01[K]
可降水量:0.01[kg/m2]
積算雲水量: 0.001[kg/m2]
降水量:
0.1[mm/h]
海面水温:0.01[degC]
海上風速:0.01[m/s]
海氷密接度: 0.1[%]
積雪深:0.1[cm]
土壌水分量: 0.1[%]

欠損値-9999.0-9999.0-32768-3276865535

L3 観測外領域-32768-3276765534

データファイルのサイズが小さくなるように、輝度温度や物理量の格納型には 2byte 整数型が使われています。2byte 整数型の値の範囲は、符号なしの場合は 0～65535、符号ありの場合は-32768～
32767 となるので、その範囲で目的のデータを表現するために、スケールが設定されています。
例えば、輝度温度として 28312 が格納されていた場合、輝度温度のスケールは 0.01[K]なので、実際の輝度温度は 283.12[K]となります。
AMTK を使用する場合はスケールは自動的に処理されますが、HDF5 ライブラリを使用する場合はス
ケール処理を別途行う必要があります。
なんらかの理由によりデータが取得されなかった場合には欠損値が格納されます。例えば物理量の場合は、算出対象となる領域が限定されている場合があり、対象外領域には欠損値が格納されます。
積算雲水量の場合、算出対象となるのは水域だけなので、陸域は対象外領域として欠損値-32768 が格納されます。
L1/L2 を地図投影して L3 を作成する場合は、欠損値と観測されていない領域を区別するため、観測外領域に欠損値と異なる値が設定されます。図 13 に欠損値と L3 観測外領域のサンプルを示します。

欠損値(白色;-32768)※積算雲水量では、陸域は対象外のため欠損値となります。
L3 観測外領域(灰色;-32767)※観測されていない領域は欠損値と区別されます。

図 13 欠損値と L3 観測外領域のサンプル(積算雲水量の場合)

16

AMSR2 データ利用解説文書

４．ライブラリのインストール
本書のサンプルプログラムは以下の環境で動作確認を行っています。
表9
計算機
ＯＳ
C コンパイラ
FORTRAN コンパイラ
HDF5
SZIP
AMTK

動作確認環境Intel(R) Xeon(R) CPU E5504
Red Hat Enterprise Linuxrelease 5.4
GNU C compiler 4.1.2
Intel C compiler Version 11.1
PGI C compiler Version 10.9
Intel FORTRAN compiler Version 11.1
PGI FORTRAN compiler Version 10.9
HDF5 version 1.8.4-patch1
SZIP version 2.1
version 1.11

以下の手順では、linux 計算機において、ユーザー権限のみでインストールを行う方法について説明します。インストール先は/home/user1/util 配下とし、ライブラリ毎にディレクトリを作成していきます。図 14 にライブラリディレクトリ構成を示します。
このようなディレクトリ構成でインストールを行っておくと、後日、ライブラリがバージョンアッ
プされた場合に、旧バージョンと新バージョンが共存でき、ライブラリパスを切換える事により、新/旧両バージョンを使い分ける事ができます。

/

home

user1
util
AMTK_AMSR2_1.11
includelib
hdf5_1.8.4-patch1
includelibbinszip_2.1
includelib
図 14 ライブラリディレクトリ構成

17

AMSR2 データ利用解説文書

以下の説明では、/home/usr1 を自分のユーザーディレクトリに置き換えて作業してください。
(1)SZIP のインストール
1-1 ダウンロード
The HDF Group ホームページの SZIP ページ(http://www.hdfgroup.org/ftp/lib-external/szip/)
からソースインストール版の圧縮ファイルをダウンロードします。
※以下では szip-2.1.tar.gz をダウンロードしたものとして説明します。
1-2 解凍適当な作業ディレクトリで圧縮ファイルを解凍します。
以下のコマンドで解凍できます。
$ tar -xzvf szip-2.1.tar.gz
解凍すると、szip-2.1 のようなディレクトリが作成されるので、その配下へ移動します。
$ cd szip-2.1
1-3 コンパイルとインストール
以下のコマンドを順番に実行して、コンパイルとインストールを行います。
--prfix=には、インストール先ディレクトリを指定します。
※この例の場合、szip のバージョンは 2.1 なので、szip_2.1 としています。
バージョン文字部分は実際に使用するバージョンに置き換えてください。
$ ./configure --disable-shared --prefix=/home/user1/util/szip_2.1$ make$ make install

18

AMSR2 データ利用解説文書(2)HDF5 のインストール
2-1 ダウンロード
The HDF Group ホームページ(http://www.hdfgroup.org/)から HDF5 のソースインストール版の圧縮ファイルをダウンロードします。
※以下では hdf5-1.8.4-patch1.tar.gz をダウンロードしたものとして説明します。
2-2 解凍適当な作業ディレクトリで圧縮ファイルを解凍します。
以下のコマンドで解凍できます。
$ tar -xzvf hdf5-1.8.4-patch1.tar.gz
解凍すると、hdf5-1.8.4-patch1 のようなディレクトリが作成されるので、その配下へ移動します。
$ cd hdf5-1.8.4-patch1
2-3 コンパイルとインストール
以下のコマンドを順番に実行して、コンパイルとインストールを行います。
--prfix=には、インストール先ディレクトリを指定します。
※この例の場合、hdf5 のバージョンは 1.8.4-patch1 なので、hdf5_1.8.4-patch1 としています。
バージョン文字部分は実際に使用するバージョンに置き換えてください。
＜HDF5 の FORTRAN ライブラリを使用しない場合＞$ ./configure --disable-shared --prefix=/home/user1/util/hdf5_1.8.4-patch1--with-szlib=/home/user1/util/szip_2.1$ make$ make install＜HDF5 の FORTRAN ライブラリを使用する場合＞$ ./configure --disable-shared --prefix=/home/user1/util/hdf5_1.8.4-patch1--with-szlib=/home/user1/util/szip_2.1 --enable-fortran FC=ifort$ make$ make install
FORTRAN90 を使用する場合で、AMTK を使用せず、HDF5 ライブラリのみで AMSR2 プロダクトへアクセスしたい場合は、＜HDF5 の FORTRAN ライブラリを使用する場合＞の手順でインストールを行ってください。FC=には使用するフォートランコンパイラを指定します。ここではインテルコンパイラ(ifort)を指定しています。フォートランコンパイラは、インテルコンパイラ(ifort)または PGI コン
パイラ(pgf90)で動作確認を行っています。

19

AMSR2 データ利用解説文書

AMTK を使用しない場合は、(3)をスキップして、(4)を実施してください。
(3)を実施した場合は、(4)は必要ありません。
(3)AMTK のインストール
3-1 ダウンロード
GCOM-W1 データ提供サービスホームページ(http://gcom-w1.jaxa.jp/)から
インストール用圧縮ファイルをダウンロードします。
※以下では AMTK_AMSR2_Ver1.11.tar.gz をダウンロードしたものとして説明します。
注意事項）
SZIP/HDF5 では、圧縮ファイルを解凍した場所とインストール先は別ですが、AMTK では、圧縮ファイルを解凍した場所がライブラリディレクトリになります。
3-2 解凍/home/user1/util 配下に AMTK_AMSR2_Ver1.11.tar.gz を配置して、以下のコマンドを実行します。
$ tar -xzvf AMTK_AMSR2_Ver1.11.tar.gz
解凍すると、AMTK_AMSR2 のようなディレクトリが作成されるので、
AMTK_AMSR2_1.11 のようなバージョン付きの名前にリネームします。
リネーム後、その配下へ移動します。
$ cd AMTK_AMSR2_1.11
3-3 コンパイル
以下のコマンドを順番に実行して、コンパイルを行います。
--with-hdf-include=には hdf5 のインクルードディレクトリ、--with-hdf-lib=には hdf5 のライブラリディレクトリを指定します。
$ ./configure --with-hdf-include=/home/user1/utilhdf5_1.8.4-patch1/include--with-hdf-lib=/home/user1/utilhdf5_1.8.4-patch1/lib$ make3-4 環境設定
うるう秒ファイル leapsec.dat と物理量ファイル geophysical_file の場所を環境変数に設定します。
この 2 つのファイルは AMTK ライブラリディレクトリ配下の share/data にあります。
以下のような設定をユーザーログインスクリプトなどに追加してください。
＜csh/tcsh 環境の場合 → .login ファイルまたは.cshrc ファイル＞
setenv AMSR2_LEAP_DATA /home/user1/util/AMTK_AMSR2_1.11/share/data/leapsec.dat
setenv GEOPHYSICALFILE /home/user1/util/AMTK_AMSR2_1.11/share/data/geophysical_file＜sh/bash 環境の場合 → .profile ファイルまたは.bashrc ファイル＞
export AMSR2_LEAP_DATA=/home/user1/util/AMTK_AMSR2_1.11/share/data/leapsec.dat
export GEOPHYSICALFILE=/home/user1/util/AMTK_AMSR2_1.11/share/data/geophysical_file20

AMSR2 データ利用解説文書(4)うるう秒ファイルの配置
GCOM-W1 データ提供サービスホームページ(http://gcom-w1.jaxa.jp/)からうるう秒ファイル leapsec.dat をダウンロードします。
ダウンロードしたうるう秒ファイル leapsec.dat を適当なディレクトリに配置して、ディレクトリを環境変数 AMSR2_LEAP_DATA に設定します。
以下のような設定をユーザーログインスクリプトなどに追加してください。
＜csh/tcsh 環境の場合 → .login ファイルまたは.cshrc ファイル＞
setenv AMSR2_LEAP_DATA /home/user1/util/leapsec.dat＜sh/bash 環境の場合 → .profile ファイルまたは.bashrc ファイル＞
export AMSR2_LEAP_DATA=/home/user1/util/leapsec.dat

21

AMSR2 データ利用解説文書

５．AMTK 編(C 言語)
赤文字の解説はサンプルプログラムについて説明しています。
青文字の解説は関数リファレンスまたは衛星基礎知識について説明しています。

５．１ L1B データ読込み
５．１．１ サンプルプログラム readL1B_amtk.c 解説
サンプルプログラム readL1B_amtk.c では、L1B データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波緯度経度を算出し、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

89G A ホーン緯度経度から算出するデータ- 緯度経度(低周波平均)- 緯度経度(6G)- 緯度経度(7G)- 緯度経度(10G)- 緯度経度(18G)- 緯度経度(23G)- 緯度経度(36G)
P.15 基礎知識編３．１０参照

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (6.9GHz,H)- Brightness Temperature (6.9GHz,V)- Brightness Temperature (7.3GHz,H)- Brightness Temperature (7.3GHz,V)- Brightness Temperature (10.7GHz,H)- Brightness Temperature (10.7GHz,V)- Brightness Temperature (18.7GHz,H)- Brightness Temperature (18.7GHz,V)- Brightness Temperature (23.8GHz,H)- Brightness Temperature (23.8GHz,V)- Brightness Temperature (36.5GHz,H)- Brightness Temperature (36.5GHz,V)- Brightness Temperature (89.0GHz-A,H)- Brightness Temperature (89.0GHz-A,V)- Brightness Temperature (89.0GHz-B,H)- Brightness Temperature (89.0GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が float 型の場合
→ AMTK_get_SwathFloat()関数
出力が int 型の場合
→ AMTK_get_SwathInt()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。
22

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
C 言語用 AMTK ヘッダーをインクルードします。
3 #include "AMTK.h"45 // fixed value
6 #define LMT 2200 // limit of NumberOfScans7
標準プロダクトのスキャン数上限は 2200 で充分ですが、
8 int main(int argc, char *argv[]){
準リアルプロダクトを使用する場合は、
9// interface variable
2 周回程度繋がる場合があるので、10 int i,j;// loop variable
LMT=9000 としてください。(標準の 4 パス分程度)
11 int ret;// return status
12 char buf[512]; // text buffer
13 void *vpnt;// pointer to void
AMTK 用インターフェイス変数を宣言します。
14 char *fn;// filename
15 hid_t hnd;// file handle
16
17 // meta data
物理量名
メタデータ用変数
18 char geo[512]; // GeophysicalName
グラニュール ID を宣言します。
19 char gid[512]; // GranuleID
観測開始時刻20 char tm1[512]; // ObservationStartDateTime
赤道通過時刻21 char tm2[512]; // EquatorCrossingDateTime
観測終了時刻22 char tm3[512]; // ObservationEndDateTime
スキャン数
23 int num;// NumberOfScans
24 int ovr;// OverlapScans
オーバーラップスキャン数
25 char prm1[512]; // CoRegistrationParameterA1
相対レジストレーション係数 A1
26 char prm2[512]; // CoRegistrationParameterA2
相対レジストレーション係数 A2:
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
28
29
30
31
:
39
40
:
56
57
:
66
67

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
緯度経度
AM2_COMMON_LATLON ll89a[LMT][AM2_DEF_SNUM_HI]; // latlon for 89a
AM2_COMMON_LATLON ll89b[LMT][AM2_DEF_SNUM_HI]; // latlon for 89b

75
76

float ear_in[AM2_DEF_SNUM_LO][LMT]; // earth incidence
float ear_az[AM2_DEF_SNUM_LO][LMT]; // earth azimuth

float tb06h [LMT][AM2_DEF_SNUM_LO]; // tb for 06h
輝度温度
float tb06v [LMT][AM2_DEF_SNUM_LO]; // tb for 06v

配列データ用変数
を宣言します。

品質フラグ
unsigned char pdq06h [LMT][AM2_DEF_SNUM_LO];
unsigned char pdq06v [LMT][AM2_DEF_SNUM_LO];// pixel data quality for 06h// pixel data quality for 06v

陸海フラグ
unsigned char lof06 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 06
unsigned char lof07 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 07

23

観測入射角
観測方位角

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
88
89
90
91
92
93
94

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

96
97
98
99
100
101
102
103
104
:

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。

146
147
148
149
150
151
152
153
154
155

// read meta: NumberOfScans
vpnt=buf;
ret=AMTK_getMetaDataName(hnd,"NumberOfScans",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: NumberOfScans¥n");printf("amtk status: %d¥n",ret);exit(1);}
メタデータは全て文字として取得されるので、
num=atoi(buf);
数値に変換しておきます。
printf("NumberOfScans: %d¥n",num);

24

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

// read array: scantime
vpnt=st;ret=AMTK_getScanTime(hnd,1,num,(AM2_COMMON_SCANTIME **)&vpnt);
if(ret<0){
printf("AMTK_getScanTime error.¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day, st[0].hour, st[0].minute, st[0].second);◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
214 // read array: latlon for 89a
215 vpnt=ll89a;
216 ret=AMTK_getLatLon(hnd,(AM2_COMMON_LATLON **)&vpnt,1,num,AM2_LATLON_89A);
217 if(ret<0){
218
printf("AMTK_getLatLon error: AM2_LATLON_89A¥n");219
printf("amtk status: %d¥n",ret);220
exit(1);221 }222 printf("latlon89a[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", ll89a[0][0].lat,ll89a[0][0].lon);

25

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度データは float 型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
304
305
306
307
308
309
310
311
312

// read array: tb for 06h
vpnt=tb06h;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_TB06H);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_TB06H¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("tb06h[scan=0][pixel=0]: %9.2f¥n", tb06h[0][0]);26AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 品質フラグデータを読込みます。
L1 品質フラグデータは int 型の 2 次元配列で、
L1 低解像度品質フラグデータのサイズは(ピクセル数*16)×スキャン数です。
L1 高解像度品質フラグデータのサイズは(ピクセル数* 8)×スキャン数です。
出力が int 型なので、AMTK_get_SwathInt()関数を使用します。
ret=AMTK_get_SwathInt(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
464
465
466
467
468
469
470
471

// read array: pixel data quality for low
vpnt=pdqlo;
ret=AMTK_get_SwathInt(hnd,(int **)&vpnt,1,num,AM2_PIX_QUAL_LO);if(ret<0){
printf("AMTK_get_SwathInt error: AM2_PIX_QUAL_LO¥n");printf("amtk status: %d¥n",ret);exit(1);}L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
472
473
474
475
476
477
478
479

for(j=0;j<num;++j){
for(i=0;i<AM2_DEF_SNUM_LO;++i){
pdq06v[j][i]=pdqlo[j][i*16+ 1]*10+pdqlo[j][i*16+ 0];
pdq06h[j][i]=pdqlo[j][i*16+ 3]*10+pdqlo[j][i*16+ 2];
pdq07v[j][i]=pdqlo[j][i*16+ 5]*10+pdqlo[j][i*16+ 4];
pdq07h[j][i]=pdqlo[j][i*16+ 7]*10+pdqlo[j][i*16+ 6];}}

27

AMSR2 データ利用解説文書◇L1B 陸海フラグデータ読込み ※左側の数字は行番号です
陸海フラグデータを読込みます。
陸海フラグデータは int 型の 2 次元配列で、
L1B 低解像度陸海データのサイズはピクセル数×(スキャン数*6)です。
L1B 高解像度陸海データのサイズはピクセル数×(スキャン数*2)です。
出力が int 型なので、AMTK_get_SwathInt()関数を使用します。
506
507
508
509
510
511
512
513

P.14 基礎知識編３．９参照// read array: land ocean flag for low
vpnt=loflo;
ret=AMTK_get_SwathInt(hnd,(int **)&vpnt,1,num,AM2_LOF_LO);if(ret<0){
printf("AMTK_get_SwathInt error: AM2_LOF_LO¥n");printf("amtk status: %d¥n",ret);exit(1);}

陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
514
515
516
517
518
519
520
521
522
523

for(j=0;j<num;++j){
for(i=0;i<AM2_DEF_SNUM_LO;++i){
lof06[j][i]=loflo[num*0+j][i];lof07[j][i]=loflo[num*1+j][i];lof10[j][i]=loflo[num*2+j][i];lof18[j][i]=loflo[num*3+j][i];lof23[j][i]=loflo[num*4+j][i];lof36[j][i]=loflo[num*5+j][i];}}◇観測入射角データ読込み※左側の数字は行番号です

観測入射角データを読込みます。
観測入射角データは float 型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
548
549
550
551
552
553
554
555
556

// read array: earth incidence
vpnt=ear_in;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_EARTH_INC);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_EARTH_INC¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("ear_in[scan=0][pixel=0]: %9.2f¥n",ear_in[0][0]);◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
568 // close
569 ret=AMTK_closeH5(hnd);

28

AMSR2 データ利用解説文書

５．１．２ コンパイル方法(build_readL1B_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL1B_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL1B_amtk.c
16
17 # output filename
18 out=readL1B_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1B_amtk_c.sh
icc -g readL1B_amtk.c -o readL1B_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

29

AMSR2 データ利用解説文書

５．１．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1B_amtk_c GW1AM2_201207261145_055A_L1SGBTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGBTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGBTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans: 1979
limit of NumberOfScans = 2200
OverlapScans: 20
CoRegistrationParameterA1: 6G-1.25000,7G-1.00000,10G1.25000,18G-1.25000,23G-1.25000,36G-1.00000
CoRegistrationParameterA2: 6G-0.00000,7G--0.10000,10G--0.25000,18G-0.00000,23G--0.25000,36G-0.00000
time[scan=0]: 2012/07/26 11:45:43
latlon89a[scan=0][pixel=0]: ( -73.3289, 136.7714)
latlon89b[scan=0][pixel=0]: ( -73.4038, 137.1498)
latlonlm[scan=0][pixel=0]: ( -73.3538, 136.6228)
latlon06[scan=0][pixel=0]: ( -73.3592, 136.6213)
latlon07[scan=0][pixel=0]: ( -73.3497, 136.6429)
latlon10[scan=0][pixel=0]: ( -73.3506, 136.6001)
latlon18[scan=0][pixel=0]: ( -73.3592, 136.6213)
latlon23[scan=0][pixel=0]: ( -73.3506, 136.6001)
latlon36[scan=0][pixel=0]: ( -73.3532, 136.6514)
tb06h[scan=0][pixel=0]:173.28tb06v[scan=0][pixel=0]:208.22
tb07h[scan=0][pixel=0]:173.07
tb07v[scan=0][pixel=0]:207.54
tb10h[scan=0][pixel=0]:170.94
tb10v[scan=0][pixel=0]:204.95
tb18h[scan=0][pixel=0]:164.85
tb18v[scan=0][pixel=0]:199.84
tb23h[scan=0][pixel=0]:163.22
tb23v[scan=0][pixel=0]:196.53tb36h[scan=0][pixel=0]:156.56
tb36v[scan=0][pixel=0]:186.39tb89ah[scan=0][pixel=0]:163.76tb89av[scan=0][pixel=0]:179.27tb89bh[scan=0][pixel=0]:170.60tb89bv[scan=0][pixel=0]:
188.1630

pdq06h[scan=0][pixel=0]):0pdq06v[scan=0][pixel=0]):0pdq07h[scan=0][pixel=0]):0pdq07v[scan=0][pixel=0]):0pdq10h[scan=0][pixel=0]):0pdq10v[scan=0][pixel=0]):0pdq18h[scan=0][pixel=0]):0pdq18v[scan=0][pixel=0]):0pdq23h[scan=0][pixel=0]):0pdq23v[scan=0][pixel=0]):0pdq36h[scan=0][pixel=0]):0pdq36v[scan=0][pixel=0]):0pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
lof06[scan=0][pixel=0]: 100
lof07[scan=0][pixel=0]: 100
lof10[scan=0][pixel=0]: 100
lof18[scan=0][pixel=0]: 100
lof23[scan=0][pixel=0]: 100
lof36[scan=0][pixel=0]: 100
lof89a[scan=0][pixel=0]: 100
lof89b[scan=0][pixel=0]: 100
ear_in[scan=0][pixel=0]:
55.20
ear_az[scan=0][pixel=0]:144.76AMSR2 データ利用解説文書

５．２ L1R データ読込み
５．２．１ サンプルプログラム readL1R_amtk.c 解説
サンプルプログラム readL1R_amtk.c では、L1R データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波用緯度経度を抽出し、内容をテキスト表示します。
このサンプルプログラムでは、格納されている L1R 輝度温度の一部のみ取扱います。L1R 輝度温度データ一覧については、P.14「３．８ L1 リサンプリングデータ」を参照ください。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (res06,6.9GHz,H)- Brightness Temperature (res06,6.9GHz,V)- Brightness Temperature (res06,7.3GHz,H)- Brightness Temperature (res06,7.3GHz,V)- Brightness Temperature (res10,10.7GHz,H)- Brightness Temperature (res10,10.7GHz,V)- Brightness Temperature (res23,18.7GHz,H)- Brightness Temperature (res23,18.7GHz,V)- Brightness Temperature (res23,23.8GHz,H)- Brightness Temperature (res23,23.8GHz,V)- Brightness Temperature (res36,36.5GHz,H)- Brightness Temperature (res36,36.5GHz,V)- Brightness Temperature (res36,89.0GHz,H)- Brightness Temperature (res36,89.0GHz,V)- Brightness Temperature (original,89GHz-A,H)- Brightness Temperature (original,89GHz-A,V)- Brightness Temperature (original,89GHz-B,H)- Brightness Temperature (original,89GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

89G A ホーン緯度経度から抽出するデータ- 低周波用緯度経度
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が float 型の場合
→ AMTK_get_SwathFloat()関数
出力が int 型の場合
→ AMTK_get_SwathInt()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。
31

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
C 言語用 AMTK ヘッダーをインクルードします。
3 #include "AMTK.h"45 // fixed value
6 #define LMT 2200 // limit of NumberOfScans7
標準プロダクトのスキャン数上限は 2200 で充分ですが、
8 int main(int argc, char *argv[]){
準リアルプロダクトを使用する場合は、
9// interface variable
2 周回程度繋がる場合があるので、10 int i,j;// loop variable
LMT=9000 としてください。(標準の 4 パス分程度)
11 int ret;// return status
12 char buf[512]; // text buffer
13 void *vpnt;// pointer to void
AMTK 用インターフェイス変数を宣言します。
14 char *fn;// filename
15 hid_t hnd;// file handle
16
17 // meta data
物理量名
メタデータ用変数
18 char geo[512]; // GeophysicalName
グラニュール ID を宣言します。
19 char gid[512]; // GranuleID
観測開始時刻20 char tm1[512]; // ObservationStartDateTime
赤道通過時刻21 char tm2[512]; // EquatorCrossingDateTime
観測終了時刻22 char tm3[512]; // ObservationEndDateTime
スキャン数
23 int num;// NumberOfScans
24 int ovr;// OverlapScans
オーバーラップスキャン数
25 char prm1[512]; // CoRegistrationParameterA1
相対レジストレーション係数 A1
26 char prm2[512]; // CoRegistrationParameterA2
相対レジストレーション係数 A2
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
28 // array data
29 AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
緯度経度
30 AM2_COMMON_LATLON ll89ar[LMT][AM2_DEF_SNUM_HI]; // latlon for 89a altitude
revised31 AM2_COMMON_LATLON ll89br[LMT][AM2_DEF_SNUM_HI]; // latlon for 89b altitude
revised:
輝度温度
33 float tb06h06 [LMT][AM2_DEF_SNUM_LO]; // tb for 06h, resolution 06G
34 float tb06v06 [LMT][AM2_DEF_SNUM_LO]; // tb for 06v, resolution 06G
配列データ用変数:
品質フラグ
を宣言します。
52 unsigned char pdq06h [LMT][AM2_DEF_SNUM_LO];// pixel data quality for 06h
53 unsigned char pdq06v [LMT][AM2_DEF_SNUM_LO];// pixel data quality for 06v:
陸海フラグ
62 unsigned char lof06 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 06
63 unsigned char lof10 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 10:
69 float ear_in[AM2_DEF_SNUM_LO][LMT]; // earth incidence 観測入射角
70 float ear_az[AM2_DEF_SNUM_LO][LMT]; // earth azimuth

観測方位角

32

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
82
83
84
85
86
87
88

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

90
91
92
93
94
95
96
97
98

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。

140
141
142
143
144
145
146
147
148
149

// read meta: NumberOfScans
vpnt=buf;
ret=AMTK_getMetaDataName(hnd,"NumberOfScans",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: NumberOfScans¥n");printf("amtk status: %d¥n",ret);exit(1);}
メタデータは全て文字として取得されるので、
num=atoi(buf);
数値に変換しておきます。
printf("NumberOfScans: %d¥n",num);

33

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206

// read array: scantime
vpnt=st;ret=AMTK_getScanTime(hnd,1,num,(AM2_COMMON_SCANTIME **)&vpnt);
if(ret<0){
printf("AMTK_getScanTime error.¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day, st[0].hour, st[0].minute, st[0].second);◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
208 // read array: latlon for 89a altitude revised
209 vpnt=ll89ar;
210 ret=AMTK_getLatLon(hnd,(AM2_COMMON_LATLON **)&vpnt,1,num,AM2_LATLON_RS_89A);
211 if(ret<0){212
printf("AMTK_getLatLon error: AM2_LATLON_RS_89A¥n");
213
printf("amtk status: %d¥n",ret);214
exit(1);215 }216 printf("latlon89ar[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", ll89ar[0][0].lat,ll89ar[0][0].lon);

34

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度データは float 型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
238
239
240
241
242
243
244
245
246

// read array: tb for 06h, resolution 06G
vpnt=tb06h06;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_RES06_TB06H);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_RES06_TB06H¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("tb06h06[scan=0][pixel=0]: %9.2f¥n", tb06h06[0][0]);35AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 品質フラグデータを読込みます。
L1 品質フラグデータは int 型の 2 次元配列で、
L1 低解像度品質フラグデータのサイズは(ピクセル数*16)×スキャン数です。
L1 高解像度品質フラグデータのサイズは(ピクセル数* 8)×スキャン数です。
出力が int 型なので、AMTK_get_SwathInt()関数を使用します。
ret=AMTK_get_SwathInt(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
418
419
420
421
422
423
424
425

// read array: pixel data quality for low
vpnt=pdqlo;
ret=AMTK_get_SwathInt(hnd,(int **)&vpnt,1,num,AM2_PIX_QUAL_LO);if(ret<0){
printf("AMTK_get_SwathInt error: AM2_PIX_QUAL_LO¥n");printf("amtk status: %d¥n",ret);exit(1);}L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
426
427
428
429
430
431
432
433

for(j=0;j<num;++j){
for(i=0;i<AM2_DEF_SNUM_LO;++i){
pdq06v[j][i]=pdqlo[j][i*16+ 1]*10+pdqlo[j][i*16+ 0];
pdq06h[j][i]=pdqlo[j][i*16+ 3]*10+pdqlo[j][i*16+ 2];
pdq07v[j][i]=pdqlo[j][i*16+ 5]*10+pdqlo[j][i*16+ 4];
pdq07h[j][i]=pdqlo[j][i*16+ 7]*10+pdqlo[j][i*16+ 6];}}

36

AMSR2 データ利用解説文書◇L1R 陸海フラグデータ読込み ※左側の数字は行番号です
陸海フラグデータを読込みます。
陸海フラグデータは int 型の 2 次元配列で、
L1R 低解像度陸海データのサイズはピクセル数×(スキャン数*4)です。
L1R 高解像度陸海データのサイズはピクセル数×(スキャン数*2)です。
出力が int 型なので、AMTK_get_SwathInt()関数を使用します。
460
461
462
463
464
465
466
467

P.14 基礎知識編３．９参照// read array: land ocean flag for low
vpnt=loflo;
ret=AMTK_get_SwathInt(hnd,(int **)&vpnt,1,num,AM2_LOF_RES_LO);if(ret<0){
printf("AMTK_get_SwathInt error: AM2_LOF_RES_LO¥n");printf("amtk status: %d¥n",ret);exit(1);}

陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
468
469
470
471
472
473
474
475

for(j=0;j<num;++j){
for(i=0;i<AM2_DEF_SNUM_LO;++i){
lof06[j][i]=loflo[num*0+j][i];lof10[j][i]=loflo[num*1+j][i];lof23[j][i]=loflo[num*2+j][i];lof36[j][i]=loflo[num*3+j][i];}}◇観測入射角データ読込み※左側の数字は行番号です

観測入射角データを読込みます。
観測入射角データは float 型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
498
499
500
501
502
503
504
505
506

// read array: earth incidence
vpnt=ear_in;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_EARTH_INC);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_EARTH_INC¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("ear_in[scan=0][pixel=0]: %9.2f¥n",ear_in[0][0]);◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
518 // close
519 ret=AMTK_closeH5(hnd);

37

AMSR2 データ利用解説文書

５．２．２ コンパイル方法(build_readL1R_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL1R_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL1R_amtk.c
16
17 # output filename
18 out=readL1R_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1R_amtk_c.sh
icc -g readL1R_amtk.c -o readL1R_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

38

AMSR2 データ利用解説文書

５．２．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1R_amtk_c GW1AM2_201207261145_055A_L1SGRTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGRTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGRTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans: 1979
limit of NumberOfScans = 2200
OverlapScans: 20
CoRegistrationParameterA1: 6G-0.00000,7G-0.00000,10G0.00000,18G-0.00000,23G-0.00000,36G-0.00000
CoRegistrationParameterA2: 6G-0.00000,7G-0.00000,10G0.00000,18G-0.00000,23G-0.00000,36G-0.00000
time[scan=0]: 2012/07/26 11:45:43
latlon89ar[scan=0][pixel=0]: ( -73.3581, 136.8432)
latlon89br[scan=0][pixel=0]: ( -73.4328, 137.2216)
latlonlr[scan=0][pixel=0]: ( -73.3581, 136.8432)
tb06h06[scan=0][pixel=0]:173.41
tb06v06[scan=0][pixel=0]:
208.09tb07h06[scan=0][pixel=0]:173.07
tb07v06[scan=0][pixel=0]:207.11
tb10h10[scan=0][pixel=0]:170.40tb10v10[scan=0][pixel=0]:204.58tb18h23[scan=0][pixel=0]:165.83
tb18v23[scan=0][pixel=0]:199.41
tb23h23[scan=0][pixel=0]:163.55
tb23v23[scan=0][pixel=0]:
195.90tb36h36[scan=0][pixel=0]:153.55
tb36v36[scan=0][pixel=0]:183.95tb89h36[scan=0][pixel=0]:163.86
tb89v36[scan=0][pixel=0]:
181.05tb89ah[scan=0][pixel=0]:163.76tb89av[scan=0][pixel=0]:179.27tb89bh[scan=0][pixel=0]:170.60tb89bv[scan=0][pixel=0]:
188.1639

pdq06h[scan=0][pixel=0]):0pdq06v[scan=0][pixel=0]):0pdq07h[scan=0][pixel=0]):0pdq07v[scan=0][pixel=0]):0pdq10h[scan=0][pixel=0]):0pdq10v[scan=0][pixel=0]):0pdq18h[scan=0][pixel=0]):0pdq18v[scan=0][pixel=0]):0pdq23h[scan=0][pixel=0]):0pdq23v[scan=0][pixel=0]):0pdq36h[scan=0][pixel=0]):0pdq36v[scan=0][pixel=0]):0pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
lof06[scan=0][pixel=0]: 100
lof10[scan=0][pixel=0]: 100
lof23[scan=0][pixel=0]: 100
lof36[scan=0][pixel=0]: 100
lof89a[scan=0][pixel=0]: 100
lof89b[scan=0][pixel=0]: 100
ear_in[scan=0][pixel=0]:
55.20
ear_az[scan=0][pixel=0]:144.76AMSR2 データ利用解説文書

５．３ L2 低解像度データ読込み
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)が L2 低解像度です。降水量(PRC)は L2 高解像度を参照ください。
５．３．１ サンプルプログラム readL2L_amtk.c 解説
サンプルプログラム readL2L_amtk.c では、L2 低解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point* Longitude of Observation Point* Geophysical Data
* Pixel Data Quality
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合→ AMTK_getLatLon()関数
出力が float 型の場合
→ AMTK_get_SwathFloat()関数
出力が unsigned char 型の場合 → AMTK_get_SwathUChar()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

40

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
C 言語用 AMTK ヘッダーをインクルードします。
4 #include "AMTK.h"5
6 // fixed value
7 #define LMT 2200 // limit of NumberOfScans:
標準プロダクトのスキャン数上限は 2200 で充分ですが、
10 int main(int argc, char *argv[]){
準リアルプロダクトを使用する場合は、
11 // interface variable
2 周回程度繋がる場合があるので、12 int i,j;// loop variable
LMT=9000 としてください。(標準の 4 パス分程度)
13 int ret;// return status
14 char buf[512]; // text buffer
15 void *vpnt;// pointer to void
AMTK 用インターフェイス変数を宣言します。
16 char *fn;// filename
17 hid_t hnd;// file handle
18
19 // meta data
物理量名
メタデータ用変数
20 char geo[512]; // GeophysicalName
グラニュール ID を宣言します。
21 char gid[512]; // GranuleID
観測開始時刻22 char tm1[512]; // ObservationStartDateTime
赤道通過時刻23 char tm2[512]; // EquatorCrossingDateTime
観測終了時刻24 char tm3[512]; // ObservationEndDateTime
スキャン数
25 int num;// NumberOfScans
26 int ovr;// OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
28
29
30

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
AM2_COMMON_LATLON ll[LMT][AM2_DEF_SNUM_LO]; // latlon 緯度経度

3132

float geo1[LMT][AM2_DEF_SNUM_LO]; // geophysical data layer 1
float geo2[LMT][AM2_DEF_SNUM_LO]; // geophysical data layer 2 物理量

33
34
35

unsigned char pdq1[LMT][AM2_DEF_SNUM_LO]; // pixel data quality layer 1
unsigned char pdq2[LMT][AM2_DEF_SNUM_LO]; // pixel data quality layer 2
unsigned char pdqtmp[LMT*2][AM2_DEF_SNUM_LO]; // pixel data quality temporary

品質フラグ

配列データ用変数
を宣言します。

41

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
47
48
49
50
51
52
53

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

55
56
57
58
59
60
61
62
63

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。

118
119
120
121
122
123
124
125
126
127

// read meta: NumberOfScans
vpnt=buf;
ret=AMTK_getMetaDataName(hnd,"NumberOfScans",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: NumberOfScans¥n");printf("amtk status: %d¥n",ret);exit(1);}
メタデータは全て文字として取得されるので、
num=atoi(buf);
数値に変換しておきます。
printf("NumberOfScans: %d¥n",num);

42

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164

// read array: scantime
vpnt=st;ret=AMTK_getScanTime(hnd,1,num,(AM2_COMMON_SCANTIME **)&vpnt);
if(ret<0){
printf("AMTK_getScanTime error.¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day, st[0].hour, st[0].minute, st[0].second);◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
166 // read array: latlon
167 vpnt=ll;
168 ret=AMTK_getLatLon(hnd,(AM2_COMMON_LATLON **)&vpnt,1,num,AM2_LATLON_L2_LO);
169 if(ret<0){170
printf("AMTK_getLatLon error: AM2_LATLON_L2_LO¥n");
171
printf("amtk status: %d¥n",ret);172
exit(1);173 }174 printf("latlon[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", ll[0][0].lat,ll[0][0].lon);

43

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量データは float 型の 3 次元配列で、サイズはレイヤ数×ピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。

ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
176
177
178
179
180
181
182
183
184
185
186

// read array: geophysical data for 1 layer
if(strncmp(gid+29,"SND",3)!=0 && strncmp(gid+29,"SST",3)!=0 ){vpnt=geo1;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_SWATH_GEO1);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_SWATH_GEO1¥n");printf("amtk status: %d¥n",ret);exit(1);}}2 層ある場合は、アクセスラベルを変更して読み分けます。
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205

// read array: geophysical data for 2 layer
if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){// layer 1
vpnt=geo1;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_SWATH_GEO1);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_SWATH_GEO1¥n");printf("amtk status: %d¥n",ret);exit(1);}// layer 2
vpnt=geo2;
ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_SWATH_GEO2);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_SWATH_GEO2¥n");printf("amtk status: %d¥n",ret);exit(1);}}44

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
L2 品質フラグデータは unsigned char 型の 3 次元配列で、サイズはピクセル数×スキャン数×レイヤ数です。
出力が unsigned char 型なので、AMTK_get_SwathUChar()関数を使用します。
積雪深(SND)、海面水温(SST)は品質フラグが 2 層あるのでこの 2 つとそれ以外で処理を分けています。
ret=AMTK_get_SwathUChar(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
207
208
209
210
211
212
213
214
215
216
217

// read array: pixel data quality for 1 layer
if(strncmp(gid+29,"SND",3)!=0 && strncmp(gid+29,"SST",3)!=0 ){vpnt=pdq1;
ret=AMTK_get_SwathUChar(hnd,(unsigned char **)&vpnt,1,num,AM2_PIX_QUAL);
if(ret<0){
printf("AMTK_get_SwathUChar error: AM2_PIX_QUAL¥n");printf("amtk status: %d¥n",ret);exit(1);}}2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235

// read array: pixel data quality for 2 layer
if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){// readvpnt=pdqtmp;
ret=AMTK_get_SwathUChar(hnd,(unsigned char **)&vpnt,1,num,AM2_PIX_QUAL);
if(ret<0){
printf("AMTK_get_SwathUChar error: AM2_PIX_QUAL¥n");printf("amtk status: %d¥n",ret);exit(1);}// separate
for(j=0;j<num;++j){
for(i=0;i<AM2_DEF_SNUM_LO;++i){
pdq1[j][i]=pdqtmp[num*0+j][i];pdq2[j][i]=pdqtmp[num*1+j][i];}}}L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
261 // close
262 ret=AMTK_closeH5(hnd);

45

AMSR2 データ利用解説文書

５．３．２ コンパイル方法(build_readL2L_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL2L_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL2L_amtk.c
16
17 # output filename
18 out=readL2L_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2L_amtk_c.sh
icc -g readL2L_amtk.c -o readL2L_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

46

AMSR2 データ利用解説文書

５．３．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2L_amtk_c GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_201303011809_125D_L2SGCLWLA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans: 1972
limit of NumberOfScans = 2200
OverlapScans: 0time[scan=0]: 2013/03/01 18:09:10
latlon[scan=0][pixel=0]: ( 84.4574, -78.1076)
geo1[scan=0][pixel=0]: -32767.000 [Kg/m2] (PDQ:112)

47

AMSR2 データ利用解説文書

５．４ L2 高解像度データ読込み
降水量(PRC)が L2 高解像度です。
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)は L2 低解像度を参照ください。
５．４．１ サンプルプログラム readL2H_amtk.c 解説
サンプルプログラム readL2H_amtk.c では、L2 高解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B* Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Geophysical Data for 89A- Geophysical Data for 89B* Pixel Data Quality for 89A- Pixel Data Quality for 89B
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合→ AMTK_getLatLon()関数
出力が float 型の場合
→ AMTK_get_SwathFloat()関数
出力が unsigned char 型の場合 → AMTK_get_SwathUChar()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

48

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
C 言語用 AMTK ヘッダーをインクルードします。
4 #include "AMTK.h"5
6 // fixed value
7 #define LMT 2200 // limit of NumberOfScans:
標準プロダクトのスキャン数上限は 2200 で充分ですが、
10 int main(int argc, char *argv[]){
準リアルプロダクトを使用する場合は、
11 // interface variable
2 周回程度繋がる場合があるので、12 int i,j;// loop variable
LMT=9000 としてください。(標準の 4 パス分程度)
13 int ret;// return status
14 char buf[512]; // text buffer
15 void *vpnt;// pointer to void
AMTK 用インターフェイス変数を宣言します。
16 char *fn;// filename
17 hid_t hnd;// file handle
18
19 // meta data
物理量名
メタデータ用変数
20 char geo[512]; // GeophysicalName
グラニュール ID を宣言します。
21 char gid[512]; // GranuleID
観測開始時刻22 char tm1[512]; // ObservationStartDateTime
赤道通過時刻23 char tm2[512]; // EquatorCrossingDateTime
観測終了時刻24 char tm3[512]; // ObservationEndDateTime
スキャン数
25 int num;// NumberOfScans
26 int ovr;// OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
28
29
30
31
32
33
34
35

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
AM2_COMMON_LATLON ll89a[LMT][AM2_DEF_SNUM_HI];
AM2_COMMON_LATLON ll89b[LMT][AM2_DEF_SNUM_HI]; 緯度経度
float geo1_89a[LMT][AM2_DEF_SNUM_HI];
物理量
float geo1_89b[LMT][AM2_DEF_SNUM_HI];
unsigned char pdq1_89a[LMT][AM2_DEF_SNUM_HI];
unsigned char pdq1_89b[LMT][AM2_DEF_SNUM_HI]; 品質フラグ
配列データ用変数
を宣言します。

49

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
47
48
49
50
51
52
53

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

55
56
57
58
59
60
61
62
63

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。

111
112
113
114
115
116
117
118
119
120

// read meta: NumberOfScans
vpnt=buf;
ret=AMTK_getMetaDataName(hnd,"NumberOfScans",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: NumberOfScans¥n");printf("amtk status: %d¥n",ret);exit(1);}
メタデータは全て文字として取得されるので、
num=atoi(buf);
数値に変換しておきます。
printf("NumberOfScans: %d¥n",num);

50

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

// read array: scantime
vpnt=st;ret=AMTK_getScanTime(hnd,1,num,(AM2_COMMON_SCANTIME **)&vpnt);
if(ret<0){
printf("AMTK_getScanTime error.¥n");printf("amtk status: %d¥n",ret);exit(1);}
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day, st[0].hour, st[0].minute, st[0].second);◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
159 // read array: latlon for 89a
160 vpnt=ll89a;
161 ret=AMTK_getLatLon(hnd,(AM2_COMMON_LATLON **)&vpnt,1,num,AM2_LATLON_L2_89A);
162 if(ret<0){163
printf("AMTK_getLatLon error: AM2_LATLON_L2_89A¥n");164
printf("amtk status: %d¥n",ret);165
exit(1);166 }167 printf("latlon89a[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", ll89a[0][0].lat,ll89a[0][0].lon);

51

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量データは float 型の 3 次元配列で、サイズはレイヤ数×ピクセル数×スキャン数です。
出力が float 型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
179
180
181
182
183
184
185
186

// read array: geophysical data for 1 layer for 89a
vpnt=geo1_89a;ret=AMTK_get_SwathFloat(hnd,(float **)&vpnt,1,num,AM2_SWATHA_GEO1);
if(ret<0){
printf("AMTK_get_SwathFloat error: AM2_SWATHA_GEO1¥n");printf("amtk status: %d¥n",ret);exit(1);}◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
L2 品質フラグデータは unsigned char 型の 3 次元配列で、サイズはピクセル数×スキャン数×レイヤ数です。
出力が unsigned char 型なので、AMTK_get_SwathUChar()関数を使用します。
ret=AMTK_get_SwathUChar(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
197
198
199
200
201
202
203
204

// read array: pixel data quality for 1 layer for 89a
vpnt=pdq1_89a;ret=AMTK_get_SwathUChar(hnd,(unsigned char **)&vpnt,1,num,AM2_PIX_QUAL_A);
if(ret<0){
printf("AMTK_get_SwathUChar error: AM2_PIX_QUAL_A¥n");printf("amtk status: %d¥n",ret);exit(1);}L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
261 // close
262 ret=AMTK_closeH5(hnd);

52

AMSR2 データ利用解説文書

５．４．２ コンパイル方法(build_readL2H_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL2H_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL2H_amtk.c
16
17 # output filename
18 out=readL2H_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2H_amtk_c.sh
icc -g readL2H_amtk.c -o readL2H_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

53

AMSR2 データ利用解説文書

５．４．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2H_amtk_c GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
GeophysicalName: Precipitation
GranuleID: GW1AM2_201303011809_125D_L2SGPRCHA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans: 1972
limit of NumberOfScans = 2200
OverlapScans: 0time[scan=0]: 2013/03/01 18:09:10
latlon89a[scan=0][pixel=0]: ( 84.4188, -77.9502)
latlon89b[scan=0][pixel=0]: ( 84.3305, -78.8925)
geo1_89a[scan=0][pixel=0]: -32767.0 [mm/h] (PDQ: 16)
geo1_89b[scan=0][pixel=0]: -32767.0 [mm/h] (PDQ: 16)

54

AMSR2 データ利用解説文書

５．５ L3 輝度温度データ読込み
５．５．１ サンプルプログラム readL3B_amtk.c 解説
サンプルプログラム readL3B_amtk.c では、L3 輝度温度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Brightness Temperature (H)- Brightness Temperature (V)以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、AMTK_get_GridFloat()関数を使用します。
読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

55

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
C 言語用 AMTK ヘッダーをインクルードします。
4 #include "AMTK.h":
9 int main(int argc, char *argv[]){
10 // interface variable
11 int i,j;// loop variable
12 int ret;// return status
13 char buf[512]; // text buffer
14 void *vpnt;// pointer to void
15 char *fn;// filename
16 hid_t hnd;// file handle
17 int siz[3];// array size
AMTK 用インターフェイス変数を宣言します。
18 int x;// grid size x
19 int y;// grid size y:
メタデータ用変数
27 // meta data
物理量名28 char geo[512]; // GeophysicalName
を宣言します。
グラニュール ID
29 char gid[512]; // GranuleID30
31 // array data
配列データ用変数
32 float *tbH; // brightness temperature for horizontal
輝度温度
33 float *tbV; // brightness temperature for verticalを宣言します。
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
45
46
47
48
49
50
51

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}56

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

53
54
55
56
57
58
59
60
61

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
配列サイズの取得には、AMTK_getDimSize()関数を使用します。
ret=AMTK_getDimSize(hnd,label,siz)
hnd: ファイルハンドル値を指定します
label: アクセスラベルを指定します
siz: [戻り値]配列サイズ
ret: [戻り値]失敗の場合は負の値
86
87
88
89
90
91
92
93
94
95
96

// get grid size
ret=AMTK_getDimSize(hnd,AM2_GRID_TBH,siz);if(ret<0){
printf("AMTK_getDimSize error: AM2_GRID_TBH¥n");printf("amtk status: %d¥n",ret);exit(1);}x=siz[1];y=siz[0];printf("grid size x: %d¥n", x);
printf("grid size y: %d¥n", y);
メモリ領域を確保します。

98
99
100
101
102
103

// memory allocate
tbH=malloc(sizeof(float)*x*y);if(tbH==NULL){
printf("memory allocate error: tbH¥n");exit(1);}57

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
ret=AMTK_get_GridFloat(hnd,out,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますlabel: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
110
111
112
113
114
115
116
117

// read horizontal
vpnt=tbH;
ret=AMTK_get_GridFloat(hnd,(float **)&vpnt,AM2_GRID_TBH);
if(ret<0){
printf("AMTK_get_GridFloat error: AM2_GRID_TBH¥n");printf("amtk status: %d¥n",ret);exit(1);}◇終了処理 ※左側の数字は行番号です
メモリを開放します。
212 // memory free
213 free(tbH);
214 free(tbV);
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
216217// close
ret=AMTK_closeH5(hnd);58

AMSR2 データ利用解説文書

５．５．２ コンパイル方法(build_readL3B_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL3B_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL3B_amtk.c
16
17 # output filename
18 out=readL3B_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3B_amtk_c.sh
icc -g readL3B_amtk.c -o readL3B_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

59

AMSR2 データ利用解説文書

５．５．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3B_amtk_c GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
GeophysicalName: Brightness Temperature (6GHz)
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110
grid size x: 1440
grid size y: 720
ASCII ART OF HORIZONTAL BRIGHTNESS TEMPERATURE (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||411233344443444444444444444444444444444444444444444444443344322222244444||111134311113444444444444444444444444444444444444444444444444434233343111||124523445555555544444444444444443431234344414455544444444444211211111111||154544444444444444444444444544111111111111111113554444444442221111111112||412242554414444544444445341131111111111111111111455544445511111111111115||444444444424445554455554411111111111111111111111155555351111111111111124||444444442444111555155531111111111111111112111111111551511411111111111444||555555555551111121111311121111111111111111111111111111141554111111111155||115555555111111111115155311111111111111111111111111111114555554111111111||111555553111111111111111421111312111111111111111111111111555555551111111||111555521511111111111111455555111111111111111111111111111145555521111111||111155511111111111111113555555511111111111111111111111111154552111111111||111111111111111111111111111111111113111111111111111111111155111111111111||111111111111111111111111111111111111111111111111111111111351111111111111||111111111111111111111111111111111111111111111111111111111111111111111111||343323444333342434334344444444433433211111111111111111111344444441111133||333333333333333333333333333333334333333322222333333344334433333333333333|+------------------------------------------------------------------------+

60

AMSR2 データ利用解説文書

ASCII ART OF VERTICAL BRIGHTNESS TEMPERATURE (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||433344444444455455444444444444444444444454444444444444444444433333244545||333345433334554554444544444444444444444444545444444444444445544344344333||335534455555555555554555445455554443345455434555554444554444333333333333||355555555555555555455555555554333333333333333334555555555543333333333333||433343555535555555555555453343333333333333333333555555555533333333333335||555555555545555555555555533333333333333333333333355555453333333333333335||555555553555333555355543333333333333333333333333333553533433333333333555||655566655553333333333433343333333333333333333333333333353555333333333355||335555556333333333335355433333333333333333333333333333335555554333333333||333555554333333333333333433333433333333333333333333333333555555563333333||333555533533333333333333566665333333333333333333333333333355555543333333||333365533333333333333334666666533333333333333333333333333355554333333333||333333333333333333333333333333333334333333333333333333333355333333333333||333333333333333333333333333333333333333333333333333333333453333333333333||333333333333333333333333333333333333333333333333333333333333333333333333||444334444444443444444444444444444444333333333333333333333444555543333344||444444443344444444443333443444444444444444334444444444444444444444444444|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[1]: 50-100K[2]:100-150K[3]:150-200K[4]:200-250K[5]:250-300K[6]:300-350K[*]:other61

AMSR2 データ利用解説文書

５．６ L3 物理量データ読込み
５．６．１ サンプルプログラム readL3G_amtk.c 解説
サンプルプログラム readL3G_amtk.c では、L3 物理量データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Geophysical Data

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、AMTK_get_GridFloat()関数を使用します。
読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

62

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
C 言語用 AMTK ヘッダーをインクルードします。
4 #include "AMTK.h":
9 int main(int argc, char *argv[]){
10 // interface variable
11 int i,j;// loop variable
12 int ret;// return status
13 char buf[512]; // text buffer
14 void *vpnt;// pointer to void
15 char *fn;// filename
16 hid_t hnd;// file handle
17 int siz[3];// array size
AMTK 用インターフェイス変数を宣言します。
18 int x;// grid size x
19 int y;// grid size y:
29 // meta data
メタデータ用変数
物理量名
30 char geo[512]; // GeophysicalName
を宣言します。
31 char gid[512]; // GranuleID
グラニュール ID
32
33 // array data
配列データ用変数
34 float *geo1; // geophysical data layer 1
物理量
35 float *geo2; // geophysical data layer 2を宣言します。
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
47
48
49
50
51
52
53

// open
hnd=AMTK_openH5(fn);if(hnd<0){
printf("AMTK_openH5 error: %s¥n", fn);
printf("amtk status: %d¥n", hnd);exit(1);}63

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
AMTK では出力変数はすべてポインタへのポインタとして渡します。
まずポインタを作ってから、そのポインタを渡します。

55
56
57
58
59
60
61
62
63

// read meta: GeophysicalName
vpnt=geo;
ret=AMTK_getMetaDataName(hnd,"GeophysicalName",(char **)&vpnt);
if(ret<0){
printf("AMTK_getMetaDataName error: GeophysicalName¥n");printf("amtk status: %d¥n",ret);
コンパイラからの警告を避けるために、exit(1);
void ポインタを適切な型にキャストします。
}
printf("GeophysicalName: %s¥n",geo);◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
配列サイズの取得には、AMTK_getDimSize()関数を使用します。
ret=AMTK_getDimSize(hnd,label,siz)
hnd: ファイルハンドル値を指定します
label: アクセスラベルを指定します
siz: [戻り値]配列サイズ
ret: [戻り値]失敗の場合は負の値
89
90
91
92
93
94
95
96
97
98
99

// get grid size
ret=AMTK_getDimSize(hnd,AM2_GRID_GEO1,siz);if(ret<0){
printf("AMTK_getDimSize error: AM2_GRID_GEO1¥n");printf("amtk status: %d¥n",ret);exit(1);}x=siz[1];y=siz[0];printf("grid size x: %d¥n", x);
printf("grid size y: %d¥n", y);
メモリ領域を確保します。

101
102
103
104
105
106

// memory allocate layer 1
geo1=malloc(sizeof(float)*x*y);if(geo1==NULL){
printf("memory allocate error: geo1¥n");exit(1);}64

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
ret=AMTK_get_GridFloat(hnd,out,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますlabel: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
117
118
119
120
121
122
123
124
125

// read layer 1
vpnt=geo1;
ret=AMTK_get_GridFloat(hnd,(float **)&vpnt,AM2_GRID_GEO1);
if(ret<0){
printf("AMTK_get_GridFloat error: AM2_GRID_GEO1¥n");printf("amtk status: %d¥n",ret);exit(1);}2 層ある場合は、アクセスラベルを変更して読み分けます。
126
127
128
129
130
131
132
133
134
135

// read layer 2
if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){vpnt=geo2;
ret=AMTK_get_GridFloat(hnd,(float **)&vpnt,AM2_GRID_GEO2);
if(ret<0){
printf("AMTK_get_GridFloat error: AM2_GRID_GEO2¥n");printf("amtk status: %d¥n",ret);exit(1);}}◇終了処理 ※左側の数字は行番号です
メモリを開放します。
317 // memory free
318 free(geo1);
319 if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){320
free(geo2);
321 }ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
323324// close
ret=AMTK_closeH5(hnd);

65

AMSR2 データ利用解説文書

５．６．２ コンパイル方法(build_readL3G_amtk_c.sh 解説)
コンパイルに使用するスクリプト build_readL3G_amtk_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
11 # compiler
12 cc=icc
13
14 # source filename
15 csrc=readL3G_amtk.c
16
17 # output filename
18 out=readL3G_amtk_c
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$cc -g $csrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3G_amtk_c.sh
icc -g readL3G_amtk.c -o readL3G_amtk_c-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

66

AMSR2 データ利用解説文書

５．６．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3G_amtk_c GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000
grid size x: 1440
grid size y: 720
ASCII ART OF GEOPHYSICAL DATA LAYER #1 (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||#21#####################################################################||2212###1113##########################################################222||1##################################11######3################011#42223322||2#############################00101112413333233###############343413131#||#20#######2###############00#1223452344213211120##########3355421131121#||#########################4#3222223232100110111110#######14*41111201111##||########0###000###0####111111112101201110*131121100##1#11#01211110100###||###########1011111111#211#11111210011121333223224321000#1###1111000000##||11#######00010122125#3###1#12232321100010020110001011122#######222321111||000######122131112311112#01112#11312212323110100000000110########1001110||100####32#12111141111000######2232322421212441331110011010######11111100||1000###1211232211251100########131112232110121313122011010#####231111001||11131212231110111111211111110012102#1231221223311213111021##011124223242||*33222511232222222223223331421022422322211024222222122113##0111421221132||101122112221111222111111111222312232232331243321212323221223312232222111||####################################311122122221112111221########21221##||########################################################################|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[0]: 0.000 - 0.030 Kg/m2[1]: 0.030 - 0.060 Kg/m2[2]: 0.060 - 0.090 Kg/m2[3]: 0.090 - 0.120 Kg/m2[4]: 0.120 - 0.150 Kg/m2[5]: 0.150 - 0.180 Kg/m2[*]:other67

AMSR2 データ利用解説文書

６．AMTK 編(FORTRAN90)
赤文字の解説はサンプルプログラムについて説明しています。
青文字の解説は関数リファレンスまたは衛星基礎知識について説明しています。

６．１ L1B データ読込み
６．１．１ サンプルプログラム readL1B_amtk.f 解説
サンプルプログラム readL1B_amtk.f では、L1B データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波緯度経度を算出し、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

89G A ホーン緯度経度から算出するデータ- 緯度経度(低周波平均)- 緯度経度(6G)- 緯度経度(7G)- 緯度経度(10G)- 緯度経度(18G)- 緯度経度(23G)- 緯度経度(36G)
P.15 基礎知識編３．１０参照

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (6.9GHz,H)- Brightness Temperature (6.9GHz,V)- Brightness Temperature (7.3GHz,H)- Brightness Temperature (7.3GHz,V)- Brightness Temperature (10.7GHz,H)- Brightness Temperature (10.7GHz,V)- Brightness Temperature (18.7GHz,H)- Brightness Temperature (18.7GHz,V)- Brightness Temperature (23.8GHz,H)- Brightness Temperature (23.8GHz,V)- Brightness Temperature (36.5GHz,H)- Brightness Temperature (36.5GHz,V)- Brightness Temperature (89.0GHz-A,H)- Brightness Temperature (89.0GHz-A,V)- Brightness Temperature (89.0GHz-B,H)- Brightness Temperature (89.0GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が real(4)型の場合→ AMTK_get_SwathFloat()関数
出力が integer(4)型の場合→ AMTK_get_SwathInt()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。
68

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main2
implicit none
3 C include
4
include 'AMTK_f.h':

FORTRAN 用 AMTK ヘッダーをインクルードします。
標準プロダクトのスキャン数上限は 2200 で充分ですが、
準リアルプロダクトを使用する場合は、
2 周回程度繋がる場合があるので、
LMT=9000 としてください。(標準の 4 パス分程度)

7 C fixed value
8
integer(4),parameter::LMT=2200 ! limit of NumberOfScans
9 C interface variable
10
integer(4) i,j! loop variable11
integer(4) ret! return status12
character(len=512) buf ! text buffer
AMTK 用インターフェイス変数を宣言します。
13
character(len=512) fn ! filename
14
integer(4) hnd! file handle
15 C meta data
物理量名
メタデータ用変数
16
character(len=512) geo ! GeophysicalName
グラニュール ID
17
character(len=512) gid ! GranuleIDを宣言します。
観測開始時刻18
character(len=512) tm1 ! ObservationStartDateTime
赤道通過時刻19
character(len=512) tm2 ! EquatorCrossingDateTime
観測終了時刻20
character(len=512) tm3 ! ObservationEndDateTime
21
integer(4) num! NumberOfScans
スキャン数22
integer(4) ovr! OverlapScans
オーバーラップスキャン数
23
character(len=512) prm1 ! CoRegistrationParameterA1
相対レジストレーション係数 A124character(len=512) prm2 ! CoRegistrationParameterA2
相対レジストレーション係数 A2:
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
25 C array data26
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime 時刻
緯度経度
27
type(AM2_COMMON_LATLON) ll89a(AM2_DEF_SNUM_HI,LMT) ! latlon for 89a
28
type(AM2_COMMON_LATLON) ll89b(AM2_DEF_SNUM_HI,LMT) ! latlon for 89b:
36
real(4) tb06h(AM2_DEF_SNUM_LO,LMT) ! tb for 06h 輝度温度
37
real(4) tb06v(AM2_DEF_SNUM_LO,LMT) ! tb for 06v
:
品質フラグ
53
integer(1) pdq06h(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06h
54
integer(1) pdq06v(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06v
:
陸海フラグ
63
integer(1) lof06(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 06
64
integer(1) lof07(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 07:72
real(4) ear_in(AM2_DEF_SNUM_LO,LMT) ! earth incidence 観測入射角73real(4) ear_az(AM2_DEF_SNUM_LO,LMT) ! earth azimuth
観測方位角
配列データ用変数
を宣言します。

69

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
82C open83
hnd=AMTK_openH5(fn)84
if(hnd.lt.0)then85
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
86write(*,'(a,i12)')'amtk status: ',hnd87call exit(1)
88
endif

◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
89C read meta: GeophysicalName
90
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)
91
if(ret.lt.0)then92
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'93write(*,'(a,i12)')'amtk status: ',ret94
call exit(1)
95
endif
96
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))

メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。
132C read meta: NumberOfScans133
ret=AMTK_getMetaDataName(hnd,'NumberOfScans',buf)
134
if(ret.lt.0)then135
write(*,'(a)')'AMTK_getMetaDataName error: NumberOfScans'136
write(*,'(a,i12)')'amtk status: ',ret137
call exit(1)メタデータは全て文字として取得されるので、
138
endif
数値に変換しておきます。
139
read(buf(1:ret),*)num
140
write(*,'(a,i12)')'NumberOfScans: ',num

70

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
177C read array: scantime
178
ret=AMTK_getScanTime(hnd,1,num,st)179
if(ret.lt.0)then180
write(*,'(a)')'AMTK_getScanTime error.'181
write(*,'(a,i12)')'amtk status: ',ret
182
call exit(1)
183
endif
184
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
185+'time(scan=1): '186+,st(1)%year
187+,st(1)%month188+,st(1)%day189+,st(1)%hour
190+,st(1)%minute191+,st(1)%second◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
192 C read array: latlon for 89a
193
ret=AMTK_getLatLon(hnd,ll89a,1,num,AM2_LATLON_89A)
194
if(ret.lt.0)then
195
write(*,'(a)')'AMTK_getLatLon error: AM2_LATLON_89A'
196
write(*,'(a,i12)')'amtk status: ',ret197
call exit(1)
198
endif
199
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon89a(pixel=1,scan=1): '200+,ll89a(1,1)%lat,ll89a(1,1)%lon

71

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度データは real(4)型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
273 C read array: tb for 06h274
ret=AMTK_get_SwathFloat(hnd,tb06h,1,num,AM2_TB06H)
275
if(ret.lt.0)then
276
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_TB06H'
277
write(*,'(a,i12)')'amtk status: ',ret278
call exit(1)
279
endif
280
write(*,'(a,f9.2)')'tb06h(pixel=1,scan=1): ',tb06h(1,1)

72

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 品質フラグデータを読込みます。
L1 品質フラグデータは integer(4)型の 2 次元配列で、
L1 低解像度品質フラグデータのサイズは(ピクセル数*16)×スキャン数です。
L1 高解像度品質フラグデータのサイズは(ピクセル数* 8)×スキャン数です。
出力が integer(4)型なので、AMTK_get_SwathInt()関数を使用します。
ret=AMTK_get_SwathInt(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
401 C read array: pixel data quality for low
402
ret=AMTK_get_SwathInt(hnd,pdqlo,1,num,AM2_PIX_QUAL_LO)403
if(ret.lt.0)then
404
write(*,'(a)')'AMTK_get_SwathInt error: AM2_PIX_QUAL_LO'
405
write(*,'(a,i12)')'amtk status: ',ret406
call exit(1)
407
endif

L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。

408
409
410
411
412
413
414
415

do j=1,num
do i=1,AM2_DEF_SNUM_LO
pdq06v(i,j)=pdqlo((i-1)*16+ 2,j)*10+pdqlo((i-1)*16+ 1,j)
pdq06h(i,j)=pdqlo((i-1)*16+ 4,j)*10+pdqlo((i-1)*16+ 3,j)
pdq07v(i,j)=pdqlo((i-1)*16+ 6,j)*10+pdqlo((i-1)*16+ 5,j)
pdq07h(i,j)=pdqlo((i-1)*16+ 8,j)*10+pdqlo((i-1)*16+ 7,j)
enddo
enddo

73

AMSR2 データ利用解説文書◇L1B 陸海フラグデータ読込み ※左側の数字は行番号です
陸海フラグデータを読込みます。
陸海フラグデータは integer(4)型の 2 次元配列で、
L1B 低解像度陸海データのサイズはピクセル数×(スキャン数*6)です。
L1B 高解像度陸海データのサイズはピクセル数×(スキャン数*2)です。
出力が integer(4)型なので、AMTK_get_SwathInt()関数を使用します。

P.14 基礎知識編３．９参照

439 C read array: land ocean flag for low
440
ret=AMTK_get_SwathInt(hnd,loflo,1,num,AM2_LOF_LO)
441
if(ret.lt.0)then442
write(*,'(a)')'AMTK_get_SwathInt error: AM2_LOF_LO'
443
write(*,'(a,i12)')'amtk status: ',ret444
call exit(1)
445
endif
陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
446
do j=1,num
447
do i=1,AM2_DEF_SNUM_LO
448
lof06(i,j)=loflo(i,num*0+j)449
lof07(i,j)=loflo(i,num*1+j)450
lof10(i,j)=loflo(i,num*2+j)451
lof18(i,j)=loflo(i,num*3+j)452
lof23(i,j)=loflo(i,num*4+j)453
lof36(i,j)=loflo(i,num*5+j)
454
enddo
455
enddo

◇観測入射角データ読込み※左側の数字は行番号です

観測入射角データを読込みます。
観測入射角データは real(4)型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
477 C read array: earth incidence478
ret=AMTK_get_SwathFloat(hnd,ear_in,1,num,AM2_EARTH_INC)479
if(ret.lt.0)then
480
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_EARTH_INC'
481
write(*,'(a,i12)')'amtk status: ',ret482
call exit(1)
483
endif
484
write(*,'(a,f9.2)')'ear_in(pixel=1,scan=1): ',ear_in(1,1)◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
493 C close494
ret=AMTK_closeH5(hnd)74

AMSR2 データ利用解説文書

６．１．２ コンパイル方法(build_readL1B_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL1B_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL1B_amtk.f
16
17 # output filename
18 out=readL1B_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1B_amtk_f.sh
ifort -g readL1B_amtk.f -o readL1B_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

75

AMSR2 データ利用解説文書

６．１．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1B_amtk_f GW1AM2_201207261145_055A_L1SGBTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGBTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGBTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans:
1979
limit of NumberOfScans = 2200
OverlapScans:
20
CoRegistrationParameterA1: 6G-1.25000,7G-1.00000,10G1.25000,18G-1.25000,23G-1.25000,36G-1.00000
CoRegistrationParameterA2: 6G-0.00000,7G--0.10000,10G--0.25000,18G-0.00000,23G--0.25000,36G-0.00000
time(scan=1): 2012/07/26 11:45:43
latlon89a(pixel=1,scan=1): ( -73.3289, 136.7714)
latlon89b(pixel=1,scan=1): ( -73.4038, 137.1498)
latlonlm(pixel=1,scan=1): ( -73.3538, 136.6228)
latlon06(pixel=1,scan=1): ( -73.3592, 136.6213)
latlon07(pixel=1,scan=1): ( -73.3497, 136.6429)
latlon10(pixel=1,scan=1): ( -73.3506, 136.6001)
latlon18(pixel=1,scan=1): ( -73.3592, 136.6213)
latlon23(pixel=1,scan=1): ( -73.3506, 136.6001)
latlon36(pixel=1,scan=1): ( -73.3532, 136.6514)
tb06h(pixel=1,scan=1):
173.28tb06v(pixel=1,scan=1):
208.22
tb07h(pixel=1,scan=1):
173.07
tb07v(pixel=1,scan=1):
207.54
tb10h(pixel=1,scan=1):
170.94
tb10v(pixel=1,scan=1):
204.95
tb18h(pixel=1,scan=1):
164.85
tb18v(pixel=1,scan=1):
199.84
tb23h(pixel=1,scan=1):
163.22
tb23v(pixel=1,scan=1):
196.53tb36h(pixel=1,scan=1):
156.56
tb36v(pixel=1,scan=1):
186.39tb89ah(pixel=1,scan=1):
163.76tb89av(pixel=1,scan=1):
179.27tb89bh(pixel=1,scan=1):
170.60tb89bv(pixel=1,scan=1):
188.1676

pdq06h(pixel=1,scan=1): 0
pdq06v(pixel=1,scan=1): 0
pdq07h(pixel=1,scan=1): 0
pdq07v(pixel=1,scan=1): 0
pdq10h(pixel=1,scan=1): 0
pdq10v(pixel=1,scan=1): 0
pdq18h(pixel=1,scan=1): 0
pdq18v(pixel=1,scan=1): 0
pdq23h(pixel=1,scan=1): 0
pdq23v(pixel=1,scan=1): 0
pdq36h(pixel=1,scan=1): 0
pdq36v(pixel=1,scan=1): 0
pdq89ah(pixel=1,scan=1): 0
pdq89av(pixel=1,scan=1): 0
pdq89bh(pixel=1,scan=1): 0
pdq89bv(pixel=1,scan=1): 0
lof06(pixel=1,scan=1): 100
lof07(pixel=1,scan=1): 100
lof10(pixel=1,scan=1): 100
lof18(pixel=1,scan=1): 100
lof23(pixel=1,scan=1): 100
lof36(pixel=1,scan=1): 100
lof89a(pixel=1,scan=1): 100
lof89b(pixel=1,scan=1): 100
ear_in(pixel=1,scan=1):
55.20
ear_az(pixel=1,scan=1):
144.76AMSR2 データ利用解説文書

６．２ L1R データ読込み
６．２．１ サンプルプログラム readL1R_amtk.f 解説
サンプルプログラム readL1R_amtk.f では、L1R データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波用緯度経度を抽出し、内容をテキスト表示します。
このサンプルプログラムでは、格納されている L1R 輝度温度の一部のみ取扱います。L1R 輝度温度データ一覧については、P.14「３．８ L1 リサンプリングデータ」を参照ください。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (res06,6.9GHz,H)- Brightness Temperature (res06,6.9GHz,V)- Brightness Temperature (res06,7.3GHz,H)- Brightness Temperature (res06,7.3GHz,V)- Brightness Temperature (res10,10.7GHz,H)- Brightness Temperature (res10,10.7GHz,V)- Brightness Temperature (res23,18.7GHz,H)- Brightness Temperature (res23,18.7GHz,V)- Brightness Temperature (res23,23.8GHz,H)- Brightness Temperature (res23,23.8GHz,V)- Brightness Temperature (res36,36.5GHz,H)- Brightness Temperature (res36,36.5GHz,V)- Brightness Temperature (res36,89.0GHz,H)- Brightness Temperature (res36,89.0GHz,V)- Brightness Temperature (original,89GHz-A,H)- Brightness Temperature (original,89GHz-A,V)- Brightness Temperature (original,89GHz-B,H)- Brightness Temperature (original,89GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

89G A ホーン緯度経度から抽出するデータ- 低周波用緯度経度
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が real(4)型の場合→ AMTK_get_SwathFloat()関数
出力が integer(4)型の場合→ AMTK_get_SwathInt()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。
77

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main2
implicit none
3 C include
4
include 'AMTK_f.h':

FORTRAN 用 AMTK ヘッダーをインクルードします。
標準プロダクトのスキャン数上限は 2200 で充分ですが、
準リアルプロダクトを使用する場合は、
2 周回程度繋がる場合があるので、
LMT=9000 としてください。(標準の 4 パス分程度)

7 C fixed value
8
integer(4),parameter::LMT=2200 ! limit of NumberOfScans
9 C interface variable
10
integer(4) i,j! loop variable11
integer(4) ret! return status12
character(len=512) buf ! text buffer
AMTK 用インターフェイス変数を宣言します。
13
character(len=512) fn ! filename
14
integer(4) hnd! file handle
15 C meta data
物理量名
メタデータ用変数
16
character(len=512) geo ! GeophysicalName
グラニュール ID
17
character(len=512) gid ! GranuleIDを宣言します。
観測開始時刻18
character(len=512) tm1 ! ObservationStartDateTime
赤道通過時刻19
character(len=512) tm2 ! EquatorCrossingDateTime
観測終了時刻20
character(len=512) tm3 ! ObservationEndDateTime
21
integer(4) num! NumberOfScans
スキャン数22
integer(4) ovr! OverlapScans
オーバーラップスキャン数
23
character(len=512) prm1 ! CoRegistrationParameterA1
相対レジストレーション係数 A124character(len=512) prm2 ! CoRegistrationParameterA2
相対レジストレーション係数 A2
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
25 C array data26
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime 時刻
緯度経度
27
type(AM2_COMMON_LATLON) ll89ar(AM2_DEF_SNUM_HI,LMT) ! latlon for 89a
28
type(AM2_COMMON_LATLON) ll89br(AM2_DEF_SNUM_HI,LMT) ! latlon for 89b
:
輝度温度
30
real(4) tb06h06(AM2_DEF_SNUM_LO,LMT) ! tb for 06h, resolution 06G
31
real(4) tb06v06(AM2_DEF_SNUM_LO,LMT) ! tb for 06v, resolution 06G
:
品質フラグ
49
integer(1) pdq06h(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06h
50
integer(1) pdq06v(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06v
:
陸海フラグ
59
integer(1) lof06(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 06
60
integer(1) lof10(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 10:66
real(4) ear_in(AM2_DEF_SNUM_LO,LMT) ! earth incidence 観測入射角67real(4) ear_az(AM2_DEF_SNUM_LO,LMT) ! earth azimuth
観測方位角
配列データ用変数
を宣言します。

78

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
76 C open77
hnd=AMTK_openH5(fn)78
if(hnd.lt.0)then
79
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
80write(*,'(a,i12)')'amtk status: ',hnd81call exit(1)
82
endif

◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
83 C read meta: GeophysicalName84
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)85
if(ret.lt.0)then86
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'87write(*,'(a,i12)')'amtk status: ',ret88
call exit(1)
89
endif
90
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))

メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。
126 C read meta: NumberOfScans127
ret=AMTK_getMetaDataName(hnd,'NumberOfScans',buf)
128
if(ret.lt.0)then
129
write(*,'(a)')'AMTK_getMetaDataName error: NumberOfScans'130
write(*,'(a,i12)')'amtk status: ',ret131
call exit(1)
132
endif
メタデータは全て文字として取得されるので、
133
read(buf(1:ret),*)num
134
write(*,'(a,i12)')'NumberOfScans: 数値に変換しておきます。
',num

79

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
171 C read array: scantime172
ret=AMTK_getScanTime(hnd,1,num,st)173
if(ret.lt.0)then174
write(*,'(a)')'AMTK_getScanTime error.'175
write(*,'(a,i12)')'amtk status: ',ret176
call exit(1)
177
endif
178
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
179+'time(scan=1): '180+,st(1)%year181+,st(1)%month182+,st(1)%day183+,st(1)%hour
184+,st(1)%minute185+,st(1)%second◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
186 C read array: latlon for 89a altitude revised
187
ret=AMTK_getLatLon(hnd,ll89ar,1,num,AM2_LATLON_RS_89A)
188
if(ret.lt.0)then189
write(*,'(a)')'AMTK_getLatLon error: AM2_LATLON_RS_89A'
190
write(*,'(a,i12)')'amtk status: ',ret191
call exit(1)
192
endif
193
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon89ar(pixel=1,scan=1): '194+,ll89ar(1,1)%lat,ll89ar(1,1)%lon

80

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度データは real(4)型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
213 C read array: tb for 06h, resolution 06G
214
ret=AMTK_get_SwathFloat(hnd,tb06h06,1,num,AM2_RES06_TB06H)
215
if(ret.lt.0)then216
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_RES06_TB06H'
217
write(*,'(a,i12)')'amtk status: ',ret218
call exit(1)
219
endif
220
write(*,'(a,f9.2)')'tb06h06(pixel=1,scan=1): ',tb06h06(1,1)

81

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 品質フラグデータを読込みます。
L1 品質フラグデータは integer(4)型の 2 次元配列で、
L1 低解像度品質フラグデータのサイズは(ピクセル数*16)×スキャン数です。
L1 高解像度品質フラグデータのサイズは(ピクセル数* 8)×スキャン数です。
出力が integer(4)型なので、AMTK_get_SwathInt()関数を使用します。
ret=AMTK_get_SwathInt(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
357 C read array: pixel data quality for low
358
ret=AMTK_get_SwathInt(hnd,pdqlo,1,num,AM2_PIX_QUAL_LO)359
if(ret.lt.0)then360
write(*,'(a)')'AMTK_get_SwathInt error: AM2_PIX_QUAL_LO'
361
write(*,'(a,i12)')'amtk status: ',ret362
call exit(1)
363
endif

L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
364
365
366
367
368
369
370
371

do j=1,num
do i=1,AM2_DEF_SNUM_LO
pdq06v(i,j)=pdqlo((i-1)*16+ 2,j)*10+pdqlo((i-1)*16+ 1,j)
pdq06h(i,j)=pdqlo((i-1)*16+ 4,j)*10+pdqlo((i-1)*16+ 3,j)
pdq07v(i,j)=pdqlo((i-1)*16+ 6,j)*10+pdqlo((i-1)*16+ 5,j)
pdq07h(i,j)=pdqlo((i-1)*16+ 8,j)*10+pdqlo((i-1)*16+ 7,j)
enddo
enddo

82

AMSR2 データ利用解説文書◇L1R 陸海フラグデータ読込み ※左側の数字は行番号です
陸海フラグデータを読込みます。
陸海フラグデータは integer(4)型の 2 次元配列で、
L1B 低解像度陸海データのサイズはピクセル数×(スキャン数*4)です。
L1B 高解像度陸海データのサイズはピクセル数×(スキャン数*2)です。
出力が integer(4)型なので、AMTK_get_SwathInt()関数を使用します。

P.14 基礎知識編３．９参照

395 C read array: land ocean flag for low
396
ret=AMTK_get_SwathInt(hnd,loflo,1,num,AM2_LOF_RES_LO)397
if(ret.lt.0)then
398
write(*,'(a)')'AMTK_get_SwathInt error: AM2_LOF_RES_LO'399
write(*,'(a,i12)')'amtk status: ',ret
400
call exit(1)
401
endif
陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
402
do j=1,num
403
do i=1,AM2_DEF_SNUM_LO
404
lof06(i,j)=loflo(i,num*0+j)405
lof10(i,j)=loflo(i,num*1+j)406
lof23(i,j)=loflo(i,num*2+j)407
lof36(i,j)=loflo(i,num*3+j)
408
enddo
409
enddo

◇観測入射角データ読込み※左側の数字は行番号です

観測入射角データを読込みます。
観測入射角データは real(4)型の 2 次元配列で、サイズはピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
429 C read array: earth incidence430
ret=AMTK_get_SwathFloat(hnd,ear_in,1,num,AM2_EARTH_INC)431
if(ret.lt.0)then
432
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_EARTH_INC'
433
write(*,'(a,i12)')'amtk status: ',ret434
call exit(1)
435
endif
436
write(*,'(a,f9.2)')'ear_in(pixel=1,scan=1): ',ear_in(1,1)◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
445 C close
446
ret=AMTK_closeH5(hnd)83

AMSR2 データ利用解説文書

６．２．２ コンパイル方法(build_readL1R_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL1R_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL1R_amtk.f
16
17 # output filename
18 out=readL1R_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1R_amtk_f.sh
ifort -g readL1R_amtk.f -o readL1R_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

84

AMSR2 データ利用解説文書

６．２．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1R_amtk_f GW1AM2_201207261145_055A_L1SGRTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGRTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGRTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans:
1979
limit of NumberOfScans = 2200
OverlapScans:
20
CoRegistrationParameterA1: 6G-0.00000,7G-0.00000,10G0.00000,18G-0.00000,23G-0.00000,36G-0.00000
CoRegistrationParameterA2: 6G-0.00000,7G-0.00000,10G0.00000,18G-0.00000,23G-0.00000,36G-0.00000
time(scan=1): 2012/07/26 11:45:43
latlon89ar(pixel=1,scan=1): ( -73.3581, 136.8432)
latlon89br(pixel=1,scan=1): ( -73.4328, 137.2216)
latlonlr(pixel=1,scan=1): ( -73.3581, 136.8432)
tb06h06(pixel=1,scan=1):
173.41
tb06v06(pixel=1,scan=1):
208.09tb07h06(pixel=1,scan=1):
173.07
tb07v06(pixel=1,scan=1):
207.11
tb10h10(pixel=1,scan=1):
170.40tb10v10(pixel=1,scan=1):
204.58tb18h23(pixel=1,scan=1):
165.83
tb18v23(pixel=1,scan=1):
199.41
tb23h23(pixel=1,scan=1):
163.55
tb23v23(pixel=1,scan=1):
195.90tb36h36(pixel=1,scan=1):
153.55
tb36v36(pixel=1,scan=1):
183.95tb89h36(pixel=1,scan=1):
163.86
tb89v36(pixel=1,scan=1):
181.05tb89ah(pixel=1,scan=1):
163.76tb89av(pixel=1,scan=1):
179.27tb89bh(pixel=1,scan=1):
170.60tb89bv(pixel=1,scan=1):
188.1685

pdq06h(pixel=1,scan=1): 0
pdq06v(pixel=1,scan=1): 0
pdq07h(pixel=1,scan=1): 0
pdq07v(pixel=1,scan=1): 0
pdq10h(pixel=1,scan=1): 0
pdq10v(pixel=1,scan=1): 0
pdq18h(pixel=1,scan=1): 0
pdq18v(pixel=1,scan=1): 0
pdq23h(pixel=1,scan=1): 0
pdq23v(pixel=1,scan=1): 0
pdq36h(pixel=1,scan=1): 0
pdq36v(pixel=1,scan=1): 0
pdq89ah(pixel=1,scan=1): 0
pdq89av(pixel=1,scan=1): 0
pdq89bh(pixel=1,scan=1): 0
pdq89bv(pixel=1,scan=1): 0
lof06(pixel=1,scan=1): 100
lof10(pixel=1,scan=1): 100
lof23(pixel=1,scan=1): 100
lof36(pixel=1,scan=1): 100
lof89a(pixel=1,scan=1): 100
lof89b(pixel=1,scan=1): 100
ear_in(pixel=1,scan=1):
55.20
ear_az(pixel=1,scan=1):
144.76AMSR2 データ利用解説文書

６．３ L2 低解像度データ読込み
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)が L2 低解像度です。降水量(PRC)は L2 高解像度を参照ください。
６．３．１ サンプルプログラム readL2L_amtk.f 解説
サンプルプログラム readL2L_amtk.f では、L2 低解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point* Longitude of Observation Point* Geophysical Data
* Pixel Data Quality
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が real(4)型の場合→ AMTK_get_SwathFloat()関数
出力が integer(1)型の場合→ AMTK_get_SwathUChar()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

86

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main2
implicit none
3 C include
4
include 'AMTK_f.h':

FORTRAN 用 AMTK ヘッダーをインクルードします。
標準プロダクトのスキャン数上限は 2200 で充分ですが、
準リアルプロダクトを使用する場合は、
2 周回程度繋がる場合があるので、
LMT=9000 としてください。(標準の 4 パス分程度)

7 C fixed value
8
integer(4),parameter::LMT=2200 ! limit of NumberOfScans:
12 C interface variable13
integer(4) i,j! loop variable14
integer(4) ret! return status15
character(len=512) buf ! text buffer
16
character(len=512) fn ! filename
AMTK 用インターフェイス変数を宣言します。
17
integer(4) hnd! file handle
18 C meta data
物理量名19character(len=512) geo ! GeophysicalName
メタデータ用変数
グラニュール ID
20
character(len=512) gid ! GranuleIDを宣言します。
21
character(len=512) tm1 ! ObservationStartDateTime
観測開始時刻22
character(len=512) tm2 ! EquatorCrossingDateTime
赤道通過時刻23
character(len=512) tm3 ! ObservationEndDateTime
観測終了時刻24
integer(4) num! NumberOfScans
スキャン数25
integer(4) ovr! OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
26 C array data27
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime 時刻
28
type(AM2_COMMON_LATLON) ll(AM2_DEF_SNUM_LO,LMT) ! latlon 緯度経度2930real(4) geo1(AM2_DEF_SNUM_LO,LMT) ! geophysical data layer 1
real(4) geo2(AM2_DEF_SNUM_LO,LMT) ! geophysical data layer 2 物理量

31
32
33

integer(4) pdq1(AM2_DEF_SNUM_LO,LMT) ! pixel data quality layer 1
integer(4) pdq2(AM2_DEF_SNUM_LO,LMT) ! pixel data quality layer 2
integer(1) pdqtmp(AM2_DEF_SNUM_LO,LMT*2) ! pixel data quality temporary

品質フラグ

配列データ用変数
を宣言します。

87

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
42 C open43
hnd=AMTK_openH5(fn)44
if(hnd.lt.0)then45
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
46write(*,'(a,i12)')'amtk status: ',hnd47call exit(1)
48
endif

◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
49 C read meta: GeophysicalName
50
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)51
if(ret.lt.0)then52
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'53
write(*,'(a,i12)')'amtk status: ',ret54
call exit(1)
55
endif
56
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))

メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。
103 C read meta: NumberOfScans104
ret=AMTK_getMetaDataName(hnd,'NumberOfScans',buf)
105
if(ret.lt.0)then106
write(*,'(a)')'AMTK_getMetaDataName error: NumberOfScans'107
write(*,'(a,i12)')'amtk status: ',ret108
call exit(1)メタデータは全て文字として取得されるので、
109
endif
数値に変換しておきます。
110
read(buf(1:ret),*)num
111
write(*,'(a,i12)')'NumberOfScans: ',num

88

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
128 C read array: scantime
129
ret=AMTK_getScanTime(hnd,1,num,st)130
if(ret.lt.0)then131
write(*,'(a)')'AMTK_getScanTime error.'132
write(*,'(a,i12)')'amtk status: ',ret133
call exit(1)
134
endif
135
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
136+'time(scan=1): '137+,st(1)%year
138+,st(1)%month139+,st(1)%day140+,st(1)%hour
141+,st(1)%minute142+,st(1)%second◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
143 C read array: latlon
144
ret=AMTK_getLatLon(hnd,ll,1,num,AM2_LATLON_L2_LO)
145
if(ret.lt.0)then146
write(*,'(a)')'AMTK_getLatLon error: AM2_LATLON_L2_LO'147
write(*,'(a,i12)')'amtk status: ',ret148
call exit(1)
149
endif
150
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon(pixel=1,scan=1): '151+,ll(1,1)%lat,ll(1,1)%lon

89

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量データは real(4)型の 3 次元配列で、サイズはレイヤ数×ピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
152 C read array: geophysical data for 1 layer153
if((gid(30:32).ne.'SND').and.(gid(30:32).ne.'SST'))then
154
ret=AMTK_get_SwathFloat(hnd,geo1,1,num,AM2_SWATH_GEO1)
155
if(ret.lt.0)then156
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_SWATH_GEO1'
157
write(*,'(a,i12)')'amtk status: ',ret158
call exit(1)
159
endif
160
endif
2 層ある場合は、アクセスラベルを変更して読み分けます。

161 C read array: geophysical data for 2 layer162
if((gid(30:32).eq.'SND').or.(gid(30:32).eq.'SST'))then163! layer 1
164
ret=AMTK_get_SwathFloat(hnd,geo1,1,num,AM2_SWATH_GEO1)
165
if(ret.lt.0)then
166
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_SWATH_GEO1'
167
write(*,'(a,i12)')'amtk status: ',ret168
call exit(1)
169
endif
170
! layer 2
171
ret=AMTK_get_SwathFloat(hnd,geo2,1,num,AM2_SWATH_GEO2)
172
if(ret.lt.0)then173
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_SWATH_GEO2'
174
write(*,'(a,i12)')'amtk status: ',ret175
call exit(1)
176
endif
177
endif

90

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
L2 品質フラグデータは integer(1)型の 3 次元配列で、サイズはピクセル数×スキャン数×レイヤ数です。
出力が integer(1)型なので、AMTK_get_SwathUChar()関数を使用します。
積雪深(SND)、海面水温(SST)は品質フラグが 2 層あるのでこの 2 つとそれ以外で処理を分けています。
ret=AMTK_get_SwathUChar(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
178 C read array: pixel data quality for 1 layer179
if((gid(30:32).ne.'SND').and.(gid(30:32).ne.'SST'))then180! read181
ret=AMTK_get_SwathUChar(hnd,pdqtmp,1,num,AM2_PIX_QUAL)
182
if(ret.lt.0)then
183
write(*,'(a)')'AMTK_get_SwathUChar error: AM2_PIX_QUAL'
184
write(*,'(a,i12)')'amtk status: ',ret185
call exit(1)
186
endif
187
! convert signed to unsigned
188
do j=1,num
FORTRAN には符号なし変数型がないので、
189
do i=1,AM2_DEF_SNUM_LO190
pdq1(i,j)=pdqtmp(i,j)
L2 品質フラグ 0～255 は、
191
if(pdq1(i,j).ge.0)then-128～127 として読込まれます。
192
pdq1(i,j)=pdq1(i,j)
元の値に戻すため、以下の操作を行います。
193
else
0～127→そのままの値
194
pdq1(i,j)=pdq1(i,j)+256-128～-1→256 を足す
195
endif
196
197
198

enddo
enddo
endif

L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html

91

AMSR2 データ利用解説文書

2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。

199 C read array: pixel data quality for 2 layer200
if((gid(30:32).eq.'SND').or.(gid(30:32).eq.'SST'))then
201! read202
ret=AMTK_get_SwathUChar(hnd,pdqtmp,1,num,AM2_PIX_QUAL)
203
if(ret.lt.0)then
204
write(*,'(a)')'AMTK_get_SwathUChar error: AM2_PIX_QUAL'
205
write(*,'(a,i12)')'amtk status: ',ret206
call exit(1)
207
endif
208
! separate & convert signed to unsigned
209
do j=1,num
210
do i=1,AM2_DEF_SNUM_LO211
pdq1(i,j)=pdqtmp(i,num*0+j)212
pdq2(i,j)=pdqtmp(i,num*1+j)213
if(pdq1(i,j).ge.0)then
214
pdq1(i,j)=pdq1(i,j)
215
else
216
pdq1(i,j)=pdq1(i,j)+256
217
endif
218
if(pdq2(i,j).ge.0)then219
pdq2(i,j)=pdq2(i,j)
220
else
221
pdq2(i,j)=pdq2(i,j)+256
222
endif
223
enddo
224
enddo
225
endif

◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
257 C close
258
ret=AMTK_closeH5(hnd)92

AMSR2 データ利用解説文書

６．３．２ コンパイル方法(build_readL2L_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL2L_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL2L_amtk.f
16
17 # output filename
18 out=readL2L_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2L_amtk_f.sh
ifort -g readL2L_amtk.f -o readL2L_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

93

AMSR2 データ利用解説文書

６．３．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2L_amtk_f GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_201303011809_125D_L2SGCLWLA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans:1972
limit of NumberOfScans = 2200
OverlapScans:0time(scan=1): 2013/03/01 18:09:10
latlon(pixel=1,scan=1): ( 84.4574, -78.1076)
geo1(pixel=1,scan=1): -32767.000 [Kg/m2] (PDQ:112)

94

AMSR2 データ利用解説文書

６．４ L2 高解像度データ読込み
降水量(PRC)が L2 高解像度です。
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)は L2 低解像度を参照ください。
６．４．１ サンプルプログラム readL2H_amtk.f 解説
サンプルプログラム readL2H_amtk.f では、L2 高解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B* Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Geophysical Data for 89A- Geophysical Data for 89B* Pixel Data Quality for 89A- Pixel Data Quality for 89B
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、出力されるデータ型によって以下の 4 つの関数を使い分けます。


出力が時刻構造体の場合→ AMTK_getScanTime()関数
出力が緯度経度構造体の場合 → AMTK_getLatLon()関数
出力が real(4)型の場合→ AMTK_get_SwathFloat()関数
出力が integer(1)型の場合→ AMTK_get_SwathUChar()関数

読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

95

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main2
implicit none
3 C include
4
include 'AMTK_f.h':

FORTRAN 用 AMTK ヘッダーをインクルードします。
標準プロダクトのスキャン数上限は 2200 で充分ですが、
準リアルプロダクトを使用する場合は、
2 周回程度繋がる場合があるので、
LMT=9000 としてください。(標準の 4 パス分程度)

7 C fixed value
8
integer(4),parameter::LMT=2200 ! limit of NumberOfScans:
11 C interface variable
12
integer(4) i,j! loop variable13
integer(4) ret! return status
14
character(len=512) buf ! text buffer
15
character(len=512) fn ! filename
AMTK 用インターフェイス変数を宣言します。
16
integer(4) hnd! file handle
17 C meta data
物理量名18character(len=512) geo ! GeophysicalName
メタデータ用変数
グラニュール ID
19
character(len=512) gid ! GranuleIDを宣言します。
20
character(len=512) tm1 ! ObservationStartDateTime
観測開始時刻21
character(len=512) tm2 ! EquatorCrossingDateTime
赤道通過時刻22
character(len=512) tm3 ! ObservationEndDateTime
観測終了時刻23
integer(4) num! NumberOfScans
スキャン数24
integer(4) ovr! OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
緯度経度データには AM2_COMMON_LATLON 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は AMTK に定義されている定数で、高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は AMTK に定義されている定数で、低解像度ピクセル数(243)です。
25 C array data26
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime
27
type(AM2_COMMON_LATLON) ll89a(AM2_DEF_SNUM_HI,LMT)
28
type(AM2_COMMON_LATLON) ll89b(AM2_DEF_SNUM_HI,LMT)
29
real(4) geo1_89a(AM2_DEF_SNUM_HI,LMT)
30real(4) geo1_89b(AM2_DEF_SNUM_HI,LMT)
31
integer(4) pdq1_89a(AM2_DEF_SNUM_HI,LMT)
32
integer(4) pdq1_89b(AM2_DEF_SNUM_HI,LMT)
33
integer(1) pdqtmp(AM2_DEF_SNUM_HI,LMT)

時刻
緯度経度
物理量
品質フラグ

配列データ用変数
を宣言します。

96

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
42 C open43
hnd=AMTK_openH5(fn)44
if(hnd.lt.0)then45
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
46write(*,'(a,i12)')'amtk status: ',hnd47call exit(1)
48
endif

◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
49 C read meta: GeophysicalName
50
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)51
if(ret.lt.0)then52
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'53
write(*,'(a,i12)')'amtk status: ',ret54
call exit(1)
55
endif
56
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))

メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になるので、ここで読込んでおきます。
97 C read meta: NumberOfScans98
ret=AMTK_getMetaDataName(hnd,'NumberOfScans',buf)
99
if(ret.lt.0)then100
write(*,'(a)')'AMTK_getMetaDataName error: NumberOfScans'
101
write(*,'(a,i12)')'amtk status: ',ret102
call exit(1)メタデータは全て文字として取得されるので、
103
endif
数値に変換しておきます。
104
read(buf(1:ret),*)num
105
write(*,'(a,i12)')'NumberOfScans: ',num

97

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

P.11 基礎知識編３．６参照

時刻データを読込みます。
時刻データは AM2_COMMON_SCANTIME 構造体の 1 次元配列で、サイズはスキャン数です。
時刻データの読込みには、AMTK_getScanTime()関数を使用します。
ret=AMTK_getScanTime(hnd,bgn,end,out)
hnd: ファイルハンドル値を指定します
bgn: 開始スキャンを指定します
end: 終了スキャンを指定します
out: 出力データが返されます
ret: [戻り値]失敗の場合は負の値
122 C read array: scantime
123
ret=AMTK_getScanTime(hnd,1,num,st)124
if(ret.lt.0)then125
write(*,'(a)')'AMTK_getScanTime error.'126
write(*,'(a,i12)')'amtk status: ',ret127
call exit(1)
128
endif
129
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')130+'time(scan=1): '131+,st(1)%year132+,st(1)%month133+,st(1)%day134+,st(1)%hour
135+,st(1)%minute136+,st(1)%second◇緯度経度データ読込み ※左側の数字は行番号です

P.15 基礎知識編３．１０参照

緯度経度データを読込みます。
緯度経度データは AM2_COMMON_LATLON 構造体の 2 次元配列で、サイズはピクセル数×スキャン数です。
緯度経度データの読込みには、AMTK_getLatLon()関数を使用します。
ret=AMTK_getLatLon(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
137 C read array: latlon for 89a138
ret=AMTK_getLatLon(hnd,ll89a,1,num,AM2_LATLON_L2_89A)
139
if(ret.lt.0)then140
write(*,'(a)')'AMTK_getLatLon error: AM2_LATLON_L2_89A'
141
write(*,'(a,i12)')'amtk status: ',ret142
call exit(1)
143
endif
144
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon89a(pixel=1,scan=1): '145+,ll89a(1,1)%lat,ll89a(1,1)%lon

98

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量データは real(4)型の 3 次元配列で、サイズはレイヤ数×ピクセル数×スキャン数です。
出力が real(4)型なので、AMTK_get_SwathFloat()関数を使用します。
ret=AMTK_get_SwathFloat(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
155 C read array: geophysical data for 1 layer for 89a
156
ret=AMTK_get_SwathFloat(hnd,geo1_89a,1,num,AM2_SWATHA_GEO1)
157
if(ret.lt.0)then158
write(*,'(a)')'AMTK_get_SwathFloat error: AM2_SWATHA_GEO1'
159
write(*,'(a,i12)')'amtk status: ',ret160
call exit(1)
161
endif

◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
L2 品質フラグデータは integer(1)型の 3 次元配列で、サイズはピクセル数×スキャン数×レイヤ数です。
出力が integer(1)型なので、AMTK_get_SwathUChar()関数を使用します。
ret=AMTK_get_SwathUChar(hnd,out,bgn,end,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますbgn: 開始スキャンを指定します
end: 終了スキャンを指定します
label: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
169 C read array: pixel data quality for 1 layer for 89a
170! read171
ret=AMTK_get_SwathUChar(hnd,pdqtmp,1,num,AM2_PIX_QUAL_A)
172
if(ret.lt.0)then173
write(*,'(a)')'AMTK_get_SwathUChar error: AM2_PIX_QUAL_A'
174
write(*,'(a,i12)')'amtk status: ',ret175
call exit(1)
176
endif
FORTRAN には符号なし変数型がないので、177! convert signed to unsigned
L2 品質フラグ 0～255 は、
178
do j=1,num-128～127 として読込まれます。
179
do i=1,AM2_DEF_SNUM_HI
元の値に戻すため、以下の操作を行います。
180
pdq1_89a(i,j)=pdqtmp(i,j)
0～127→そのままの値
181
if(pdq1_89a(i,j).ge.0)then-128～-1→256 を足す
182
pdq1_89a(i,j)=pdq1_89a(i,j)
183
else
184
pdq1_89a(i,j)=pdq1_89a(i,j)+256
185
endif
186
enddo
187
enddo
L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html

99

AMSR2 データ利用解説文書◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
257 C close
258
ret=AMTK_closeH5(hnd)100

AMSR2 データ利用解説文書

６．４．２ コンパイル方法(build_readL2H_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL2H_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL2H_amtk.f
16
17 # output filename
18 out=readL2H_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2H_amtk_f.sh
ifort -g readL2H_amtk.f -o readL2H_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

101

AMSR2 データ利用解説文書

６．４．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2H_amtk_f GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
GeophysicalName: Precipitation
GranuleID: GW1AM2_201303011809_125D_L2SGPRCHA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans:1972
limit of NumberOfScans = 2200
OverlapScans:0time(scan=1): 2013/03/01 18:09:10
latlon89a(pixel=1,scan=1): ( 84.4188, -77.9502)
latlon89b(pixel=1,scan=1): ( 84.3305, -78.8925)
geo1_89a(pixel=1,scan=1): -32767.0 [mm/h] (PDQ: 16)
geo1_89b(pixel=1,scan=1): -32767.0 [mm/h] (PDQ: 16)102

AMSR2 データ利用解説文書

６．５ L3 輝度温度データ読込み
６．５．１ サンプルプログラム readL3B_amtk.f 解説
サンプルプログラム readL3B_amtk.f では、L3 輝度温度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Brightness Temperature (H)- Brightness Temperature (V)以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、AMTK_get_GridFloat()関数を使用します。
読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

103

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
FORTRAN 用 AMTK ヘッダーをインクルードします。
2
implicit none
3 C include
4
include 'AMTK_f.h':
10 C interface variable11
integer(4) i,j! loop variable
12
integer(4) ret! return status13
character(len=512) buf ! text buffer
14
character(len=512) fn ! filename
15
integer(4) hnd! file handle
16
integer(4) siz(3)! array size
AMTK 用インターフェイス変数を宣言します。
17
integer(4) x! grid size x
18
integer(4) y! grid size y:
24 C meta data
メタデータ用変数25
character(len=512) geo ! GeophysicalName 物理量名を宣言します。
26
character(len=512) gid ! GranuleID
グラニュール ID
27 C array data28
real(4),allocatable::tbH(:,:)
29
real(4),allocatable::tbV(:,:)

輝度温度

配列データ用変数
を宣言します。

この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
38 C open39
hnd=AMTK_openH5(fn)40
if(hnd.lt.0)then
41
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
42write(*,'(a,i12)')'amtk status: ',hnd
43call exit(1)
44
endif

104

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
45 C read meta: GeophysicalName
46
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)47
if(ret.lt.0)then48
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'49
write(*,'(a,i12)')'amtk status: ',ret50
call exit(1)
51
endif
52
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
配列サイズの取得には、AMTK_getDimSize()関数を使用します。
ret=AMTK_getDimSize(hnd,label,siz)
hnd: ファイルハンドル値を指定します
label: アクセスラベルを指定します
siz: [戻り値]配列サイズ
ret: [戻り値]失敗の場合は負の値
72 C get grid size73
ret=AMTK_getDimSize(hnd,AM2_GRID_TBH,siz);74
if(ret.lt.0)then75
write(*,'(a)')'AMTK_getDimSize error: AM2_GRID_TBH'
76
write(*,'(a,i12)')'amtk status: ',ret77
call exit(1)
78
endif
79
x=siz(2);80
y=siz(1);81
write(*,'(a,i12)')'grid size x: ',x82
write(*,'(a,i12)')'grid size y: ',y
メモリ領域を確保します。
83 C memory allocate
84
allocate(tbH(x,y),stat=ret)
85
if(ret.ne.0)then86
write(*,'(a)')'memory allocate error: tbH'
87
call exit(1)
88
endif

105

AMSR2 データ利用解説文書◇輝度温度読込み ※左側の数字は行番号です
輝度温度データを読込みます。
ret=AMTK_get_GridFloat(hnd,out,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますlabel: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
94 C read horizontal
95
ret=AMTK_get_GridFloat(hnd,tbH,AM2_GRID_TBH)
96
if(ret.lt.0)then
97
write(*,'(a)')'AMTK_get_GridFloat error: AM2_GRID_TBH'
98
write(*,'(a,i12)')'amtk status: ',ret99
call exit(1)
100
endif

◇終了処理 ※左側の数字は行番号です
メモリを開放します。
200 C memory free201
deallocate(tbH)
202
deallocate(tbV)
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
203 C close204
ret=AMTK_closeH5(hnd)106

AMSR2 データ利用解説文書

６．５．２ コンパイル方法(build_readL3B_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL3B_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL3B_amtk.f
16
17 # output filename
18 out=readL3B_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3B_amtk_f.sh
ifort -g readL3B_amtk.f -o readL3B_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

107

AMSR2 データ利用解説文書

６．５．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3B_amtk_f GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
GeophysicalName: Brightness Temperature (6GHz)
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110
grid size x:
1440
grid size y:
720
ASCII ART OF HORIZONTAL BRIGHTNESS TEMPERATURE (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||411233344443444444444444444444444444444444444444444444443344322222244444||111134311113444444444444444444444444444444444444444444444444434233343111||124523445555555544444444444444443431234344414455544444444444211211111111||154544444444444444444444444544111111111111111113554444444442221111111112||412242554414444544444445341131111111111111111111455544445511111111111115||444444444424445554455554411111111111111111111111155555351111111111111124||444444442444111555155531111111111111111112111111111551511411111111111444||555555555551111121111311121111111111111111111111111111141554111111111155||115555555111111111115155311111111111111111111111111111114555554111111111||111555553111111111111111421111312111111111111111111111111555555551111111||111555521511111111111111455555111111111111111111111111111145555521111111||111155511111111111111113555555511111111111111111111111111154552111111111||111111111111111111111111111111111113111111111111111111111155111111111111||111111111111111111111111111111111111111111111111111111111351111111111111||111111111111111111111111111111111111111111111111111111111111111111111111||343323444333342434334344444444433433211111111111111111111344444441111133||333333333333333333333333333333334333333322222333333344334433333333333333|+------------------------------------------------------------------------+108

AMSR2 データ利用解説文書

ASCII ART OF VERTICAL BRIGHTNESS TEMPERATURE (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||433344444444455455444444444444444444444454444444444444444444433333244545||333345433334554554444544444444444444444444545444444444444445544344344333||335534455555555555554555445455554443345455434555554444554444333333333333||355555555555555555455555555554333333333333333334555555555543333333333333||433343555535555555555555453343333333333333333333555555555533333333333335||555555555545555555555555533333333333333333333333355555453333333333333335||555555553555333555355543333333333333333333333333333553533433333333333555||655566655553333333333433343333333333333333333333333333353555333333333355||335555556333333333335355433333333333333333333333333333335555554333333333||333555554333333333333333433333433333333333333333333333333555555563333333||333555533533333333333333566665333333333333333333333333333355555543333333||333365533333333333333334666666533333333333333333333333333355554333333333||333333333333333333333333333333333334333333333333333333333355333333333333||333333333333333333333333333333333333333333333333333333333453333333333333||333333333333333333333333333333333333333333333333333333333333333333333333||444334444444443444444444444444444444333333333333333333333444555543333344||444444443344444444443333443444444444444444334444444444444444444444444444|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[1]: 50-100K[2]:100-150K[3]:150-200K[4]:200-250K[5]:250-300K[6]:300-350K[*]:other109

AMSR2 データ利用解説文書

６．６ L3 物理量データ読込み
６．６．１ サンプルプログラム readL3G_amtk.f 解説
サンプルプログラム readL3G_amtk.f では、L3 物理量データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Geophysical Data

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の AMTK 関数は、最初に使用する際に使用説明を記載します。
メタデータ読込みには、AMTK_getMetaDataName()関数を使用します。
配列データ読込みには、AMTK_get_GridFloat()関数を使用します。
読込むデータ種類の指定は、アクセスラベルで行います。アクセスラベルとは、データ種類を指定するために AMTK で定義されている定数名です。

110

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
FORTRAN 用 AMTK ヘッダーをインクルードします。
2
implicit none
3 C include
4
include 'AMTK_f.h':
10 C interface variable11
integer(4) i,j! loop variable
12
integer(4) ret! return status13
character(len=512) buf ! text buffer
14
character(len=512) fn ! filename
15
integer(4) hnd! file handle
16
integer(4) siz(3)! array size
AMTK 用インターフェイス変数を宣言します。
17
integer(4) x! grid size x
18
integer(4) y! grid size y:
26 C meta data
メタデータ用変数27
character(len=512) geo ! GeophysicalName 物理量名を宣言します。
28
character(len=512) gid ! GranuleID
グラニュール ID
29 C array data30
real(4),allocatable::geo1(:,:)
31
real(4),allocatable::geo2(:,:) 物理量

配列データ用変数
を宣言します。

この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
ファイルをオープンします。
hnd=AMTK_openH5(fn)
fn: オープンするファイル名を指定します
hnd: [戻り値]成功の場合はファイルハンドル値、失敗の場合は負の値
40 C open41
hnd=AMTK_openH5(fn)42
if(hnd.lt.0)then43
write(*,'(a,a)')'AMTK_openH5 error: ',fn(1:len_trim(fn))
44write(*,'(a,i12)')'amtk status: ',hnd45call exit(1)
46
endif

111

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込みます。
ret=AMTK_getMetaDataName(hnd,met,out)
hnd: ファイルハンドル値を指定します
met: メタデータ名称を指定します
out: メタデータ内容が返されます
ret: [戻り値]成功の場合は読込んだメタデータの文字数、失敗の場合は負の値
47 C read meta: GeophysicalName
48
ret=AMTK_getMetaDataName(hnd,'GeophysicalName',geo)49
if(ret.lt.0)then50
write(*,'(a)')'AMTK_getMetaDataName error: GeophysicalName'51write(*,'(a,i12)')'amtk status: ',ret52
call exit(1)
53
endif
54
write(*,'(a,a)')'GeophysicalName: ',geo(1:len_trim(geo))◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
配列サイズの取得には、AMTK_getDimSize()関数を使用します。
ret=AMTK_getDimSize(hnd,label,siz)
hnd: ファイルハンドル値を指定します
label: アクセスラベルを指定します
siz: [戻り値]配列サイズ
ret: [戻り値]失敗の場合は負の値
75 C get grid size76
ret=AMTK_getDimSize(hnd,AM2_GRID_GEO1,siz);77
if(ret.lt.0)then78
write(*,'(a)')'AMTK_getDimSize error: AM2_GRID_GEO1'
79
write(*,'(a,i12)')'amtk status: ',ret80
call exit(1)
81
endif
82
x=siz(2);83
y=siz(1);84
write(*,'(a,i12)')'grid size x: ',x85
write(*,'(a,i12)')'grid size y: ',y
メモリ領域を確保します。
86 C memory allocate layer 1
87
allocate(geo1(x,y),stat=ret)
88
if(ret.ne.0)then89
write(*,'(a)')'memory allocate error: geo1'
90
call exit(1)
91
endif

112

AMSR2 データ利用解説文書◇物理量読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
ret=AMTK_get_GridFloat(hnd,out,label)
hnd: ファイルハンドル値を指定します
out: 出力データが返されますlabel: アクセスラベルを指定します。アクセスラベルはデータ種類によって異なります
ret: [戻り値]失敗の場合は負の値
100 C read layer 1
101
ret=AMTK_get_GridFloat(hnd,geo1,AM2_GRID_GEO1)
102
if(ret.lt.0)then103
write(*,'(a)')'AMTK_get_GridFloat error: AM2_GRID_GEO1'
104
write(*,'(a,i12)')'amtk status: ',ret105
call exit(1)
106
endif
2 層ある場合は、アクセスラベルを変更して読み分けます。
107 C read layer 2
108
if(gid(30:32).eq.'SND')then
109
ret=AMTK_get_GridFloat(hnd,geo2,AM2_GRID_GEO2)
110
if(ret.lt.0)then111
write(*,'(a)')'AMTK_get_GridFloat error: AM2_GRID_GEO2'
112
write(*,'(a,i12)')'amtk status: ',ret113
call exit(1)
114
endif
115
endif

◇終了処理 ※左側の数字は行番号です
メモリを開放します。
301 C memory free302
deallocate(geo1)
303
if(gid(30:32).eq.'SND')then
304
deallocate(geo2)
305
endif
ファイルをクローズします。
ret=AMTK_closeH5(hnd)
hnd: クローズするファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
306 C close307
ret=AMTK_closeH5(hnd)113

AMSR2 データ利用解説文書

６．６．２ コンパイル方法(build_readL3G_amtk_f.sh 解説)
コンパイルに使用するスクリプト build_readL3G_amtk_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～9 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 AMTK=/home/user1/util/AMTK_AMSR2_1.11
8 HDF5=/home/user1/util/hdf5_1.8.4-patch1
9 SZIP=/home/user1/util/szip_2.1
10
12 行目には使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
11 # compiler
12 fc=ifort
13
14 # source filename
15 fsrc=readL3G_amtk.f
16
17 # output filename
18 out=readL3G_amtk_f
19
20 # library order
21 lib="-lAMSR2 -lhdf5 -lsz -lz -lm"
22
23 # compile
24 cmd="$fc -g $fsrc -o $out -I$AMTK/include -I$HDF5/include -I$SZIP/include-L$AMTK/lib -L$HDF5/lib -L$SZIP/lib $lib"
25 echo $cmd
26 $cmd
27
28 # garbage
29 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3G_amtk_f.sh
ifort -g readL3G_amtk.f -o readL3G_amtk_f-I/home/user1/util/AMTK_AMSR2_1.11/include-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/AMTK_AMSR2_1.11/lib-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lAMSR2 -lhdf5 -lsz -lz -lm

114

AMSR2 データ利用解説文書

６．６．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3G_amtk_f GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000
grid size x:
1440
grid size y:
720
ASCII ART OF GEOPHYSICAL DATA LAYER #1 (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||#21#####################################################################||2212###1113##########################################################222||1##################################11######3################011#42223322||2#############################00101112413333233###############343413131#||#20#######2###############00#1223452344213211120##########3355421131121#||#########################4#3222223232100110111110#######14*41111201111##||########0###000###0####111111112101201110*131121100##1#11#01211110100###||###########1011111111#211#11111210011121333223224321000#1###1111000000##||11#######00010122125#3###1#12232321100010020110001011122#######222321111||000######122131112311112#01112#11312212323110100000000110########1001110||100####32#12111141111000######2232322421212441331110011010######11111100||1000###1211232211251100########131112232110121313122011010#####231111001||11131212231110111111211111110012102#1231221223311213111021##011124223242||*33222511232222222223223331421022422322211024222222122113##0111421221132||101122112221111222111111111222312232232331243321212323221223312232222111||####################################311122122221112111221########21221##||########################################################################|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[0]: 0.000 - 0.030 Kg/m2[1]: 0.030 - 0.060 Kg/m2[2]: 0.060 - 0.090 Kg/m2[3]: 0.090 - 0.120 Kg/m2[4]: 0.120 - 0.150 Kg/m2[5]: 0.150 - 0.180 Kg/m2[*]:other115

AMSR2 データ利用解説文書

７．HDF5 編(C 言語)
赤文字の解説はサンプルプログラムについて説明しています。
青文字の解説は関数リファレンスまたは衛星基礎知識について説明しています。

７．１ L1B データ読込み
７．１．１ サンプルプログラム readL1B_hdf5.c 解説
サンプルプログラム readL1B_hdf5.c では、L1B データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波緯度経度を算出し、内容をテキスト表示します。
TAI93 形式時刻の変換と低周波緯度経度の算出には、サブルーチンを用意しています。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

89G A ホーン緯度経度から算出するデータ* 緯度経度(低周波平均)- 緯度経度(6G)- 緯度経度(7G)- 緯度経度(10G)- 緯度経度(18G)- 緯度経度(23G)- 緯度経度(36G)
P.15 基礎知識編３．１０参照

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (6.9GHz,H)- Brightness Temperature (6.9GHz,V)- Brightness Temperature (7.3GHz,H)- Brightness Temperature (7.3GHz,V)- Brightness Temperature (10.7GHz,H)- Brightness Temperature (10.7GHz,V)- Brightness Temperature (18.7GHz,H)- Brightness Temperature (18.7GHz,V)- Brightness Temperature (23.8GHz,H)- Brightness Temperature (23.8GHz,V)- Brightness Temperature (36.5GHz,H)- Brightness Temperature (36.5GHz,V)- Brightness Temperature (89.0GHz-A,H)- Brightness Temperature (89.0GHz-A,V)- Brightness Temperature (89.0GHz-B,H)- Brightness Temperature (89.0GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

116

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
HDF5 用ヘッダーファイルをインクルードします。
2 #include <stdlib.h>
3 #include "hdf5.h"
時刻変換と緯度経度計算用サブルーチンヘッダーを
4 #include "amsr2time.h"
インクルードします。
5 #include "amsr2latlon.h"6
7 // fixed value
8 #define LMT 2200 // limit of NumberOfScans
9 #define AM2_DEF_SNUM_HI 486 // high resolution pixel width
10 #define AM2_DEF_SNUM_LO 243 // low resolution pixel width11
標準プロダクトのスキャン数上限は12 int main(int argc, char *argv[]){
2200 で充分ですが、
13// interface variable
準リアルプロダクトを使用する場合は、
14
int i,j;// loop variable
2 周回程度繋がる場合があるので、
15
herr_t ret;// return status
LMT=9000 としてください。
16
char *buf = NULL; // text buffer(標準の 4 パス分程度)
17char *fn = NULL; // filename
18
hid_t fhnd;// file handle
HDF5 用インターフェイス
19
hid_t ahnd;// attribute handle
20
hid_t atyp;// attribute type
変数を宣言します。
21
hid_t dhnd;// dataset handle
22
hid_t shnd;// dataspace handle
23
24// meta data
物理量名25char *geo = NULL; // GeophysicalName
メタデータ用変数
グラニュール ID
26
char *gid = NULL; // GranuleIDを宣言します。
観測開始時刻27
char *tm1 = NULL; // ObservationStartDateTime
28
char *tm2 = NULL; // EquatorCrossingDateTime 赤道通過時刻
観測終了時刻29
char *tm3 = NULL; // ObservationEndDateTime
スキャン数30
int num;// NumberOfScans
31
int ovr;// OverlapScans
オーバーラップスキャン数
32
double prm1[7]; // CoRegistrationParameterA1 相対レジストレーション係数 A133
double prm2[7]; // CoRegistrationParameterA2 相対レジストレーション係数 A2
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。
40
41
42
43

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
float lat89a[LMT][AM2_DEF_SNUM_HI]; // lat for 89a 緯度
float lat89b[LMT][AM2_DEF_SNUM_HI]; // lat for 89b

51
52

float lon89a[LMT][AM2_DEF_SNUM_HI]; // lon for 89a 経度
float lon89b[LMT][AM2_DEF_SNUM_HI]; // lon for 89b

60
61

85
86

float tb06h [LMT][AM2_DEF_SNUM_LO]; // tb for 06h
float tb06v [LMT][AM2_DEF_SNUM_LO]; // tb for 06v 輝度温度
品質フラグ
unsigned char pdq06h [LMT][AM2_DEF_SNUM_LO]; // pixel data quality for 06h
unsigned char pdq06v [LMT][AM2_DEF_SNUM_LO]; // pixel data quality for 06v
陸海フラグ
unsigned char lof06 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 06
unsigned char lof07 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 07

94
95

float ear_in[LMT][AM2_DEF_SNUM_LO]; // earth incidence 観測入射角
float ear_az[LMT][AM2_DEF_SNUM_LO]; // earth azimuth
観測方位角

76
77

117

配列データ用変数
を宣言します。

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
107
108
109
110
111
112
113

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}

ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値
114
115
116
117
118
119

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}118

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
121
122
123
124
125
126
127
128
129
130

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になります。
176
177
178
179
180
181
182
183
184
185
186

// read meta: NumberOfScansahnd = H5Aopen(fhnd, "NumberOfScans", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &buf);if(ret < 0){
printf("H5Aread error: NumberOfScans¥n");exit(1);}
メタデータは全て文字として取得されるので、
ret = H5Aclose(ahnd);
数値に変換しておきます。
num = atoi(buf);
printf("NumberOfScans: %d¥n", num);
メタデータから相対レジストレーション係数を読込みます。
相対レジストレーション係数は、低周波緯度経度を算出する際に必要になります。

209
210
211
212
213
214
215
216
217

// read meta: CoRegistrationParameterA1
ahnd = H5Aopen(fhnd, "CoRegistrationParameterA1", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
P.15 基礎知識編３．１０参照
ret = H5Aread(ahnd, atyp, &buf);if(ret < 0){
printf("H5Aread error: CoRegistrationParameterA1¥n");exit(1);}
ret = H5Aclose(ahnd);

119

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンします。
L1 データには前後にオーバーラップが含まれるので重複部分を取り除きます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。
◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値

P.11 基礎知識編３．５参照◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd);
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
265
266
267
268
269
読込み
270
271
272
273
274
275
276
重複除去
277
278
279
280
281
時刻変換
282
283
284
285
286
287
288
289
290

// read array: scantime
dhnd = H5Dopen(fhnd, "Scan Time", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, r8d1);
if(ret < 0){
printf("H5Dread error: Scan Time¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap
for(j = 0; j < num; ++j){r8d1[j] = r8d1[j + ovr];}
for(j = num; j < LMT; ++j){r8d1[j] = 0;}// convert
amsr2time_(&num, r8d1, st);// sample display
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、, st[0].hour
うるう秒を含めた 1993/01/01 からの通算秒です。
, st[0].minute
このままでは日時情報として扱い難いので、, st[0].second
このサンプルプログラムでは年/月/日/時/分/秒に変換する);
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
amsr2time_(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

120

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
89G 緯度経度は格納データを読込みます。
読込んだ後は、オーバーラップを取り除きます。
低周波緯度経度は、89G A ホーン緯度経度と相対レジストレーション係数から算出します。
292
293
294
295
296
297
緯度読込み
298
299
300
301
302
303
304
305
経度読込み
306
307
308
309
310
311
312
313
314
315
316
317
重複除去
318
319
320
321
:

// read array: latlon for 89a// read lat
dhnd = H5Dopen(fhnd ,"Latitude of Observation Point for 89A", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lat89a);if(ret < 0){
printf("H5Dread error: Latitude of Observation Point for 89A¥n");exit(1);}
ret = H5Dclose(dhnd);// read lon
dhnd = H5Dopen(fhnd ,"Longitude of Observation Point for 89A", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lon89a);if(ret < 0){
printf("H5Dread error: Longitude of Observation Point for 89A¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap
for(j = 0; j < num; ++j){AMSR2 センサには 6G/7G/10G/18G/23G/36G/89G のfor(i = 0; i < AM2_DEF_SNUM_HI; ++i){
7 つの観測周波数がありますが、それらの観測点緯
lat89a[j][i] = lat89a[j+ovr][i];度経度は正確には異なります。
lon89a[j][i] = lon89a[j+ovr][i];AMSR2 プロダクトに格納されているのは 89G 緯度経}度だけです。低周波の正確な緯度経度は 89G A ホー}for(j = num; j < LMT; ++j){
ン緯度経度と相対レジストレーション係数から算for(i = 0; i < AM2_DEF_SNUM_HI; ++i){ 出できます。
lat89a[j][i] = 0;
このサンプルプログラムでは低周波緯度経度を算
lon89a[j][i] = 0;
出するためのサブルーチンを用意しています。AMTK}を使用する場合は、低周波緯度経度は自動的に算出}されます。
→ P.15 基礎知識編３．１０参照

358 // read array: latlon for low mean359
amsr2latlon_(&num, &prm1[6], &prm2[6], lat89a, lon89a, latlm, lonlm);
低周波計算
360 printf("latlonlm[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", latlm[0][0],lonlm[0][0]);◆低周波緯度経度算出
amsr2latlon_(num,prm1,prm2,lat89a,lon89a,latlow,lonlow)
num: スキャン数を指定します
prm1: 相対レジストレーション係数 A1 を指定します(6G/7G/10G/18G/23G/36G/平均)
prm2: 相対レジストレーション係数 A2 を指定します(6G/7G/10G/18G/23G/36G/平均)
lat89a: 89G A ホーン緯度データを指定します
lon89a: 89G A ホーン経度データを指定します
latlow: [戻り値]指定した低周波の緯度データが返されます
lonlow: [戻り値]指定した低周波の経度データが返されます

121

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。
386
387
388
389
読込み
390
391
392
393
394
395
396
397
398
399
400
401
402
重複除去
403
404
405
406
407
408
409
410

// read array: tb for 06h
dhnd = H5Dopen(fhnd, "Brightness Temperature (6.9GHz,H)", H5P_DEFAULT);
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT); // get scale
スケール読込み
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);// get scale
ret = H5Aclose(ahnd);// get scale
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, tb06h);
if(ret < 0){
printf("H5Dread error: Brightness Temperature (6.9GHz,H)¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap & change scalefor(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
tb06h[j][i] = tb06h[j+ovr][i];if(tb06h[j][i] < 65534) tb06h[j][i] = tb06h[j][i] * sca;}
欠損値(65535)と異常値(65534)は除外して、}スケールを適用します。
for(j = num; j < LMT; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
tb06h[j][i] = 0;}}// sample display
printf("tb06h[scan=0][pixel=0]: %9.2f¥n", tb06h[0][0]);このスケール処理は AMTK を使用する場合は自動的に行われます。
→ P.16 基礎知識編３．１２参照

122

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 低周波品質フラグは 2 つの 1byte 整数型で 16 ビットの内 12 ビットが各低周波に対応します。
L1 高周波品質フラグは 1 つの 1byte 整数型で 8 ビットの内 4 ビットが各高周波に対応します。
802
803
804
読込み
805
806
807
808
809

// read array: pixel data quality for low
dhnd = H5Dopen(fhnd, "Pixel Data Quality 6 to 36", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, i1d2hi);
if(ret < 0){
printf("H5Dread error: Pixel Data Quality 6 to 36¥n");exit(1);}
ret = H5Dclose(dhnd);

L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。

810 // cutoff overlap & separate
811 for(j = 0; j < num; ++j){812
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
813
pdq06v[j][i]=0;814
if((i1d2hi[j+ovr][i*2+0] & 1) != 0) pdq06v[j][i]=1;815
if((i1d2hi[j+ovr][i*2+0] & 2) != 0) pdq06v[j][i]=10;816
if(((i1d2hi[j+ovr][i*2+0] & 1) != 0) && ((i1d2hi[j+ovr][i*2+0] & 2) !=0)) pdq06v[j][i]=11;817
pdq06h[j][i]=0;818
if((i1d2hi[j+ovr][i*2+0] & 4) != 0) pdq06h[j][i]=1;819
if((i1d2hi[j+ovr][i*2+0] & 8) != 0) pdq06h[j][i]=10;820if(((i1d2hi[j+ovr][i*2+0] & 4) != 0) && ((i1d2hi[j+ovr][i*2+0] & 8) !=0)) pdq06h[j][i]=11;821
pdq07v[j][i]=0;822
if((i1d2hi[j+ovr][i*2+0] & 16) != 0) pdq07v[j][i]=1;823
if((i1d2hi[j+ovr][i*2+0] & 32) != 0) pdq07v[j][i]=10;
ビット毎の
824
if(((i1d2hi[j+ovr][i*2+0] & 16) != 0) && ((i1d2hi[j+ovr][i*2+0] & 32) !=情報を各周波0)) pdq07v[j][i]=11;
数に分解
825
pdq07h[j][i]=0;826
if((i1d2hi[j+ovr][i*2+0] & 64) != 0) pdq07h[j][i]=1;
重複除去も
827
if((i1d2hi[j+ovr][i*2+0] & 128) != 0) pdq07h[j][i]=10;828if(((i1d2hi[j+ovr][i*2+0] & 64) != 0) && ((i1d2hi[j+ovr][i*2+0] & 128) !=行います0)) pdq07h[j][i]=11;
829
}
830 }
831 for(j = num; j < LMT; ++j){832
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
833
pdq06h[j][i]=0;834
pdq06v[j][i]=0;835
pdq07h[j][i]=0;836
pdq07v[j][i]=0;
837
}
838 }

123

AMSR2 データ利用解説文書◇L1B 陸海フラグデータ読込み ※左側の数字は行番号です
L1B 陸海は 1byte 整数型の 2 次元配列((スキャン数*チャンネル数)×ピクセル数)です。
低周波データは周波数が 6 チャンネル(6G/7G/10G/18G/23G/36G)あります。
P.14 基礎知識編３．９参照
高周波データは周波数が 2 チャンネル(89G A ホーン/89G B ホーン)あります。
876
877
878
879
読込み
880
881
882
883

// read array: land ocean flag for low
dhnd = H5Dopen(fhnd, "Land_Ocean Flag 6 to 36", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, loflo);
if(ret < 0){
printf("H5Dread error: Land_Ocean Flag 6 to 36¥n");exit(1);}
ret = H5Dclose(dhnd);

陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に 1byte 整数型の 2 次元配列を用意します。
884
885
886
887
888
889
890
各周波数に
891
分解します
892
893
894
895
重複除去も
896
行います
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915

// separate
for(j = 0; j < num+ovr*2; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=loflo[(num+ovr*2)*0+j][i];lof07[j][i]=loflo[(num+ovr*2)*1+j][i];lof10[j][i]=loflo[(num+ovr*2)*2+j][i];lof18[j][i]=loflo[(num+ovr*2)*3+j][i];lof23[j][i]=loflo[(num+ovr*2)*4+j][i];lof36[j][i]=loflo[(num+ovr*2)*5+j][i];}}// cutoff overlap
for(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=lof06[j+ovr][i];lof07[j][i]=lof07[j+ovr][i];lof10[j][i]=lof10[j+ovr][i];lof18[j][i]=lof18[j+ovr][i];lof23[j][i]=lof23[j+ovr][i];lof36[j][i]=lof36[j+ovr][i];}}for(j = num; j < LMT; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=0;
lof07[j][i]=0;
lof10[j][i]=0;
lof18[j][i]=0;
lof23[j][i]=0;
lof36[j][i]=0;
}
}

124

AMSR2 データ利用解説文書◇観測入射角データ読込み※左側の数字は行番号です

観測入射角は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、観測入射角に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
956 // read array: earth incidence
957 dhnd = H5Dopen(fhnd, "Earth Incidence", H5P_DEFAULT);
958 ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT); // getスケール読込み
scale
959 ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);// get scale
960 ret = H5Aclose(ahnd);// get scale
961 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
読込み
ear_in);962 if(ret < 0){963
printf("H5Dread error: Earth Incidence¥n");964
exit(1);965 }966 ret = H5Dclose(dhnd);
967 // cutoff overlap & change scale
968 for(j = 0; j < num; ++j){969
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){970
ear_in[j][i] = ear_in[j+ovr][i];971
if(ear_in[j][i] > -32767) ear_in[j][i] = ear_in[j][i] * sca;972}
欠損値(-32768)と異常値(-32767)は除外して、スケールを適用します。
973 }974 for(j = num; j < LMT; ++j){975
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
重複除去
976
ear_in[j][i] = 0;
977
}
978 }
979 // sample display
980 printf("ear_in[scan=0][pixel=0]: %9.2f¥n",ear_in[0][0]);◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
1008
1009
1010

// close
ret = H5Fclose(fhnd);
ret = H5close();◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値

125

AMSR2 データ利用解説文書

７．１．２ コンパイル方法(build_readL1B_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL1B_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc="readL1B_hdf5.c amsr2time_.c amsr2latlon_.c"
15
16 # output filename
17 out=readL1B_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1B_hdf5_c.sh
icc -g readL1B_hdf5.c amsr2time_.c amsr2latlon_.c -o readL1B_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

126

AMSR2 データ利用解説文書

７．１．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1B_hdf5_c GW1AM2_201207261145_055A_L1SGBTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGBTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGBTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans: 1979
limit of NumberOfScans = 2200
OverlapScans: 20
CoRegistrationParameterA1: 6G- 1.25000,7G- 1.00000,10
G- 1.25000,18G- 1.25000,23G- 1.25000,36G- 1.00000
CoRegistrationParameterA2: 6G- 0.00000,7G--0.10000,10
G--0.25000,18G- 0.00000,23G--0.25000,36G- 0.00000
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time[scan=0]: 2012/07/26 11:45:43
latlon89a[scan=0][pixel=0]: ( -73.3289, 136.7714)
latlon89b[scan=0][pixel=0]: ( -73.4038, 137.1498)
latlonlm[scan=0][pixel=0]: ( -73.3538, 136.6228)
latlon06[scan=0][pixel=0]: ( -73.3592, 136.6213)
latlon07[scan=0][pixel=0]: ( -73.3497, 136.6429)
latlon10[scan=0][pixel=0]: ( -73.3506, 136.6001)
latlon18[scan=0][pixel=0]: ( -73.3592, 136.6213)
latlon23[scan=0][pixel=0]: ( -73.3506, 136.6001)
latlon36[scan=0][pixel=0]: ( -73.3532, 136.6514)
tb06h[scan=0][pixel=0]:173.28tb06v[scan=0][pixel=0]:208.22
tb07h[scan=0][pixel=0]:173.07
tb07v[scan=0][pixel=0]:207.54
tb10h[scan=0][pixel=0]:170.94
tb10v[scan=0][pixel=0]:204.95127

tb18h[scan=0][pixel=0]:164.85
tb18v[scan=0][pixel=0]:199.84
tb23h[scan=0][pixel=0]:163.22
tb23v[scan=0][pixel=0]:196.53tb36h[scan=0][pixel=0]:156.56
tb36v[scan=0][pixel=0]:186.39tb89ah[scan=0][pixel=0]:163.76tb89av[scan=0][pixel=0]:179.27tb89bh[scan=0][pixel=0]:170.60tb89bv[scan=0][pixel=0]:
188.16pdq06h[scan=0][pixel=0]):0pdq06v[scan=0][pixel=0]):0pdq07h[scan=0][pixel=0]):0pdq07v[scan=0][pixel=0]): 0
pdq10h[scan=0][pixel=0]):0pdq10v[scan=0][pixel=0]):0pdq18h[scan=0][pixel=0]):0pdq18v[scan=0][pixel=0]):0pdq23h[scan=0][pixel=0]):0pdq23v[scan=0][pixel=0]):0pdq36h[scan=0][pixel=0]):0pdq36v[scan=0][pixel=0]):0pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
lof06[scan=0][pixel=0]: 100
lof07[scan=0][pixel=0]: 100
lof10[scan=0][pixel=0]: 100
lof18[scan=0][pixel=0]: 100
lof23[scan=0][pixel=0]: 100
lof36[scan=0][pixel=0]: 100
lof89a[scan=0][pixel=0]: 100
lof89b[scan=0][pixel=0]: 100
ear_in[scan=0][pixel=0]:
55.20
ear_az[scan=0][pixel=0]:144.76AMSR2 データ利用解説文書

７．２ L1R データ読込み
７．２．１ サンプルプログラム readL1R_hdf5.c 解説
サンプルプログラム readL1R_hdf5.c では、L1R データファイルから、以下のメタデータと格納データを読込んで、89G A ホーン緯度経度から低周波用緯度経度を抽出し、内容をテキスト表示します。
このサンプルプログラムでは、格納されている L1R 輝度温度の一部のみ取扱います。L1R 輝度温度データ一覧については、P.14「３．８ L1 リサンプリングデータ」を参照ください。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans- CoRegistrationParameterA1- CoRegistrationParameterA2

89G A ホーン緯度経度から抽出するデータ* 低周波用緯度経度
P.15 基礎知識編３．１０参照

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (res06,6.9GHz,H)- Brightness Temperature (res06,6.9GHz,V)- Brightness Temperature (res06,7.3GHz,H)- Brightness Temperature (res06,7.3GHz,V)- Brightness Temperature (res10,10.7GHz,H)- Brightness Temperature (res10,10.7GHz,V)- Brightness Temperature (res23,18.7GHz,H)- Brightness Temperature (res23,18.7GHz,V)- Brightness Temperature (res23,23.8GHz,H)- Brightness Temperature (res23,23.8GHz,V)- Brightness Temperature (res36,36.5GHz,H)- Brightness Temperature (res36,36.5GHz,V)- Brightness Temperature (res36,89.0GHz,H)- Brightness Temperature (res36,89.0GHz,V)- Brightness Temperature (original,89GHz-A,H)- Brightness Temperature (original,89GHz-A,V)- Brightness Temperature (original,89GHz-B,H)- Brightness Temperature (original,89GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

128

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "hdf5.h"
4 #include "amsr2time.h":

HDF5 用ヘッダーファイルをインクルードします。
時刻変換サブルーチンヘッダーをインクルードします。

6 // fixed value
7 #define LMT 2200 // limit of NumberOfScans
8 #define AM2_DEF_SNUM_HI 486 // high resolution pixel width
9 #define AM2_DEF_SNUM_LO 243 // low resolution pixel width10
標準プロダクトのスキャン数上限は
11 int main(int argc, char *argv[]){
2200 で充分ですが、
12// interface variable
準リアルプロダクトを使用する場合は、
13
int i,j;// loop variable
2 周回程度繋がる場合があるので、
14
herr_t ret;// return status
LMT=9000 としてください。
15
char *buf = NULL; // text buffer(標準の 4 パス分程度)
16char *fn = NULL; // filename17
hid_t fhnd;// file handle
HDF5 用インターフェイス
18
hid_t ahnd;// attribute handle
19
hid_t atyp;// attribute type
変数を宣言します。
20
hid_t dhnd;// dataset handle
21
hid_t shnd;// dataspace handle
22
23// meta data
物理量名24char *geo = NULL; // GeophysicalName
メタデータ用変数
グラニュール ID
25char *gid = NULL; // GranuleIDを宣言します。
観測開始時刻26
char *tm1 = NULL; // ObservationStartDateTime
27
char *tm2 = NULL; // EquatorCrossingDateTime 赤道通過時刻
観測終了時刻28
char *tm3 = NULL; // ObservationEndDateTime
スキャン数29
int num;// NumberOfScans30
int ovr;// OverlapScans
オーバーラップスキャン数
31
double prm1[7]; // CoRegistrationParameterA1 相対レジストレーション係数 A132
double prm2[7]; // CoRegistrationParameterA2 相対レジストレーション係数 A2
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。
39
40
41
42
:
44
45
:
47
48
:
65
66
:
74
75
:
81
82

// array data
緯度AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
float lat89ar[LMT][AM2_DEF_SNUM_HI]; // lat for 89a altitude revised
配列データ用変数
float lat89br[LMT][AM2_DEF_SNUM_HI]; // lat for 89b altitude
revisedを宣言します。
経度
float lon89ar[LMT][AM2_DEF_SNUM_HI]; // lon for 89a altitude revised
float lon89br[LMT][AM2_DEF_SNUM_HI]; // lon for 89b altitude revised
輝度温度
float tb06h06 [LMT][AM2_DEF_SNUM_LO]; // tb for 06h, resolution 06G
float tb06v06 [LMT][AM2_DEF_SNUM_LO]; // tb for 06v, resolution 06G
品質フラグ
unsigned char pdq06h [LMT][AM2_DEF_SNUM_LO]; // pixel data quality for 06h
unsigned char pdq06v [LMT][AM2_DEF_SNUM_LO]; // pixel data quality for 06v
陸海フラグ
unsigned char lof06 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 06
unsigned char lof10 [LMT ][AM2_DEF_SNUM_LO]; // land ocean flag for 10
float ear_in[LMT][AM2_DEF_SNUM_LO]; // earth incidence 観測入射角
float ear_az[LMT][AM2_DEF_SNUM_LO]; // earth azimuth
観測方位角

129

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
94
95
96
97
98
99
100

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}

ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値
101
102
103
104
105
106

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}130

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
108
109
110
111
112
113
114
115
116
117

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になります。
163
164
165
166
167
168
169
170
171
172
173

// read meta: NumberOfScansahnd = H5Aopen(fhnd, "NumberOfScans", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &buf);if(ret < 0){
printf("H5Aread error: NumberOfScans¥n");exit(1);}
メタデータは全て文字として取得されるので、
ret = H5Aclose(ahnd);
数値に変換しておきます。
num = atoi(buf);
printf("NumberOfScans: %d¥n", num);131

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンします。
L1 データには前後にオーバーラップが含まれるので重複部分を取り除きます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。
◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値

P.11 基礎知識編３．５参照◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd);
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
252
253
254
255
256
読込み257
258
259
260
261
262
263
重複除去
264
265
266
267
268
時刻変換
269
270
271
272
273
274
275
276
277

// read array: scantime
dhnd = H5Dopen(fhnd, "Scan Time", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, r8d1);
if(ret < 0){
printf("H5Dread error: Scan Time¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap
for(j = 0; j < num; ++j){r8d1[j] = r8d1[j + ovr];}
for(j = num; j < LMT; ++j){r8d1[j] = 0;}// convert
amsr2time_(&num, r8d1, st);// sample display
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、, st[0].hour
うるう秒を含めた 1993/01/01 からの通算秒です。
, st[0].minute
このままでは日時情報として扱い難いので、, st[0].second
このサンプルプログラムでは年/月/日/時/分/秒に変換する);
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
amsr2time_(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

132

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
89G 緯度経度は格納データを読込みます。
P.15 基礎知識編３．１０参照
読込んだ後は、オーバーラップを取り除きます。
低周波用緯度経度は、89G A ホーン緯度経度の 1 から数えて奇数番目を抽出します。
※C 言語の場合、0 から数えて偶数番目になります。
279
280
281
282
283
284
緯度読込み
285
286
287
288
289
290
291
292
経度読込み
293
294
295
296
297
298
299
300
301
302
303
304
重複除去
305
306
307
308
:

// read array: latlon for 89a altitude revised// read lat
dhnd = H5Dopen(fhnd ,"Latitude of Observation Point for 89A", H5P_DEFAULT);
ret = H5Dread(dhnd,H5T_NATIVE_FLOAT,H5S_ALL, H5S_ALL, H5P_DEFAULT, lat89ar);if(ret < 0){
printf("H5Dread error: Latitude of Observation Point for 89A¥n");exit(1);}
ret = H5Dclose(dhnd);// read lon
dhnd = H5Dopen(fhnd ,"Longitude of Observation Point for 89A", H5P_DEFAULT);
ret = H5Dread(dhnd,H5T_NATIVE_FLOAT,H5S_ALL, H5S_ALL, H5P_DEFAULT, lon89ar);if(ret < 0){
printf("H5Dread error: Longitude of Observation Point for 89A¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap
for(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_HI; ++i){
lat89ar[j][i] = lat89ar[j+ovr][i];lon89ar[j][i] = lon89ar[j+ovr][i];}}for(j = num; j < LMT; ++j){
for(i = 0; i < AM2_DEF_SNUM_HI; ++i){
lat89ar[j][i] = 0;
lon89ar[j][i] = 0;
}
}

345
346
347
低周波抽出
348
349
350
351

// read array: latlon for low resolution
for(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
latlr[j][i] = lat89ar[j][i * 2];lonlr[j][i] = lon89ar[j][i * 2];
}
}

133

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。
354
355
356
357
読込み358
359
360
361
362
363
364
365
366
367
368
369
370
重複除去
371
372
373
374
375
376
377
378

// read array: tb for 06h, resolution 06G
dhnd = H5Dopen(fhnd, "Brightness Temperature (res06,6.9GHz,H)", H5P_DEFAULT);
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT); // get scale
スケール読込み
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);// get scale
ret = H5Aclose(ahnd);// get scale
ret = H5Dread(dhnd,H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, tb06h06);
if(ret < 0){
printf("H5Dread error: Brightness Temperature (res06,6.9GHz,H)¥n");exit(1);}
ret = H5Dclose(dhnd);// cutoff overlap & change scalefor(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
tb06h06[j][i] = tb06h06[j+ovr][i];if(tb06h06[j][i] < 65534) tb06h06[j][i] = tb06h06[j][i] * sca;}
欠損値(65535)と異常値(65534)は除外して、}スケールを適用します。
for(j = num; j < LMT; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
tb06h06[j][i] = 0;}}// sample display
printf("tb06h06[scan=0][pixel=0]: %9.2f¥n", tb06h06[0][0]);このスケール処理は AMTK を使用する場合は自動的に行われます。
→ P.16 基礎知識編３．１２参照

134

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 低周波品質フラグは 2 つの 1byte 整数型で 16 ビットの内 12 ビットが各低周波に対応します。
L1 高周波品質フラグは 1 つの 1byte 整数型で 8 ビットの内 4 ビットが各高周波に対応します。
822
823
824
読込み
825
826
827
828
829

// read array: pixel data quality for low
dhnd = H5Dopen(fhnd, "Pixel Data Quality 6 to 36", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, i1d2hi);
if(ret < 0){
printf("H5Dread error: Pixel Data Quality 6 to 36¥n");exit(1);}
ret = H5Dclose(dhnd);

L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に unsigned char 型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
830 // cutoff overlap & separate
831 for(j = 0; j < num; ++j){832
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
833
pdq06v[j][i]=0;834
if((i1d2hi[j+ovr][i*2+0] & 1) != 0) pdq06v[j][i]=1;835
if((i1d2hi[j+ovr][i*2+0] & 2) != 0) pdq06v[j][i]=10;836
if(((i1d2hi[j+ovr][i*2+0] & 1) != 0) && ((i1d2hi[j+ovr][i*2+0] & 2) !=0)) pdq06v[j][i]=11;837
pdq06h[j][i]=0;838
if((i1d2hi[j+ovr][i*2+0] & 4) != 0) pdq06h[j][i]=1;839
if((i1d2hi[j+ovr][i*2+0] & 8) != 0) pdq06h[j][i]=10;840
if(((i1d2hi[j+ovr][i*2+0] & 4) != 0) && ((i1d2hi[j+ovr][i*2+0] & 8) !=0)) pdq06h[j][i]=11;841
pdq07v[j][i]=0;842
if((i1d2hi[j+ovr][i*2+0] & 16) != 0) pdq07v[j][i]=1;843
if((i1d2hi[j+ovr][i*2+0] & 32) != 0) pdq07v[j][i]=10;844
if(((i1d2hi[j+ovr][i*2+0] & 16) != 0) && ((i1d2hi[j+ovr][i*2+0] & 32) !=ビット毎の0)) pdq07v[j][i]=11;
情報を各周波845
pdq07h[j][i]=0;数に分解
846
if((i1d2hi[j+ovr][i*2+0] & 64) != 0) pdq07h[j][i]=1;847
if((i1d2hi[j+ovr][i*2+0] & 128) != 0) pdq07h[j][i]=10;
重複除去も
848
if(((i1d2hi[j+ovr][i*2+0] & 64) != 0) && ((i1d2hi[j+ovr][i*2+0] & 128) !=0)) pdq07h[j][i]=11;
行います
849
}
850 }
851 for(j = num; j < LMT; ++j){852
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
853
pdq06h[j][i]=0;854
pdq06v[j][i]=0;855
pdq07h[j][i]=0;856
pdq07v[j][i]=0;
857
}
858 }

135

AMSR2 データ利用解説文書◇L1R 陸海フラグデータ読込み ※左側の数字は行番号です
L1R 陸海は 1byte 整数型の 2 次元配列((スキャン数*チャンネル数)×ピクセル数)です。
低周波データは解像度が 4 チャンネル(6G/10G/23G/36G)あります。
P.14 基礎知識編３．９参照
高周波データは解像度が 2 チャンネル(89G A ホーン/89G B ホーン)あります。
896
897
898
899
読込み
900
901
902
903

// read array: land ocean flag for low
dhnd = H5Dopen(fhnd, "Land_Ocean Flag 6 to 36", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, loflo);
if(ret < 0){
printf("H5Dread error: Land_Ocean Flag 6 to 36¥n");exit(1);}
ret = H5Dclose(dhnd);

陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に 1byte 整数型の 2 次元配列を用意します。
904
905
906
907
908
909
910
各周波数に
911
分解します
912
913
914
915
重複除去も
916
行います
917
918
919
920
921
922
923
924
925
926
927
928
929

// separate
for(j = 0; j < num+ovr*2; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=loflo[(num+ovr*2)*0+j][i];lof10[j][i]=loflo[(num+ovr*2)*1+j][i];lof23[j][i]=loflo[(num+ovr*2)*2+j][i];lof36[j][i]=loflo[(num+ovr*2)*3+j][i];}}// cutoff overlap
for(j = 0; j < num; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=lof06[j+ovr][i];lof10[j][i]=lof10[j+ovr][i];lof23[j][i]=lof23[j+ovr][i];lof36[j][i]=lof36[j+ovr][i];}}for(j = num; j < LMT; ++j){
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
lof06[j][i]=0;
lof10[j][i]=0;
lof23[j][i]=0;
lof36[j][i]=0;
}
}

136

AMSR2 データ利用解説文書◇観測入射角データ読込み※左側の数字は行番号です

観測入射角は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、観測入射角に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
968 // read array: earth incidence
969 dhnd = H5Dopen(fhnd, "Earth Incidence", H5P_DEFAULT);
970 ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT); // getスケール読込み
scale
971 ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);// get scale
972 ret = H5Aclose(ahnd);// get scale
973 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
読込み
ear_in);974 if(ret < 0){975
printf("H5Dread error: Earth Incidence¥n");976
exit(1);977 }978 ret = H5Dclose(dhnd);
979 // cutoff overlap & change scale
980 for(j = 0; j < num; ++j){981
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
982
ear_in[j][i] = ear_in[j+ovr][i];983
if(ear_in[j][i] > -32767) ear_in[j][i] = ear_in[j][i] * sca;984}
欠損値(-32768)と異常値(-32767)は除外して、スケールを適用します。
985 }986 for(j = num; j < LMT; ++j){987
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
重複除去
988
ear_in[j][i] = 0;
989
}
990 }
991 // sample display
992 printf("ear_in[scan=0][pixel=0]: %9.2f¥n",ear_in[0][0]);◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
1020
1021
1022

// close
ret = H5Fclose(fhnd);
ret = H5close();◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値

137

AMSR2 データ利用解説文書

７．２．２ コンパイル方法(build_readL1R_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL1R_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc="readL1R_hdf5.c amsr2time_.c "1516 # output filename
17 out=readL1R_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1R_hdf5_c.sh
icc -g readL1R_hdf5.c amsr2time_.c -o readL1R_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

138

AMSR2 データ利用解説文書

７．２．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1R_hdf5_c GW1AM2_201207261145_055A_L1SGRTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGRTBR_000000
0.h5GeophysicalName: Brightness Temperature
GranuleID: GW1AM2_201207261145_055A_L1SGRTBR_0000000
ObservationStartDateTime: 2012-07-26T11:45:43.018Z
EquatorCrossingDateTime: 2012-07-26T12:12:37.848Z
ObservationEndDateTime: 2012-07-26T12:35:09.735Z
NumberOfScans: 1979
limit of NumberOfScans = 2200
OverlapScans: 20
CoRegistrationParameterA1: 6G- 0.00000,7G- 0.00000,10
G- 0.00000,18G- 0.00000,23G- 0.00000,36G- 0.00000
CoRegistrationParameterA2: 6G- 0.00000,7G- 0.00000,10
G- 0.00000,18G- 0.00000,23G- 0.00000,36G- 0.00000
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time[scan=0]: 2012/07/26 11:45:43
latlon89ar[scan=0][pixel=0]: ( -73.3581, 136.8432)
latlon89br[scan=0][pixel=0]: ( -73.4328, 137.2216)
latlonlr[scan=0][pixel=0]: ( -73.3581, 136.8432)
tb06h06[scan=0][pixel=0]:173.41
tb06v06[scan=0][pixel=0]:
208.09tb07h06[scan=0][pixel=0]:173.07
tb07v06[scan=0][pixel=0]:207.11
tb10h10[scan=0][pixel=0]:170.40tb10v10[scan=0][pixel=0]:204.58tb18h23[scan=0][pixel=0]:165.83
tb18v23[scan=0][pixel=0]:199.41
tb23h23[scan=0][pixel=0]:163.55
tb23v23[scan=0][pixel=0]:
195.90139

tb36h36[scan=0][pixel=0]:153.55
tb36v36[scan=0][pixel=0]:183.95tb89h36[scan=0][pixel=0]:163.86
tb89v36[scan=0][pixel=0]:
181.05tb89ah[scan=0][pixel=0]:163.76tb89av[scan=0][pixel=0]:179.27tb89bh[scan=0][pixel=0]:170.60tb89bv[scan=0][pixel=0]:
188.16pdq06h[scan=0][pixel=0]):0pdq06v[scan=0][pixel=0]):0pdq07h[scan=0][pixel=0]):0pdq07v[scan=0][pixel=0]):0pdq10h[scan=0][pixel=0]):0pdq10v[scan=0][pixel=0]):0pdq18h[scan=0][pixel=0]):0pdq18v[scan=0][pixel=0]):0pdq23h[scan=0][pixel=0]):0pdq23v[scan=0][pixel=0]):0pdq36h[scan=0][pixel=0]):0pdq36v[scan=0][pixel=0]):0pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
pdq89ah[scan=0][pixel=0]): 0
pdq89av[scan=0][pixel=0]): 0
lof06[scan=0][pixel=0]: 100
lof10[scan=0][pixel=0]: 100
lof23[scan=0][pixel=0]: 100
lof36[scan=0][pixel=0]: 100
lof89a[scan=0][pixel=0]: 100
lof89b[scan=0][pixel=0]: 100
ear_in[scan=0][pixel=0]:
55.20
ear_az[scan=0][pixel=0]:144.76AMSR2 データ利用解説文書

７．３ L2 低解像度データ読込み
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)が L2 低解像度です。降水量(PRC)は L2 高解像度を参照ください。
７．３．１ サンプルプログラム readL2L_hdf5.c 解説
サンプルプログラム readL2L_hdf5.c では、L2 低解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point* Longitude of Observation Point* Geophysical Data
* Pixel Data Quality
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

140

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
HDF5 用ヘッダーファイルをインクルードします。
2 #include <stdlib.h>
3 #include <string.h>
時刻変換サブルーチンヘッダーをインクルードします。
4 #include "hdf5.h"
5 #include "amsr2time.h"6
7 // fixed value
8 #define LMT 2200 // limit of NumberOfScans
9 #define AM2_DEF_SNUM_HI 486 // high resolution pixel width
10 #define AM2_DEF_SNUM_LO 243 // low resolution pixel width:
標準プロダクトのスキャン数上限は13 int main(int argc, char *argv[]){
2200 で充分ですが、
14 // interface variable
準リアルプロダクトを使用する場合は、
15 int i,j;// loop variable
2 周回程度繋がる場合があるので、
16 herr_t ret;// return status
LMT=9000 としてください。
17 char *buf = NULL; // text buffer(標準の 4 パス分程度)
18 char *fn = NULL; // filename
19 hid_t fhnd;// file handle
HDF5 用インターフェイス
20 hid_t ahnd;// attribute handle
21 hid_t atyp;// attribute type
変数を宣言します。
22 hid_t dhnd;// dataset handle
23
24 // meta data
物理量名25 char *geo = NULL; // GeophysicalName
グラニュール ID
26 char *gid = NULL; // GranuleID
メタデータ用変数
27 char *tm1 = NULL; // ObservationStartDateTime 観測開始時刻を宣言します。
28 char *tm2 = NULL; // EquatorCrossingDateTime
赤道通過時刻29 char *tm3 = NULL; // ObservationEndDateTime
観測終了時刻30 int num;// NumberOfScans
スキャン数
31 int ovr;// OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。

37
38
39
40
41
42
43
44
45
46

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
緯度
float lat[LMT][AM2_DEF_SNUM_LO]; // lat
float lon[LMT][AM2_DEF_SNUM_LO]; // lon
経度
float geo1[LMT][AM2_DEF_SNUM_LO]; // geophysical data layer 1 物理量
float geo2[LMT][AM2_DEF_SNUM_LO]; // geophysical data layer 2
float geotmp[LMT*2][AM2_DEF_SNUM_LO]; // geophysical data temporary
品質フラグ
unsigned char pdq1[LMT][AM2_DEF_SNUM_LO]; // pixel data quality layer 1
unsigned char pdq2[LMT][AM2_DEF_SNUM_LO]; // pixel data quality layer 2
unsigned char pdqtmp[LMT*2][AM2_DEF_SNUM_LO]; // pixel data quality temporary
配列データ用変数
を宣言します。

141

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
58
59
60
61
62
63

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}
ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値

65
66
67
68
69
70

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}142

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
72
73
74
75
76
77
78
79
80
81

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になります。

140
141
142
143
144
145
146
147
148
149
150

// read meta: NumberOfScansahnd = H5Aopen(fhnd, "NumberOfScans", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &buf);if(ret < 0){
printf("H5Aread error: NumberOfScans¥n");exit(1);}
メタデータは全て文字として取得されるので、
ret = H5Aclose(ahnd);
数値に変換しておきます。
num = atoi(buf);
printf("NumberOfScans: %d¥n", num);143

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンします。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。

◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd);
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
173
174
175
176
177
読込み
178
179
180
181
182
時刻変換
183
184
185
186
187
188
189
190
191

// read array: scantime
dhnd = H5Dopen(fhnd, "Scan Time", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, r8d1);
if(ret < 0){
printf("H5Dread error: Scan Time¥n");exit(1);}
ret = H5Dclose(dhnd);// convert
amsr2time_(&num, r8d1, st);// sample display
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、, st[0].hour
うるう秒を含めた 1993/01/01 からの通算秒です。
, st[0].minute
このままでは日時情報として扱い難いので、, st[0].second
このサンプルプログラムでは年/月/日/時/分/秒に変換する);
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
amsr2time_(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

144

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
P.15 基礎知識編３．１０参照

緯度経度データを読込みます。

200
201
202
203
204
205
緯度読込み
206
207
208
209
210
211
212
213
経度読込み
214
215
216
217
218

// read array: latlon// read lat
dhnd = H5Dopen(fhnd ,"Latitude of Observation Point", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lat);if(ret < 0){
printf("H5Dread error: Latitude of Observation Point¥n");exit(1);}
ret = H5Dclose(dhnd);// read lon
dhnd = H5Dopen(fhnd ,"Longitude of Observation Point", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lon);
if(ret < 0){
printf("H5Dread error: Longitude of Observation Point¥n");exit(1);}
ret = H5Dclose(dhnd);// sample display
printf("latlon[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", lat[0][0], lon[0][0]);145AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。

物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、物理量に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
213 // read array: geophysical data for 1 layer
214 if(strncmp(gid+29,"SND",3)!=0 && strncmp(gid+29,"SST",3)!=0 ){215
dhnd = H5Dopen(fhnd, "Geophysical Data", H5P_DEFAULT);
216// get scale
217
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);
スケール読込み218
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);219
ret = H5Aclose(ahnd);
220// read221
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, geo1);
222
if(ret < 0){
読込み
223
printf("H5Dread error: Geophysical Data¥n");224
exit(1);
225}
このスケール処理は AMTK を使用する場合は
226
ret = H5Dclose(dhnd);
自動的に行われます。
227// change scale→ P.16 基礎知識編３．１２参照
228
for(j = 0; j < num; ++j){229
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){
スケール処理230
if(geo1[j][i] > -32767) geo1[j][i] = geo1[j][i] * sca;231}
欠損値(-32768)と異常値(-32767)は除外して、232}
スケールを適用します。
233 }
234
2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。

235 // read array: geophysical data for 2 layer
236 if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){237
dhnd = H5Dopen(fhnd, "Geophysical Data", H5P_DEFAULT);
238// get scale
239
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);240
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);241
ret = H5Aclose(ahnd);242// read243
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
geotmp);244
if(ret < 0){245
printf("H5Dread error: Geophysical Data¥n");246
exit(1);247}
248
ret = H5Dclose(dhnd);249// separate & change scale250
for(j = 0; j < num; ++j){251
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){252
geo1[j][i] = geotmp[j*2][i*2+0];253
geo2[j][i] = geotmp[j*2][i*2+1];
254
if(geo1[j][i] > -32767) geo1[j][i] = geo1[j][i] * sca;
255
if(geo2[j][i] > -32767) geo2[j][i] = geo2[j][i] * sca;
256
}
257
}
258 }

146

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
積雪深(SND)、海面水温(SST)は品質フラグが 2 層あるのでこの 2 つとそれ以外で処理を分けています。

260
261
262
263
264
265
266
267
268
269
270

// read array: pixel data quality for 1 layer
if(strncmp(gid+29,"SND",3)!=0 && strncmp(gid+29,"SST",3)!=0 ){dhnd = H5Dopen(fhnd, "Pixel Data Quality", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, pdq1);
if(ret < 0){
printf("H5Dread error: Pixel Data Quality¥n");exit(1);}
ret = H5Dclose(dhnd);}

2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。
271 // read array: pixel data quality for 2 layer
272 if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){273// read274
dhnd = H5Dopen(fhnd, "Pixel Data Quality", H5P_DEFAULT);275
ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT,
pdqtmp);276
if(ret < 0){277
printf("H5Dread error: Pixel Data Quality¥n");278
exit(1);279}
280
ret = H5Dclose(dhnd);281// separate282
for(j = 0; j < num; ++j){283
for(i = 0; i < AM2_DEF_SNUM_LO; ++i){284
pdq1[j][i] = pdqtmp[num*0+j][i];285pdq2[j][i] = pdqtmp[num*1+j][i];
286
}
287
}
288 }
L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
314
315
316

// close
ret = H5Fclose(fhnd);
ret = H5close();◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

147

AMSR2 データ利用解説文書

７．３．２ コンパイル方法(build_readL2L_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL2L_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc="readL2L_hdf5.c amsr2time_.c "1516 # output filename
17 out=readL2L_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2L_hdf5_c.sh
icc -g readL2L_hdf5.c amsr2time_.c -o readL2L_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

148

AMSR2 データ利用解説文書

７．３．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2L_hdf5_c GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_201303011809_125D_L2SGCLWLA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans: 1972
limit of NumberOfScans = 2200
OverlapScans: 0
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time[scan=0]: 2013/03/01 18:09:10
latlon[scan=0][pixel=0]: ( 84.4574, -78.1076)
geo1[scan=0][pixel=0]: -32767.000 [Kg/m2] (PDQ:112)

149

AMSR2 データ利用解説文書

７．４ L2 高解像度データ読込み
降水量(PRC)が L2 高解像度です。
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)は L2 低解像度を参照ください。
７．４．１ サンプルプログラム readL2H_hdf5.c 解説
サンプルプログラム readL2H_hdf5.c では、L2 高解像度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ* GeophysicalName- GranuleID- ObservationStartDateTime- EquatorCrossingDateTime- ObservationEndDateTime* NumberOfScans- OverlapScans

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B* Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Geophysical Data for 89A- Geophysical Data for 89B* Pixel Data Quality for 89A- Pixel Data Quality for 89B
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

150

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
HDF5 用ヘッダーファイルをインクルードします。
2 #include <stdlib.h>
3 #include <string.h>
時刻変換サブルーチンヘッダーをインクルードします。
4 #include "hdf5.h"
5 #include "amsr2time.h"6
7 // fixed value
8 #define LMT 2200 // limit of NumberOfScans
9 #define AM2_DEF_SNUM_HI 486 // high resolution pixel width
10 #define AM2_DEF_SNUM_LO 243 // low resolution pixel width:
標準プロダクトのスキャン数上限は13 int main(int argc, char *argv[]){
2200 で充分ですが、
14 // interface variable
準リアルプロダクトを使用する場合は、
15 int i,j;// loop variable
2 周回程度繋がる場合があるので、
16 herr_t ret;// return status
LMT=9000 としてください。
17 char *buf = NULL; // text buffer(標準の 4 パス分程度)
18 char *fn = NULL; // filename
19 hid_t fhnd;// file handle
HDF5 用インターフェイス
20 hid_t ahnd;// attribute handle
21 hid_t atyp;// attribute type
変数を宣言します。
22 hid_t dhnd;// dataset handle
23
24 // meta data
物理量名25 char *geo = NULL; // GeophysicalName
グラニュール ID
26 char *gid = NULL; // GranuleID
メタデータ用変数
27 char *tm1 = NULL; // ObservationStartDateTime 観測開始時刻を宣言します。
28 char *tm2 = NULL; // EquatorCrossingDateTime
赤道通過時刻29 char *tm3 = NULL; // ObservationEndDateTime
観測終了時刻30 int num;// NumberOfScans
スキャン数
31 int ovr;// OverlapScans
オーバーラップスキャン数
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。

37
38
39
40
41
42
43
44
45
46

// array data
AM2_COMMON_SCANTIME st[LMT]; // scantime 時刻
float lat89a[LMT][AM2_DEF_SNUM_HI]; // lat for 89a
float lat89b[LMT][AM2_DEF_SNUM_HI]; // lat for 89b
float lon89a[LMT][AM2_DEF_SNUM_HI]; // lon for 89a
float lon89b[LMT][AM2_DEF_SNUM_HI]; // lon for 89b
float geo1_89a[LMT][AM2_DEF_SNUM_HI];
float geo1_89b[LMT][AM2_DEF_SNUM_HI];
unsigned char pdq1_89a[LMT][AM2_DEF_SNUM_HI];
unsigned char pdq1_89b[LMT][AM2_DEF_SNUM_HI];

緯度
経度
物理量
品質フラグ
配列データ用変数
を宣言します。

151

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
58
59
60
61
62
63

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}
ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値

65
66
67
68
69
70

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}152

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
72
73
74
75
76
77
78
79
80
81

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メタデータからスキャン数を読込みます。
配列データ読込みではスキャン数の指定が必要になります。

133
134
135
136
137
138
139
140
141
142
143

// read meta: NumberOfScansahnd = H5Aopen(fhnd, "NumberOfScans", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &buf);if(ret < 0){
printf("H5Aread error: NumberOfScans¥n");exit(1);}
メタデータは全て文字として取得されるので、
ret = H5Aclose(ahnd);
数値に変換しておきます。
num = atoi(buf);
printf("NumberOfScans: %d¥n", num);

153

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンします。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。

◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd);
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
166
167
168
169
170
読込み
171
172
173
174
175
時刻変換
176
177
178
179
180
181
182
183
184

// read array: scantime
dhnd = H5Dopen(fhnd, "Scan Time", H5P_DEFAULT);
ret = H5Dread(dhnd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, r8d1);
if(ret < 0){
printf("H5Dread error: Scan Time¥n");exit(1);}
ret = H5Dclose(dhnd);// convert
amsr2time_(&num, r8d1, st);// sample display
printf("time[scan=0]: %04d/%02d/%02d %02d:%02d:%02d¥n", st[0].year, st[0].month, st[0].day
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、, st[0].hour
うるう秒を含めた 1993/01/01 からの通算秒です。
, st[0].minute
このままでは日時情報として扱い難いので、, st[0].second
このサンプルプログラムでは年/月/日/時/分/秒に変換する);
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
amsr2time_(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

154

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
P.15 基礎知識編３．１０参照

緯度経度データを読込みます。

186 // read array: latlon for 89a
187 // read lat
188 dhnd = H5Dopen(fhnd ,"Latitude of Observation Point for 89A", H5P_DEFAULT);
189 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lat89a);
190 if(ret < 0){
191
printf("H5Dread error: Latitude of Observation Point for 89A¥n");
緯度読込み
192
exit(1);
193 }194 ret = H5Dclose(dhnd);
195 // read lon
196 dhnd = H5Dopen(fhnd ,"Longitude of Observation Point for 89A", H5P_DEFAULT);
197 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, lon89a);
198 if(ret < 0){
199
printf("H5Dread error: Longitude of Observation Point for 89A¥n");
経度読込み
200
exit(1);201 }202 ret = H5Dclose(dhnd);
203 // sample display
204 printf("latlon89a[scan=0][pixel=0]: (%9.4f,%9.4f)¥n", lat89a[0][0],lon89a[0][0]);◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、物理量に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
226 // read array: geophysical data for 1 layer for 89a
227 dhnd = H5Dopen(fhnd, "Geophysical Data for 89A", H5P_DEFAULT);
228 // get scale
229 ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);
230 ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);
スケール読込み
231 ret = H5Aclose(ahnd);
232 // read
233 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
geo1_89a);
234 if(ret < 0){
読込み
235
printf("H5Dread error: Geophysical Data for 89A¥n");236
exit(1);
このスケール処理は AMTK を使用する場合は
237 }238 ret = H5Dclose(dhnd);
自動的に行われます。
239 // change scale→ P.16 基礎知識編３．１２参照
240 for(j = 0; j < num; ++j){241
for(i = 0; i < AM2_DEF_SNUM_HI; ++i){
スケール処理242
if(geo1_89a[j][i] > -32767) geo1_89a[j][i] = geo1_89a[j][i] * sca;243}
欠損値(-32768)と異常値(-32767)は除外して、
244 }スケールを適用します。

155

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。

266 // read array: pixel data quality for 1 layer for 89a
267 dhnd = H5Dopen(fhnd, "Pixel Data Quality for 89A", H5P_DEFAULT);
268 ret = H5Dread(dhnd, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT,
pdq1_89a);
269 if(ret < 0){
270
printf("H5Dread error: Pixel Data Quality for 89A¥n");271
exit(1);272 }273 ret = H5Dclose(dhnd);
L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
314
315
316

// close
ret = H5Fclose(fhnd);
ret = H5close();◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

156

AMSR2 データ利用解説文書

７．４．２ コンパイル方法(build_readL2H_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL2H_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc="readL2H_hdf5.c amsr2time_.c "1516 # output filename
17 out=readL2H_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2H_hdf5_c.sh
icc -g readL2H_hdf5.c amsr2time_.c -o readL2H_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

157

AMSR2 データ利用解説文書

７．４．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2H_hdf5_c GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
GeophysicalName: Precipitation
GranuleID: GW1AM2_201303011809_125D_L2SGPRCHA0000000
ObservationStartDateTime: 2013-03-01T18:09:10.122Z
EquatorCrossingDateTime: 2013-03-01T18:35:54.849Z
ObservationEndDateTime: 2013-03-01T18:58:26.342Z
NumberOfScans: 1972
limit of NumberOfScans = 2200
OverlapScans: 0
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time[scan=0]: 2013/03/01 18:09:10
latlon89a[scan=0][pixel=0]: ( 84.4188, -77.9502)
latlon89b[scan=0][pixel=0]: ( 84.3305, -78.8925)
geo1_89a[scan=0][pixel=0]: -32767.0 [mm/h] (PDQ: 16)
geo1_89b[scan=0][pixel=0]: -32767.0 [mm/h] (PDQ: 16)

158

AMSR2 データ利用解説文書

７．５ L3 輝度温度データ読込み
７．５．１ サンプルプログラム readL3B_hdf5.c 解説
サンプルプログラム readL3B_hdf5.c では、L3 輝度温度データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Brightness Temperature (H)- Brightness Temperature (V)以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

159

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
HDF5 用ヘッダーファイルをインクルードします。
2 #include <stdlib.h>
3 #include <string.h>
4 #include "hdf5.h":
9 int main(int argc, char *argv[]){
10 // interface variable
11 int i,j;// loop variable
12 herr_t ret;// return status
13 char *buf = NULL; // text buffer
14 char *fn = NULL; // filename
15 hid_t fhnd;// file handle
16 hid_t ahnd;// attribute handle
17 hid_t atyp;// attribute typeHDF5 用インターフェイス
18 hid_t dhnd;// dataset handle
変数を宣言します。
19 hid_t shnd;// dataspace handle
20 hsize_t sz1[3];// array size 1
21 hsize_t sz2[3];// array size 2
22 int x;// grid size x
23 int y;// grid size y:
31 // meta data
メタデータ用変数
32 char *geo = NULL; // GeophysicalName 物理量名
33 char *gid = NULL; // GranuleIDを宣言します。
グラニュール ID
34:
38 // array data
配列データ用変数
39 float *tbH; // brightness temperature for horizontal
輝度温度 を宣言します。
40 float *tbV; // brightness temperature for vertical
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
52
53
54
55
56
57

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}
ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値

59
60
61
62
63
64

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}160

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
66
67
68
69
70
71
72
73
74
75

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

161

AMSR2 データ利用解説文書◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値◇データスペースのオープン
shnd = H5Dget_space(dhnd)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
失敗の場合は負の値◇データセットのサイズ取得
ret = H5Sget_simple_extent_dims(shnd,sz1,sz2)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
101 // get grid size
102 dhnd = H5Dopen(fhnd ,"Brightness Temperature (H)", H5P_DEFAULT);
103 shnd = H5Dget_space(dhnd);
104 ret = H5Sget_simple_extent_dims(shnd,sz1,sz2);
105 if(ret < 0){106
printf("H5Sget_simple_extent_dims error: Brightness Temperature (H)¥n");107
exit(1);108 }109 ret = H5Sclose(shnd);
110 ret = H5Dclose(dhnd);
111 x=sz1[1];112 y=sz1[0];113 printf("grid size x: %d¥n", x);
114 printf("grid size y: %d¥n", y);115◇データスペースのクローズ
ret = H5Sclose(shnd)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メモリ領域を確保します。
116
117
118
119
120
121

// memory allocate
tbH=malloc(sizeof(float)*x*y);if(tbH==NULL){
printf("memory allocate error: tbH¥n");exit(1);}162

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。
◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
128 // read horizontal
129 dhnd = H5Dopen(fhnd, "Brightness Temperature (H)", H5P_DEFAULT);
130 // get scale
131 ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);
スケール読込み
132 ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);
133 ret = H5Aclose(ahnd);
134 // read
135 ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, tbH);
136 if(ret < 0){
読込み
137
printf("H5Dread error: Brightness Temperature (H)¥n");138
exit(1);
139 }このスケール処理は AMTK を使用する場合は
140 ret = H5Dclose(dhnd);
自動的に行われます。
141 // change scale→ P.16 基礎知識編３．１２参照
142 for(j = 0; j < y; ++j){143
for(i = 0; i < x; ++i){
スケール処理144
if(tbH[x*j+i] < 65534) tbH[x*j+i] = tbH[x*j+i] * sca;145}
欠損値(65535)と異常値(65534)は除外して、146 }スケールを適用します。

◇終了処理 ※左側の数字は行番号です
メモリを開放します。
252
253
254

// memory free
free(tbH);
free(tbV);
ファイルをクローズします。HDF5 を終了します。
◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
256 // close
257 ret = H5Fclose(fhnd);
258 ret = H5close();163

AMSR2 データ利用解説文書

７．５．２ コンパイル方法(build_readL3B_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL3B_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc=readL3B_hdf5.c
15
16 # output filename
17 out=readL3B_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3B_hdf5_c.sh
icc -g readL3B_hdf5.c -o readL3B_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

164

AMSR2 データ利用解説文書

７．５．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3B_hdf5_c GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
GeophysicalName: Brightness Temperature (6GHz)
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110
grid size x: 1440
grid size y: 720
ASCII ART OF HORIZONTAL BRIGHTNESS TEMPERATURE (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||411233344443444444444444444444444444444444444444444444443344322222244444||111134311113444444444444444444444444444444444444444444444444434233343111||124523445555555544444444444444443431234344414455544444444444211211111111||154544444444444444444444444544111111111111111113554444444442221111111112||412242554414444544444445341131111111111111111111455544445511111111111115||444444444424445554455554411111111111111111111111155555351111111111111124||444444442444111555155531111111111111111112111111111551511411111111111444||555555555551111121111311121111111111111111111111111111141554111111111155||115555555111111111115155311111111111111111111111111111114555554111111111||111555553111111111111111421111312111111111111111111111111555555551111111||111555521511111111111111455555111111111111111111111111111145555521111111||111155511111111111111113555555511111111111111111111111111154552111111111||111111111111111111111111111111111113111111111111111111111155111111111111||111111111111111111111111111111111111111111111111111111111351111111111111||111111111111111111111111111111111111111111111111111111111111111111111111||343323444333342434334344444444433433211111111111111111111344444441111133||333333333333333333333333333333334333333322222333333344334433333333333333|+------------------------------------------------------------------------+

165

AMSR2 データ利用解説文書

ASCII ART OF VERTICAL BRIGHTNESS TEMPERATURE (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||433344444444455455444444444444444444444454444444444444444444433333244545||333345433334554554444544444444444444444444545444444444444445544344344333||335534455555555555554555445455554443345455434555554444554444333333333333||355555555555555555455555555554333333333333333334555555555543333333333333||433343555535555555555555453343333333333333333333555555555533333333333335||555555555545555555555555533333333333333333333333355555453333333333333335||555555553555333555355543333333333333333333333333333553533433333333333555||655566655553333333333433343333333333333333333333333333353555333333333355||335555556333333333335355433333333333333333333333333333335555554333333333||333555554333333333333333433333433333333333333333333333333555555563333333||333555533533333333333333566665333333333333333333333333333355555543333333||333365533333333333333334666666533333333333333333333333333355554333333333||333333333333333333333333333333333334333333333333333333333355333333333333||333333333333333333333333333333333333333333333333333333333453333333333333||333333333333333333333333333333333333333333333333333333333333333333333333||444334444444443444444444444444444444333333333333333333333444555543333344||444444443344444444443333443444444444444444334444444444444444444444444444|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[1]: 50-100K[2]:100-150K[3]:150-200K[4]:200-250K[5]:250-300K[6]:300-350K[*]:other

166

AMSR2 データ利用解説文書

７．６ L3 物理量データ読込み
７．６．１ サンプルプログラム readL3G_hdf5.c 解説
サンプルプログラム readL3G_hdf5.c では、L3 物理量データファイルから、以下のメタデータと格納データを読込んで、内容をテキスト表示します。
メタデータ* GeophysicalName- GranuleID

格納データ* Geophysical Data

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

167

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です
1 #include <stdio.h>
HDF5 用ヘッダーファイルをインクルードします。
2 #include <stdlib.h>
3 #include <string.h>
4 #include "hdf5.h":
9 int main(int argc, char *argv[]){
10 // interface variable
11 int i,j;// loop variable
12 herr_t ret;// return status
13 char *buf = NULL; // text buffer
14 char *fn = NULL; // filename
15 hid_t fhnd;// file handle
16 hid_t ahnd;// attribute handle
17 hid_t atyp;// attribute typeHDF5 用インターフェイス
18 hid_t dhnd;// dataset handle
変数を宣言します。
19 hid_t shnd;// dataspace handle
20 hsize_t sz1[3];// array size 1
21 hsize_t sz2[3];// array size 2
22 int x;// grid size x
23 int y;// grid size y:
33 // meta data
メタデータ用変数
34 char *geo = NULL; // GeophysicalName 物理量名
35 char *gid = NULL; // GranuleIDを宣言します。
グラニュール ID:
40 // array data
配列データ用変数
41 float *geo1; // geophysical data layer 1
輝度温度 を宣言します。
42 float *geo2; // geophysical data layer 2
43 float *geotmp; // geophysical data temporary
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
ret = H5open();ret: [戻り値]失敗の場合は負の値
55
56
57
58
59
60

// hdf5 initialize
ret = H5open();if(ret < 0){
printf("h5open error: %d¥n" ,ret);exit(1);}
ファイルをオープンします。
◇HDF5 ファイルオープン
fhnd = H5Fopen(fn, label1, label2);
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY で読込専用になりますlabel2: H5P_DEFAULT を指定します
fhnd: [戻り値]開いたファイルのハンドル値、失敗の場合は負の値

62
63
64
65
66
67

// openfhnd = H5Fopen(fn, H5F_ACC_RDONLY, H5P_DEFAULT);
if(fhnd < 0){
printf("H5Fopen error: %s¥n", fn);exit(1);}168

AMSR2 データ利用解説文書◇メタデータ読込み※左側の数字は行番号です

メタデータを読込むには、ファイルに付属しているアトリビュートを H5Aopen()でオープンします。
アトリビュートの型を調べてからデータを読込みます。
不要になったハンドルはクローズします。
◇アトリビュートのオープン
ahnd = H5Aopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: アトリビュート名を指定します
label: H5P_DEFAULT を指定します
ahnd: [戻り値]アトリビュートのハンドル値
失敗の場合は負の値◇アトリビュートタイプの取得
atyp = H5Aget_type(ahnd);
ahnd: アトリビュートハンドル値を指定します
atyp: [戻り値]アトリビュートタイプ値
失敗の場合は負の値◇アトリビュート読込み
ret = H5Aread(ahnd, otyp, buf);
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
69
70
71
72
73
74
75
76
77
78

// read meta: GeophysicalName
ahnd = H5Aopen(fhnd, "GeophysicalName", H5P_DEFAULT);
atyp = H5Aget_type(ahnd);
ret = H5Aread(ahnd, atyp, &geo);if(ret < 0){
printf("H5Aread error: GeophysicalName¥n");exit(1);}
ret = H5Aclose(ahnd);
printf("GeophysicalName: %s¥n", geo);◇アトリビュートのクローズ
ret = H5Aclose(ahnd);
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

169

AMSR2 データ利用解説文書◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
◇データセットのオープン
dhnd = H5Dopen(fhnd, nam, label);fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
label: H5P_DEFAULT を指定します
dhnd: [戻り値]データセットのハンドル値
失敗の場合は負の値◇データスペースのオープン
shnd = H5Dget_space(dhnd)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
失敗の場合は負の値◇データセットのサイズ取得
ret = H5Sget_simple_extent_dims(shnd,sz1,sz2)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
105 // get grid size
106 dhnd = H5Dopen(fhnd ,"Geophysical Data", H5P_DEFAULT);
107 shnd = H5Dget_space(dhnd);
108 ret = H5Sget_simple_extent_dims(shnd,sz1,sz2);
109 if(ret < 0){110
printf("H5Sget_simple_extent_dims error: Geophysical Data¥n");111
exit(1);112 }113 ret = H5Sclose(shnd);
114 ret = H5Dclose(dhnd);
115 x=sz1[1];116 y=sz1[0];117 printf("grid size x: %d¥n", x);
118 printf("grid size y: %d¥n", y);◇データスペースのクローズ
ret = H5Sclose(shnd)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
ret = H5Dclose(dhnd)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メモリ領域を確保します。
120
121
122
123
124
125

// memory allocate layer 1
geo1=malloc(sizeof(float)*x*y);if(geo1==NULL){
printf("memory allocate error: geo1¥n");exit(1);}170

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、物理量に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
◇データ読込み
ret = H5Dread(dhnd, otyp, label1, label2, label3, buf);
dhnd: データセットハンドル値を指定します
otyp: 出力変数の型を指定します(読込んだデータは、出力変数の型へ自動変換されます)label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL を指定します
label3: H5P_DEFAULT を指定します
buf: 出力変数を指定します
ret: [戻り値]失敗の場合は負の値
141 // read layer 1
142 if(strncmp(gid+29,"SND",3)!=0 && strncmp(gid+29,"SST",3)!=0 ){143dhnd = H5Dopen(fhnd, "Geophysical Data", H5P_DEFAULT);
144// get scale
145
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);
スケール読込み146
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);147
ret = H5Aclose(ahnd);
148// read149
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, geo1);150
if(ret < 0){
読込み
151
printf("H5Dread error: Geophysical Data¥n");152
exit(1);
153}
このスケール処理は AMTK を使用する場合は
154
ret = H5Dclose(dhnd);
自動的に行われます。
155// change scale→ P.16 基礎知識編３．１２参照
156
for(j = 0; j < y; ++j){157
for(i = 0; i < x; ++i){
スケール処理158
if(geo1[x*j+i] > -32767) geo1[x*j+i] = geo1[x*j+i] * sca;159}
欠損値(-32768)と異常値(-32767)は除外して、160}
スケールを適用します。
161 }

171

AMSR2 データ利用解説文書

2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。
163 // read layer 1 & 2
164 if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){165
dhnd = H5Dopen(fhnd, "Geophysical Data", H5P_DEFAULT);
166// get scale
167
ahnd = H5Aopen(dhnd, "SCALE FACTOR", H5P_DEFAULT);
168
ret = H5Aread(ahnd, H5T_NATIVE_FLOAT, &sca);
169
ret = H5Aclose(ahnd);170// read171
ret = H5Dread(dhnd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
geotmp);172
if(ret < 0){173
printf("H5Dread error: Geophysical Data¥n");174
exit(1);
175}
176
ret = H5Dclose(dhnd);
177// separate
178
for(j = 0; j < y; ++j){179
for(i = 0; i < x; ++i){180
geo1[x*j+i] = geotmp[x*j*2+i*2+0];181
geo2[x*j+i] = geotmp[x*j*2+i*2+1];
182
}
183
}
184
// change scale185
for(j = 0; j < y; ++j){186
for(i = 0; i < x; ++i){187
if(geo1[x*j+i] > -32767) geo1[x*j+i] = geo1[x*j+i] * sca;
188
if(geo2[x*j+i] > -32767) geo2[x*j+i] = geo2[x*j+i] * sca;
189
}
190
}
191 }

◇終了処理 ※左側の数字は行番号です
メモリを開放します。
373
374
375
376
377

// memory free
free(geo1);
if(strncmp(gid+29,"SND",3)==0 || strncmp(gid+29,"SST",3)==0 ){free(geo2);}
ファイルをクローズします。HDF5 を終了します。
◇HDF5 の終了
ret = H5close();ret: [戻り値]失敗の場合は負の値◇ファイルのクローズ
ret = H5Fclose(fhnd);
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
379 // close
380 ret = H5Fclose(fhnd);
381 ret = H5close();172

AMSR2 データ利用解説文書

７．６．２ コンパイル方法(build_readL3G_hdf5_c.sh 解説)
コンパイルに使用するスクリプト build_readL3G_hdf5_c.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(icc)または PG コンパイラ(pgcc)または GNU コンパイラ(gcc)を指定します。
10 # compiler
11 cc=icc
12
13 # source filename
14 csrc=readL3G_hdf5.c
15
16 # output filename
17 out=readL3G_hdf5_c
18
19 # library order
20 lib="-lhdf5_hl -lhdf5 -lsz -lz -lm"
21
22 # c compile
23 cmd="$cc -g $csrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3G_hdf5_c.sh
icc -g readL3G_hdf5.c -o readL3G_hdf5_c-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5_hl -lhdf5 -lsz -lz -lm~

173

AMSR2 データ利用解説文書

７．６．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3G_hdf5_c GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
GeophysicalName: Cloud Liquid Water
GranuleID: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000
grid size x: 1440
grid size y: 720
ASCII ART OF GEOPHYSICAL DATA LAYER #1 (X/20GRID Y/40GRID)+------------------------------------------------------------------------+|||#21#####################################################################||2212###1113##########################################################222||1##################################11######3################011#42223322||2#############################00101112413333233###############343413131#||#20#######2###############00#1223452344213211120##########3355421131121#||#########################4#3222223232100110111110#######14*41111201111##||########0###000###0####111111112101201110*131121100##1#11#01211110100###||###########1011111111#211#11111210011121333223224321000#1###1111000000##||11#######00010122125#3###1#12232321100010020110001011122#######222321111||000######122131112311112#01112#11312212323110100000000110########1001110||100####32#12111141111000######2232322421212441331110011010######11111100||1000###1211232211251100########131112232110121313122011010#####231111001||11131212231110111111211111110012102#1231221223311213111021##011124223242||*33222511232222222223223331421022422322211024222222122113##0111421221132||101122112221111222111111111222312232232331243321212323221223312232222111||####################################311122122221112111221########21221##||########################################################################|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[0]: 0.000 - 0.030 Kg/m2[1]: 0.030 - 0.060 Kg/m2[2]: 0.060 - 0.090 Kg/m2[3]: 0.090 - 0.120 Kg/m2[4]: 0.120 - 0.150 Kg/m2[5]: 0.150 - 0.180 Kg/m2[*]:other174

AMSR2 データ利用解説文書

８．HDF5 編(FORTRAN90)
赤文字の解説はサンプルプログラムについて説明しています。
青文字の解説は関数リファレンスまたは衛星基礎知識について説明しています。

８．１ L1B データ読込み
８．１．１ サンプルプログラム readL1B_hdf5.f 解説
サンプルプログラム readL1B_hdf5.f では、L1B データファイルから、以下の格納データを読込ん
で、89G A ホーン緯度経度から低周波緯度経度を算出し、内容をテキスト表示します。
TAI93 形式時刻の変換と低周波緯度経度の算出には、サブルーチンを用意しています。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文字
列メタデータを読込めません。
* NumberOfScans は配列サイズから調べます。
以下の 3 つは固定値を使用します。
* OverlapScans* CoRegistrationParameterA1* CoRegistrationParameterA2

89G A ホーン緯度経度から算出するデータ* 緯度経度(低周波平均)- 緯度経度(6G)- 緯度経度(7G)- 緯度経度(10G)- 緯度経度(18G)- 緯度経度(23G)- 緯度経度(36G)
P.15 基礎知識編３．１０参照

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B- Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (6.9GHz,H)- Brightness Temperature (6.9GHz,V)- Brightness Temperature (7.3GHz,H)- Brightness Temperature (7.3GHz,V)- Brightness Temperature (10.7GHz,H)- Brightness Temperature (10.7GHz,V)- Brightness Temperature (18.7GHz,H)- Brightness Temperature (18.7GHz,V)- Brightness Temperature (23.8GHz,H)- Brightness Temperature (23.8GHz,V)- Brightness Temperature (36.5GHz,H)- Brightness Temperature (36.5GHz,V)- Brightness Temperature (89.0GHz-A,H)- Brightness Temperature (89.0GHz-A,V)- Brightness Temperature (89.0GHz-B,H)- Brightness Temperature (89.0GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

175

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none
4 C include
5
include 'amsr2time_f.h'
時刻変換用サブルーチンヘッダーを:インクルードします。
8 C fixed value
9
integer(4),parameter::LMT=2200 ! limit of NumberOfScans10
integer(4),parameter::AM2_DEF_SNUM_HI=486 ! high resolution pixel width11
integer(4),parameter::AM2_DEF_SNUM_LO=243 ! low resolution pixel width
12 C interface variable
標準プロダクトのスキャン数上限は13
integer(4) i,j! loop variable
2200 で充分ですが、
14
integer(4) ret! return status15
character(len=512) buf ! text buffer
準リアルプロダクトを使用する場合は、
16
character(len=512) fn ! filename
2 周回程度繋がる場合があるので、
17
integer(HID_T) fhnd
! file handle
LMT=9000 としてください。
18
integer(HID_T) ahnd
! attribute handle(標準の 4 パス分程度)
19integer(HID_T) atyp
! attribute type20
integer(HID_T) dhnd
! dataset handle
HDF5 用インターフェイス
21
integer(HID_T) dtyp
! dataset type22
integer(HID_T) shnd
! dataspace handle
変数を宣言します。
23
integer(HSIZE_T) sz1(3) ! array size 1
24integer(HSIZE_T) sz2(3) ! array size 2:35integer(4) num! NumberOfScans スキャン数
オーバーラップスキャン数
36
integer(4) ovr! OverlapScans37
real(8) prm1(7)! CoRegistrationParameterA1
38
real(8) prm2(7)! CoRegistrationParameterA2
39
parameter(ovr=20) 相対レジストレーション係数 A1
メタデータ用変数を宣言します。
:
相対レジストレーション係数 A2※HDF5 の FORTRAN90 ライブラリでは
可変長文字列のメタデータを読込めないので、後で固定値を設定します。
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。

45
46
47
:
55
56
:
64
65
:
80
81
:
89
90
:
98
99

type(AM2_COMMON_SCANTIME) st(LMT) ! scantime 時刻
real(4) lat89a(AM2_DEF_SNUM_HI,LMT) ! lat for 89areal(4) lat89b(AM2_DEF_SNUM_HI,LMT) ! lat for 89b

緯度

real(4) lon89a(AM2_DEF_SNUM_HI,LMT) ! lon for 89areal(4) lon89b(AM2_DEF_SNUM_HI,LMT) ! lon for 89b

経度

real(4) tb06h(AM2_DEF_SNUM_LO,LMT) ! tb for 06h
real(4) tb06v(AM2_DEF_SNUM_LO,LMT) ! tb for 06v

輝度温度

配列データ用変数
を宣言します。

品質フラグ
integer(1) pdq06h(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06h
integer(1) pdq06v(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06v
陸海フラグ
integer(1) lof06(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 06
integer(1) lof07(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 07
real(4) ear_in(AM2_DEF_SNUM_LO,LMT) ! earth incidence 観測入射角
real(4) ear_az(AM2_DEF_SNUM_LO,LMT) ! earth azimuth
観測方位角

176

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
108 C hdf5 initialize
109
call H5open_f(ret)110
if(ret.lt.0)then111
write(*,'(a,i12)')'h5open_f error: ',ret112
call exit(1)
113
endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
114 C open
115
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
116
if(ret.lt.0)then
117
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
118
call exit(1)
119
endif

177

AMSR2 データ利用解説文書◇NumberOfScans と相対レジストレーション係数の設定※左側の数字は行番号です

HDF5 の FORTRAN90 ライブラリでは可変長文字列のメタデータを読み込めないので、
NumberOfScans を配列サイズから調べます。ここでは”Scan Time”のサイズを調べています。
配列サイズを取得するには、データセットをオープンして、データスペースをオープンしてから、
データセットのサイズ取得関数を使用します。不要になったハンドルはクローズします。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
120 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
121 C calculate NumberOfScans from array size and OverlapScans
122
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)123
call H5Dget_space_f(dhnd,shnd,ret)124
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)125
if(ret.lt.0)then126
write(*,'(a)')'H5Sget_simple_extent_dims error: Scan Time'127
call exit(1)
128
endif
129
call H5Sclose_f(shnd,ret) NumberOfScans は、
130call H5Dclose_f(dhnd,ret) 「配列のスキャン数－(OverlapScans×２)」となります。
131
num=sz1(1)-ovr*2
132
write(*,'(a,i12)')'NumberOfScans(RETRIEVE BY ARRAY SIZE): ',num133
write(*,'(a,i12)')'OverlapScans(FIXED VALUE): ',ovr◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
相対レジストレーション係数を設定します。
相対レジストレーション係数は、低周波緯度経度を算出する際に必要になります。
141 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
142 C use fixed value for CoRegistrationParameter143
prm1(1)= 1.25000D0
P.15 基礎知識編３．１０参照
144
prm1(2)= 1.00000D0
145
prm1(3)= 1.25000D0
146
prm1(4)= 1.25000D0147
prm1(5)= 1.25000D0148
prm1(6)= 1.00000D0149
prm1(7)=(prm1(1)+prm1(2)+prm1(3)+prm1(4)+prm1(5)+prm1(6))/6.0D0:
154
prm2(1)= 0.00000D0
155
prm2(2)=-0.10000D0
156
prm2(3)=-0.25000D0
157
prm2(4)= 0.00000D0
158
prm2(5)=-0.25000D0
159
prm2(6)= 0.00000D0160
prm2(7)=(prm2(1)+prm2(2)+prm2(3)+prm2(4)+prm2(5)+prm2(6))/6.0D0178

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンして、データタイプを取得して、読込み用変数の各次元サイズを配列変数に設定しておきます。
L1 データには前後にオーバーラップが含まれるので重複部分を取り除きます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。
P.11 基礎知識編３．５参照◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
165 C read array: scantime
166! read167
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)168
sz1(1)=LMT
169
call H5Dread_f(dhnd170+,H5T_NATIVE_DOUBLE,r8d1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
読込み
171
if(ret.lt.0)then172
write(*,'(a,a)')'H5Dread error: ','Scan Time'173
call exit(1)
174
endif
175
call H5Dclose_f(dhnd,ret)176! cutoff overlap
177
do j=1,num178
r8d1(j)=r8d1(j+ovr)
重複除去
179
enddo
180
do j=num+1,LMT
181
r8d1(j)=0
182
enddo
183
! convert
184
call amsr2time(num,r8d1,st)
時刻変換
185! sample display
186
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
187+'time(scan=1): '188+,st(1)%year
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、
189+,st(1)%month
うるう秒を含めた 1993/01/01 からの通算秒です。
190+,st(1)%day
このままでは日時情報として扱い難いので、
191+,st(1)%hour
このサンプルプログラムでは年/月/日/時/分/秒に変換する
192+,st(1)%minute
サブルーチンを用意しています。この時刻変換は AMTK を使用
193+,st(1)%second
する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
call amsr2time(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

179

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
89G 緯度経度は格納データを読込みます。
二次元配列を読込む場合には、サイズ指定配列の 1 番目と 2 番目に値を設定します。
読込んだ後は、オーバーラップを取り除きます。
低周波緯度経度は、89G A ホーン緯度経度と相対レジストレーション係数から算出します。
194 C read array: latlon for 89a
195! read lat
196
call H5Dopen_f(fhnd197+,'Latitude of Observation Point for 89A',dhnd,ret)198
sz1(1)=LMT
199
sz1(2)=AM2_DEF_SNUM_HI
緯度読込み
200
call H5Dread_f(dhnd201+,H5T_NATIVE_REAL,lat89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
202
if(ret.lt.0)then203
write(*,'(a,a)')'H5Dread error: '204+ ,'Latitude of Observation Point for 89A'
205
call exit(1)
206
endif
207
call H5Dclose_f(dhnd,ret)208! read lon
209
call H5Dopen_f(fhnd210+,'Longitude of Observation Point for 89A',dhnd,ret)211
sz1(1)=LMT212
sz1(2)=AM2_DEF_SNUM_HI
経度読込み
213
call H5Dread_f(dhnd214+,H5T_NATIVE_REAL,lon89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
215
if(ret.lt.0)then216
write(*,'(a,a)')'H5Dread error:' センサには 6G/7G/10G/18G/23G/36G/89G の
AMSR2
217
+ ,'Longitude of Observation Point for 89A'
7 つの観測周波数がありますが、それらの観測点緯218
call exit(1)度経度は正確には異なります。
219
endif
AMSR2 プロダクトに格納されているのは 89G 緯度経
220call H5Dclose_f(dhnd,ret)
度だけです。低周波の正確な緯度経度は 89G A ホー
221
! cutoff overlap
222
do j=1,num
ン緯度経度と相対レジストレーション係数から算223
lat89a(:,j)=lat89a(:,j+ovr) 出できます。
224
lon89a(:,j)=lon89a(:,j+ovr) このサンプルプログラムでは低周波緯度経度を算
重複除去
225
enddo
出するためのサブルーチンを用意しています。AMTK
226
do j=num+1,LMTを使用する場合は、低周波緯度経度は自動的に算出
227
lat89a(:,j)=0
されます。
228
lon89a(:,j)=0→ P.15 基礎知識編３．１０参照
229
enddo
230
! sample display
231
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon89a(pixel=1,scan=1): '232+,lat89a(1,1),lon89a(1,1):
272 C read array: latlon for low mean
273
call amsr2latlon(num,prm1(7),prm2(7),lat89a,lon89a,latlm,lonlm)
低周波計算
274
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlonlm(pixel=1,scan=1): '275+,latlm(1,1),lonlm(1,1)◆低周波緯度経度算出
call amsr2latlon(num,prm1,prm2,lat89a,lon89a,latlow,lonlow)
num: スキャン数を指定します
prm1: 相対レジストレーション係数 A1 を指定します(6G/7G/10G/18G/23G/36G/平均)
prm2: 相対レジストレーション係数 A2 を指定します(6G/7G/10G/18G/23G/36G/平均)
lat89a: 89G A ホーン緯度データを指定します
lon89a: 89G A ホーン経度データを指定します
latlow: [戻り値]指定した低周波の緯度データが返されます
lonlow: [戻り値]指定した低周波の経度データが返されます

180

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。

◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値
300 C read array: tb for 06h
301! read302
call H5Dopen_f(fhnd
303+,'Brightness Temperature (6.9GHz,H)',dhnd,ret)304
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)! get scale
スケール読込み
305
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret) ! get scale
306
call H5Aclose_f(ahnd,ret)! get scale307
sz1(1)=LMT
308
sz1(2)=AM2_DEF_SNUM_LO
309
call H5Dread_f(dhnd310+,H5T_NATIVE_REAL,tb06h,sz1,ret,H5S_ALL_F,H5S_ALL_F)
読込み311if(ret.lt.0)then
312
write(*,'(a,a)')'H5Dread error: '313+ ,'Brightness Temperature (6.9GHz,H)'
314
call exit(1)
315
endif
316
call H5Dclose_f(dhnd,ret)317! cutoff overlap & convert to unsignd & change scale318
do j=1,num319
do i=1,AM2_DEF_SNUM_LO
320
tb06h(i,j)=tb06h(i,j+ovr)
321
if(tb06h(i,j).lt.65534)tb06h(i,j)=tb06h(i,j)*sca
322
enddo
欠損値(65535)と異常値(65534)は除外して、
323
enddo
重複除去
スケールを適用します。
324
do j=num+1,LMT
325
tb06h(:,j)=0
326
enddo
327
! sample display
328
write(*,'(a,f9.2)')'tb06h(pixel=1,scan=1): ',tb06h(1,1)◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

181

このスケール処理は AMTK を使用する場合は自動的に行われます。
→ P.16 基礎知識編３．１２参照

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 低周波品質フラグは 2 つの 1byte 整数型で 16 ビットの内 12 ビットが各低周波に対応します。
L1 高周波品質フラグは 1 つの 1byte 整数型で 8 ビットの内 4 ビットが各高周波に対応します。
764 C read array: pixel data quality for low
765! read766
call H5Dopen_f(fhnd767+,'Pixel Data Quality 6 to 36',dhnd,ret)768
sz1(1)=LMT769
sz1(2)=AM2_DEF_SNUM_LO
call H5Dread_f(dhnd
読込み770771+,H5T_NATIVE_INTEGER,i4d2hi,sz1,ret,H5S_ALL_F,H5S_ALL_F)
772
if(ret.lt.0)then
773
write(*,'(a,a)')'H5Dread error: '774+ ,'Pixel Data Quality 6 to 36'
775
call exit(1)
776
endif
777
call H5Dclose_f(dhnd,ret)
L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
778
779
780
781
782
783
ビット毎の
784
情報を各周波785
数に分解786
787
788
重複除去も
789
行います
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808

! cutoff overlap & separate
do j=1,num
do i=1,AM2_DEF_SNUM_LO
pdq06v(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),0))pdq06v(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),1))pdq06v(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),0)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),1))pdq06v(i,j)=11
pdq06h(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),2))pdq06h(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),3))pdq06h(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),2)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),3))pdq06h(i,j)=11
pdq07v(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),4))pdq07v(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),5))pdq07v(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),4)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),5))pdq07v(i,j)=11
pdq07h(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),6))pdq07h(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),7))pdq07h(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),6)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),7))pdq07h(i,j)=11
enddo
enddo
do j=num+1,LMT
pdq06h(:,j)=0
pdq06v(:,j)=0
pdq07h(:,j)=0
pdq07v(:,j)=0
enddo

182

AMSR2 データ利用解説文書◇L1B 陸海フラグデータ読込み ※左側の数字は行番号です
L1B 陸海は integer(1)型の 2 次元配列((スキャン数*チャンネル数)×ピクセル数)です。
低周波データは周波数が 6 チャンネル(6G/7G/10G/18G/23G/36G)あります。
P.14 基礎知識編３．９参照
高周波データは周波数が 2 チャンネル(89G A ホーン/89G B ホーン)あります。

848 C read array: land ocean flag for low
849! read850
call H5Dopen_f(fhnd851+,'Land_Ocean Flag 6 to 36',dhnd,ret)852
sz1(1)=LMT*6853
sz1(2)=AM2_DEF_SNUM_LO
854
call H5Dread_f(dhnd
読込み855+,H5T_NATIVE_INTEGER,loflo,sz1,ret,H5S_ALL_F,H5S_ALL_F)
856
if(ret.lt.0)then
857
write(*,'(a,a)')'H5Dread error: '858+ ,'Land_Ocean Flag 6 to 36'859
call exit(1)
860
endif
861
call H5Dclose_f(dhnd,ret)
陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
862
863
864
865
866
867
868
各周波数に
869
分解します
870
871
872
873
重複除去も
874
行います
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891

! separate
do j=1,num+ovr*2
do i=1,AM2_DEF_SNUM_LO
lof06(i,j)=loflo(i,(num+ovr*2)*0+j)
lof07(i,j)=loflo(i,(num+ovr*2)*1+j)
lof10(i,j)=loflo(i,(num+ovr*2)*2+j)
lof18(i,j)=loflo(i,(num+ovr*2)*3+j)
lof23(i,j)=loflo(i,(num+ovr*2)*4+j)
lof36(i,j)=loflo(i,(num+ovr*2)*5+j)
enddo
enddo
! cutoff overlap
do j=1,num
do i=1,AM2_DEF_SNUM_LO
lof06(i,j)=lof06(i,j+ovr)
lof07(i,j)=lof07(i,j+ovr)
lof10(i,j)=lof10(i,j+ovr)
lof18(i,j)=lof18(i,j+ovr)
lof23(i,j)=lof23(i,j+ovr)
lof36(i,j)=lof36(i,j+ovr)
enddo
enddo
do j=num+1,LMT
lof06(:,j)=0
lof07(:,j)=0
lof10(:,j)=0
lof18(:,j)=0
lof23(:,j)=0
lof36(:,j)=0
enddo

183

AMSR2 データ利用解説文書◇観測入射角データ読込み※左側の数字は行番号です

観測入射角は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、観測入射角に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。

934 C read array: earth incidence935! read936
call H5Dopen_f(fhnd937+,'Earth Incidence',dhnd,ret)938
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)! get scale
スケール読込み939
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret) ! get scale
読込み940
call H5Aclose_f(ahnd,ret)! get scale941
sz1(1)=LMT942
sz1(2)=AM2_DEF_SNUM_LO
943
call H5Dread_f(dhnd944+,H5T_NATIVE_REAL,ear_in,sz1,ret,H5S_ALL_F,H5S_ALL_F)
945
if(ret.lt.0)then
946
write(*,'(a,a)')'H5Dread error: '947+ ,'Earth Incidence'948
call exit(1)
949
endif
950
call H5Dclose_f(dhnd,ret)951! cutoff overlap & change scale952
do j=1,num
953
do i=1,AM2_DEF_SNUM_LO
954
ear_in(i,j)=ear_in(i,j+ovr)
重複除去
955
if(ear_in(i,j).gt.-32767)ear_in(i,j)=ear_in(i,j)*sca
956
enddo
欠損値(-32768)と異常値(-32767)は除外して、
957
enddo
スケールを適用します。
958
do j=num+1,LMT
959
ear_in(:,j)=0
960
enddo
961
! sample display
962
write(*,'(a,f9.2)')'ear_in(pixel=1,scan=1): ',ear_in(1,1)◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
993
994
995

call H5Fclose_f(fhnd,ret)call H5close_f(ret)end◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

184

AMSR2 データ利用解説文書

８．１．２ コンパイル方法(build_readL1B_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL1B_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
911～12 行目に、使用するコンパイラを指定します。
時刻変換と低周波緯度経度を算出する関数が C 言語のため、C コンパイラも指定します。
インテルコンパイラ(ifort/icc)または PG コンパイラ(pgf90/pgcc)を指定します。
10 # compiler
11 fc=ifort
12 cc=icc
13
14 # source filename
15 fsrc="readL1B_hdf5.f"
16 csrc="amsr2time_.c amsr2latlon_.c"
17 obj=`echo $csrc|sed "s/¥.c/.o/g"`
18
19 # output filename
20 out=readL1B_hdf5_f
21
22 # library order
23 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
24
25 # c compile
26 cmd="$cc -g -c $csrc"
27 echo $cmd
28 $cmd
29
30 # f compile
31 cmd="$fc -g $fsrc $obj -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
32 echo $cmd
33 $cmd
34
35 # garbage
36 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1B_hdf5_f.sh
icc -g -c amsr2time_.c amsr2latlon_.c
ifort -g readL1B_hdf5.f amsr2time_.o amsr2latlon_.o -o readL1B_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

185

AMSR2 データ利用解説文書

８．１．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1B_hdf5_f GW1AM2_201207261145_055A_L1SGBTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGBTBR_000000
0.h5
NumberOfScans(RETRIEVE BY ARRAY SIZE):
1979
OverlapScans(FIXED VALUE):
20
limit of NumberOfScans = 2200
CoRegistrationParameterA1(FIXED VALUE): 6G- 1.25000,7
G- 1.00000,10G- 1.25000,18G- 1.25000,23G- 1.25000,36G- 1.00000
CoRegistrationParameterA2(FIXED VALUE): 6G- 0.00000,7
G--0.10000,10G--0.25000,18G- 0.00000,23G--0.25000,36G- 0.00000
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time(scan=1): 2012/07/26 11:45:43
latlon89a(pixel=1,scan=1): ( -73.3289, 136.7714)
latlon89b(pixel=1,scan=1): ( -73.4038, 137.1498)
latlonlm(pixel=1,scan=1): ( -73.3538, 136.6228)
latlon06(pixel=1,scan=1): ( -73.3592, 136.6213)
latlon07(pixel=1,scan=1): ( -73.3497, 136.6429)
latlon10(pixel=1,scan=1): ( -73.3506, 136.6001)
latlon18(pixel=1,scan=1): ( -73.3592, 136.6213)
latlon23(pixel=1,scan=1): ( -73.3506, 136.6001)
latlon36(pixel=1,scan=1): ( -73.3532, 136.6514)
tb06h(pixel=1,scan=1):
173.28tb06v(pixel=1,scan=1):
208.22
tb07h(pixel=1,scan=1):
173.07
tb07v(pixel=1,scan=1):
207.54
tb10h(pixel=1,scan=1):
170.94
tb10v(pixel=1,scan=1):
204.95186

tb18h(pixel=1,scan=1):
164.85
tb18v(pixel=1,scan=1):
199.84
tb23h(pixel=1,scan=1):
163.22
tb23v(pixel=1,scan=1):
196.53tb36h(pixel=1,scan=1):
156.56
tb36v(pixel=1,scan=1):
186.39tb89ah(pixel=1,scan=1):
163.76tb89av(pixel=1,scan=1):
179.27tb89bh(pixel=1,scan=1):
170.60tb89bv(pixel=1,scan=1):
188.16pdq06h(pixel=1,scan=1): 0
pdq06v(pixel=1,scan=1): 0
pdq07h(pixel=1,scan=1): 0
pdq07v(pixel=1,scan=1): 0
pdq10h(pixel=1,scan=1): 0
pdq10v(pixel=1,scan=1): 0
pdq18h(pixel=1,scan=1): 0
pdq18v(pixel=1,scan=1): 0
pdq23h(pixel=1,scan=1): 0
pdq23v(pixel=1,scan=1): 0
pdq36h(pixel=1,scan=1): 0
pdq36v(pixel=1,scan=1): 0
pdq89ah(pixel=1,scan=1): 0
pdq89av(pixel=1,scan=1): 0
pdq89bh(pixel=1,scan=1): 0
pdq89bv(pixel=1,scan=1): 0
lof06(pixel=1,scan=1): 100
lof07(pixel=1,scan=1): 100
lof10(pixel=1,scan=1): 100
lof18(pixel=1,scan=1): 100
lof23(pixel=1,scan=1): 100
lof36(pixel=1,scan=1): 100
lof89a(pixel=1,scan=1): 100
lof89b(pixel=1,scan=1): 100
ear_in(pixel=1,scan=1):
55.20
ear_az(pixel=1,scan=1):
144.76AMSR2 データ利用解説文書

８．２ L1R データ読込み
８．２．１ サンプルプログラム readL1R_hdf5.f 解説
サンプルプログラム readL1R_hdf5.f では、L1R データファイルから、以下の格納データを読込ん
で、89G A ホーン緯度経度から低周波緯度経度を算出し、内容をテキスト表示します。このサンプルプログラムでは、格納されている L1R 輝度温度の一部のみ取扱います。L1R 輝度温度データ一覧については、P.14「３．８ L1 リサンプリングデータ」を参照ください。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文
字列メタデータを読込めません。

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B* NumberOfScans は配列サイズから調べます。 - Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Brightness Temperature (res06,6.9GHz,H)
以下は固定値を使用します。
- Brightness Temperature (res06,6.9GHz,V)* OverlapScans- Brightness Temperature (res06,7.3GHz,H)- Brightness Temperature (res06,7.3GHz,V)- Brightness Temperature (res10,10.7GHz,H)- Brightness Temperature (res10,10.7GHz,V)- Brightness Temperature (res23,18.7GHz,H)- Brightness Temperature (res23,18.7GHz,V)
89G A ホーン緯度経度から抽出するデータ- Brightness Temperature (res23,23.8GHz,H)* 低周波用緯度経度- Brightness Temperature (res23,23.8GHz,V)
P.15 基礎知識編３．１０参照- Brightness Temperature (res36,36.5GHz,H)- Brightness Temperature (res36,36.5GHz,V)- Brightness Temperature (res36,89.0GHz,H)- Brightness Temperature (res36,89.0GHz,V)- Brightness Temperature (original,89GHz-A,H)- Brightness Temperature (original,89GHz-A,V)- Brightness Temperature (original,89GHz-B,H)- Brightness Temperature (original,89GHz-B,V)* Pixel Data Quality 6 to 36- Pixel Data Quality 89* Land_Ocean Flag 6 to 36- Land_Ocean Flag 89* Earth Incidence- Earth Azimuth

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

187

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none
4 C include
5
include 'amsr2time_f.h'
時刻変換用サブルーチンヘッダーを:インクルードします。
8 C fixed value
9
integer(4),parameter::LMT=2200 ! limit of NumberOfScans10
integer(4),parameter::AM2_DEF_SNUM_HI=486 ! high resolution pixel width11
integer(4),parameter::AM2_DEF_SNUM_LO=243 ! low resolution pixel width
12 C interface variable
標準プロダクトのスキャン数上限は13
integer(4) i,j! loop variable
2200 で充分ですが、
14
integer(4) ret! return status15
character(len=512) buf ! text buffer
準リアルプロダクトを使用する場合は、
16
character(len=512) fn ! filename
2 周回程度繋がる場合があるので、
17
integer(HID_T) fhnd
! file handle
LMT=9000 としてください。
18
integer(HID_T) ahnd
! attribute handle(標準の 4 パス分程度)
19integer(HID_T) atyp
! attribute type20
integer(HID_T) dhnd
! dataset handle
HDF5 用インターフェイス
21
integer(HID_T) dtyp
! dataset type22
integer(HID_T) shnd
! dataspace handle
変数を宣言します。
23
integer(HSIZE_T) sz1(3) ! array size 1
24integer(HSIZE_T) sz2(3) ! array size 2:35integer(4) num! NumberOfScans スキャン数
オーバーラップスキャン数
36
integer(4) ovr! OverlapScans:
39
parameter(ovr=20):
メタデータ用変数を宣言します。
※HDF5 の FORTRAN90 ライブラリでは
可変長文字列のメタデータを読込めないので、後で固定値を設定します。
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。

45
46
47
:
49
50
:
52
53
:
70
71
:
79
80
:
86
87

type(AM2_COMMON_SCANTIME) st(LMT) ! scantime 時刻 緯度
real(4) lat89ar(AM2_DEF_SNUM_HI,LMT) ! lat for 89a altitude revisedreal(4) lat89br(AM2_DEF_SNUM_HI,LMT) ! lat for 89b altitude
revised
配列データ用変数
経度を宣言します。
real(4) lon89ar(AM2_DEF_SNUM_HI,LMT) ! lon for 89a altitude revisedreal(4) lon89br(AM2_DEF_SNUM_HI,LMT) ! lon for 89b altitude revised
輝度温度
real(4) tb06h06(AM2_DEF_SNUM_LO,LMT) ! tb for 06h, resolution 06G
real(4) tb06v06(AM2_DEF_SNUM_LO,LMT) ! tb for 06v, resolution 06G
品質フラグ
integer(1) pdq06h(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06h
integer(1) pdq06v(AM2_DEF_SNUM_LO,LMT) ! pixel data quality for 06v
陸海フラグ
integer(1) lof06(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 06
integer(1) lof10(AM2_DEF_SNUM_LO,LMT) ! land ocean flag for 10real(4) ear_in(AM2_DEF_SNUM_LO,LMT) ! earth incidence 観測入射角
real(4) ear_az(AM2_DEF_SNUM_LO,LMT) ! earth azimuth
観測方位角

188

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
96 C hdf5 initialize
97
call H5open_f(ret)98
if(ret.lt.0)then99
write(*,'(a,i12)')'h5open_f error: ',ret
100
call exit(1)
101
endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
102 C open
103
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
104
if(ret.lt.0)then105
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
106call exit(1)
107
endif

189

AMSR2 データ利用解説文書◇NumberOfScans の設定 ※左側の数字は行番号です
HDF5 の FORTRAN90 ライブラリでは可変長文字列のメタデータを読み込めないので、
NumberOfScans を配列サイズから調べます。ここでは”Scan Time”のサイズを調べています。
配列サイズを取得するには、データセットをオープンして、データスペースをオープンしてから、
データセットのサイズ取得関数を使用します。不要になったハンドルはクローズします。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
108 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
109 C calculate NumberOfScans from array size and OverlapScans
110
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)111
call H5Dget_space_f(dhnd,shnd,ret)112
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)113
if(ret.lt.0)then
114
write(*,'(a)')'H5Sget_simple_extent_dims error: Scan Time'115
call exit(1)
116
endif
117
call H5Sclose_f(shnd,ret) NumberOfScans は、
118
call H5Dclose_f(dhnd,ret) 「配列のスキャン数－(OverlapScans×２)」となります。
119
num=sz1(1)-ovr*2
120
write(*,'(a,i12)')'NumberOfScans(RETRIEVE BY ARRAY SIZE): ',num
121
write(*,'(a,i12)')'OverlapScans(FIXED VALUE): ',ovr◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

190

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンして、データタイプを取得して、読込み用変数の各次元サイズを配列変数に設定しておきます。
L1 データには前後にオーバーラップが含まれるので重複部分を取り除きます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。
P.11 基礎知識編３．５参照◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
153 C read array: scantime
154! read155
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)156
sz1(1)=LMT
157
call H5Dread_f(dhnd158+,H5T_NATIVE_DOUBLE,r8d1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
読込み
159
if(ret.lt.0)then160
write(*,'(a,a)')'H5Dread error: ','Scan Time'
161
call exit(1)
162
endif
163
call H5Dclose_f(dhnd,ret)164! cutoff overlap
165
do j=1,num
166
r8d1(j)=r8d1(j+ovr)
重複除去
167
enddo
168
do j=num+1,LMT
169
r8d1(j)=0
170
enddo
171
! convert
172
call amsr2time(num,r8d1,st)
時刻変換
173! sample display
174
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
175+'time(scan=1): '176+,st(1)%year
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、
177+,st(1)%month
うるう秒を含めた 1993/01/01 からの通算秒です。
178+,st(1)%day
このままでは日時情報として扱い難いので、179+,st(1)%hour
このサンプルプログラムでは年/月/日/時/分/秒に変換する
180+,st(1)%minute
サブルーチンを用意しています。この時刻変換は AMTK を使用
181+,st(1)%second
する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
call amsr2time(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

191

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
89G 緯度経度は格納データを読込みます。
二次元配列を読込む場合には、サイズ指定配列の 1 番目と 2 番目に値を設定します。
読込んだ後は、オーバーラップを取り除きます。
P.15 基礎知識編３．１０参照
低周波用緯度経度は、89G A ホーン緯度経度の 1 から数えて奇数番目を抽出します。
182 C read array: latlon for 89a altitude revised
183! read lat
184
call H5Dopen_f(fhnd185+,'Latitude of Observation Point for 89A',dhnd,ret)186
sz1(1)=LMT
187
sz1(2)=AM2_DEF_SNUM_HI
緯度読込み
188
call H5Dread_f(dhnd189+,H5T_NATIVE_REAL,lat89ar,sz1,ret,H5S_ALL_F,H5S_ALL_F)
190
if(ret.lt.0)then191
write(*,'(a,a)')'H5Dread error: '192+ ,'Latitude of Observation Point for 89A'
193
call exit(1)
194
endif
195
call H5Dclose_f(dhnd,ret)196! read lon
197
call H5Dopen_f(fhnd198+,'Longitude of Observation Point for 89A',dhnd,ret)199
sz1(1)=LMT200sz1(2)=AM2_DEF_SNUM_HI
経度読込み
201
call H5Dread_f(dhnd202+,H5T_NATIVE_REAL,lon89ar,sz1,ret,H5S_ALL_F,H5S_ALL_F)
203
if(ret.lt.0)then
204
write(*,'(a,a)')'H5Dread error: '205+ ,'Longitude of Observation Point for 89A'
206
call exit(1)
207
endif
208
call H5Dclose_f(dhnd,ret)209! cutoff overlap
210
do j=1,num
211
lat89ar(:,j)=lat89ar(:,j+ovr)
212
lon89ar(:,j)=lon89ar(:,j+ovr)
重複除去
213
enddo
214
do j=num+1,LMT
215
lat89ar(:,j)=0216
lon89ar(:,j)=0
217
enddo
:
260 C read array: latlon for low resolution
261
do j=1,num
262
do i=1,AM2_DEF_SNUM_LO
263
latlr(i,j)=lat89ar(i*2-1,j)
低周波抽出
264
lonlr(i,j)=lon89ar(i*2-1,j)
265
enddo
266
enddo

192

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。

◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値
269 C read array: tb for 06h, resolution 06G
270! read271
call H5Dopen_f(fhnd272+,'Brightness Temperature (res06,6.9GHz,H)',dhnd,ret)273
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)! get scale
スケール読込み274
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret) ! get scale
275
call H5Aclose_f(ahnd,ret)! get scale276
sz1(1)=LMT277
sz1(2)=AM2_DEF_SNUM_LO
278
call H5Dread_f(dhnd279+,H5T_NATIVE_REAL,tb06h06,sz1,ret,H5S_ALL_F,H5S_ALL_F)
読込み280if(ret.lt.0)then
281
write(*,'(a,a)')'H5Dread error: '282+ ,'Brightness Temperature (res06,6.9GHz,H)'
283
call exit(1)
284
endif
285
call H5Dclose_f(dhnd,ret)286! cutoff overlap & convert to unsignd & change scale287
do j=1,num
288
do i=1,AM2_DEF_SNUM_LO289
tb06h06(i,j)=tb06h06(i,j+ovr)
290
if(tb06h06(i,j).lt.65534)tb06h06(i,j)=tb06h06(i,j)*sca
291
enddo
欠損値(65535)と異常値(65534)は除外して、
292
enddo
重複除去
スケールを適用します。
293
do j=num+1,LMT
294
tb06h06(:,j)=0
295
enddo
296
! sample display
297
write(*,'(a,f9.2)')'tb06h06(pixel=1,scan=1): ',tb06h06(1,1)◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

193

このスケール処理は AMTK を使用する場合は自動的に行われます。
→ P.16 基礎知識編３．１２参照

AMSR2 データ利用解説文書◇L1 品質フラグデータ読込み※左側の数字は行番号です

L1 低周波品質フラグは 2 つの 1byte 整数型で 16 ビットの内 12 ビットが各低周波に対応します。
L1 高周波品質フラグは 1 つの 1byte 整数型で 8 ビットの内 4 ビットが各高周波に対応します。
791 C read array: pixel data quality for low
792! read793
call H5Dopen_f(fhnd794+,'Pixel Data Quality 6 to 36',dhnd,ret)795
sz1(1)=LMT796
sz1(2)=AM2_DEF_SNUM_LO
call H5Dread_f(dhnd
読込み797798+,H5T_NATIVE_INTEGER,i4d2hi,sz1,ret,H5S_ALL_F,H5S_ALL_F)
799
if(ret.lt.0)then800
write(*,'(a,a)')'H5Dread error: '801+ ,'Pixel Data Quality 6 to 36'
802
call exit(1)
803
endif
804
call H5Dclose_f(dhnd,ret)
L1 品質フラグデータは、各周波数（6GHz、7GHz）、偏波に対する RFI 情報がまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 2 ビットのマスク値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
L1 品質フラグデータには RFI(Radio Frequency Interference; 電波干渉)情報が格納されています。
電波干渉の発生がない場合は 00、発生の可能性がある場合は 10、発生がある場合は 11 となります。
805
806
807
808
809
810
ビット毎の
811
情報を各周波812
数に分解813
814
815
重複除去も
816
行います
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835

! cutoff overlap & separate
do j=1,num
do i=1,AM2_DEF_SNUM_LO
pdq06v(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),0))pdq06v(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),1))pdq06v(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),0)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),1))pdq06v(i,j)=11
pdq06h(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),2))pdq06h(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),3))pdq06h(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),2)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),3))pdq06h(i,j)=11
pdq07v(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),4))pdq07v(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),5))pdq07v(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),4)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),5))pdq07v(i,j)=11
pdq07h(i,j)=0
if(btest(i4d2hi((i-1)*2+1,j+ovr),6))pdq07h(i,j)=1
if(btest(i4d2hi((i-1)*2+1,j+ovr),7))pdq07h(i,j)=10
if(btest(i4d2hi((i-1)*2+1,j+ovr),6)+.and.btest(i4d2hi((i-1)*2+1,j+ovr),7))pdq07h(i,j)=11
enddo
enddo
do j=num+1,LMT
pdq06h(:,j)=0
pdq06v(:,j)=0
pdq07h(:,j)=0
pdq07v(:,j)=0
enddo

194

AMSR2 データ利用解説文書◇L1R 陸海フラグデータ読込み ※左側の数字は行番号です
L1R 陸海は integer(1)型の 2 次元配列((スキャン数*チャンネル数)×ピクセル数)です。
低周波データは解像度が 4 チャンネル(6G/10G/23G/36G)あります。
P.14 基礎知識編３．９参照
高周波データは解像度が 2 チャンネル(89G A ホーン/89G B ホーン)あります。

875 C read array: land ocean flag for low
876! read877
call H5Dopen_f(fhnd878+,'Land_Ocean Flag 6 to 36',dhnd,ret)879
sz1(1)=LMT*6880sz1(2)=AM2_DEF_SNUM_LO
881
call H5Dread_f(dhnd
読込み882+,H5T_NATIVE_INTEGER,loflo,sz1,ret,H5S_ALL_F,H5S_ALL_F)
883
if(ret.lt.0)then
884
write(*,'(a,a)')'H5Dread error: '885+ ,'Land_Ocean Flag 6 to 36'
886call exit(1)
887
endif
888
call H5Dclose_f(dhnd,ret)
陸海フラグデータは、解像度毎に全周波数データがまとまって取得されます。
まとまったままでは扱い難いので、各周波数毎の配列に分割します。
格納値は 0～100 のフラグ値なので、各周波数毎に integer(1)型の 2 次元配列を用意します。
889
890
891
892
893
894
895
各周波数に
896
分解します
897
898
899
900
重複除去も
901
行います
902
903
904
905
906
907
908
909
910
911
912

! separate
do j=1,num+ovr*2
do i=1,AM2_DEF_SNUM_LO
lof06(i,j)=loflo(i,(num+ovr*2)*0+j)
lof10(i,j)=loflo(i,(num+ovr*2)*1+j)
lof23(i,j)=loflo(i,(num+ovr*2)*2+j)
lof36(i,j)=loflo(i,(num+ovr*2)*3+j)
enddo
enddo
! cutoff overlap
do j=1,num
do i=1,AM2_DEF_SNUM_LO
lof06(i,j)=lof06(i,j+ovr)
lof10(i,j)=lof10(i,j+ovr)
lof23(i,j)=lof23(i,j+ovr)
lof36(i,j)=lof36(i,j+ovr)
enddo
enddo
do j=num+1,LMT
lof06(:,j)=0
lof10(:,j)=0
lof23(:,j)=0
lof36(:,j)=0
enddo

195

AMSR2 データ利用解説文書◇観測入射角データ読込み※左側の数字は行番号です

観測入射角は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、観測入射角に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。

953 C read array: earth incidence954! read955
call H5Dopen_f(fhnd956+,'Earth Incidence',dhnd,ret)957
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)! get scale
スケール読込み
958
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret) ! get scale
読込み959
call H5Aclose_f(ahnd,ret)! get scale960
sz1(1)=LMT
961
sz1(2)=AM2_DEF_SNUM_LO
962
call H5Dread_f(dhnd963+,H5T_NATIVE_REAL,ear_in,sz1,ret,H5S_ALL_F,H5S_ALL_F)
964
if(ret.lt.0)then
965
write(*,'(a,a)')'H5Dread error: '966+ ,'Earth Incidence'967
call exit(1)
968
endif
969
call H5Dclose_f(dhnd,ret)970! cutoff overlap & change scale971
do j=1,num
972
do i=1,AM2_DEF_SNUM_LO
973
ear_in(i,j)=ear_in(i,j+ovr)
重複除去974
if(ear_in(i,j).gt.-32767)ear_in(i,j)=ear_in(i,j)*sca
975
enddo
欠損値(-32768)と異常値(-32767)は除外して、
976
enddo
スケールを適用します。
977
do j=num+1,LMT
978
ear_in(:,j)=0
979
enddo
980
! sample display
981
write(*,'(a,f9.2)')'ear_in(pixel=1,scan=1): ',ear_in(1,1)◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。
HDF5 を終了します。
1012
1013
1014

call H5Fclose_f(fhnd,ret)call H5close_f(ret)end◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

196

AMSR2 データ利用解説文書

８．２．２ コンパイル方法(build_readL1R_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL1R_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
911～12 行目に、使用するコンパイラを指定します。
時刻変換と低周波緯度経度を算出する関数が C 言語のため、C コンパイラも指定します。
インテルコンパイラ(ifort/icc)または PG コンパイラ(pgf90/pgcc)を指定します。
10 # compiler
11 fc=ifort
12 cc=icc
13
14 # source filename
15 fsrc="readL1R_hdf5.f"
16 csrc="amsr2time_.c"
17 obj=`echo $csrc|sed "s/¥.c/.o/g"`
18
19 # output filename
20 out=readL1R_hdf5_f
21
22 # library order
23 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
24
25 # c compile
26 cmd="$cc -g -c $csrc"
27 echo $cmd
28 $cmd
29
30 # f compile
31 cmd="$fc -g $fsrc $obj -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
32 echo $cmd
33 $cmd
34
35 # garbage
36 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL1R_hdf5_f.sh
icc -g -c amsr2time_.c
ifort -g readL1R_hdf5.f amsr2time_.o -o readL1R_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

197

AMSR2 データ利用解説文書

８．２．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL1R_hdf5_f GW1AM2_201207261145_055A_L1SGRTBR_
0000000.h5
input file: GW1AM2_201207261145_055A_L1SGRTBR_000000
0.h5
NumberOfScans(RETRIEVE BY ARRAY SIZE):
1979
OverlapScans(FIXED VALUE):
20
limit of NumberOfScans = 2200
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time(scan=1): 2012/07/26 11:45:43
latlon89ar(pixel=1,scan=1): ( -73.3581, 136.8432)
latlon89br(pixel=1,scan=1): ( -73.4328, 137.2216)
latlonlr(pixel=1,scan=1): ( -73.3581, 136.8432)
tb06h06(pixel=1,scan=1):
173.41
tb06v06(pixel=1,scan=1):
208.09tb07h06(pixel=1,scan=1):
173.07
tb07v06(pixel=1,scan=1):
207.11
tb10h10(pixel=1,scan=1):
170.40tb10v10(pixel=1,scan=1):
204.58tb18h23(pixel=1,scan=1):
165.83
tb18v23(pixel=1,scan=1):
199.41
tb23h23(pixel=1,scan=1):
163.55
tb23v23(pixel=1,scan=1):
195.90198

tb36h36(pixel=1,scan=1):
153.55
tb36v36(pixel=1,scan=1):
183.95tb89h36(pixel=1,scan=1):
163.86
tb89v36(pixel=1,scan=1):
181.05tb89ah(pixel=1,scan=1):
163.76tb89av(pixel=1,scan=1):
179.27tb89bh(pixel=1,scan=1):
170.60tb89bv(pixel=1,scan=1):
188.16pdq06h(pixel=1,scan=1): 0
pdq06v(pixel=1,scan=1): 0
pdq07h(pixel=1,scan=1): 0
pdq07v(pixel=1,scan=1): 0
pdq10h(pixel=1,scan=1): 0
pdq10v(pixel=1,scan=1): 0
pdq18h(pixel=1,scan=1): 0
pdq18v(pixel=1,scan=1): 0
pdq23h(pixel=1,scan=1): 0
pdq23v(pixel=1,scan=1): 0
pdq36h(pixel=1,scan=1): 0
pdq36v(pixel=1,scan=1): 0
pdq89ah(pixel=1,scan=1): 0
pdq89av(pixel=1,scan=1): 0
pdq89bh(pixel=1,scan=1): 0
pdq89bv(pixel=1,scan=1): 0
lof06(pixel=1,scan=1): 100
lof10(pixel=1,scan=1): 100
lof23(pixel=1,scan=1): 100
lof36(pixel=1,scan=1): 100
lof89a(pixel=1,scan=1): 100
lof89b(pixel=1,scan=1): 100
ear_in(pixel=1,scan=1):
55.20
ear_az(pixel=1,scan=1):
144.76AMSR2 データ利用解説文書

８．３ L2 低解像度データ読込み
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)が L2 低解像度です。降水量(PRC)は L2 高解像度を参照ください。
８．３．１ サンプルプログラム readL2L_hdf5.f 解説
サンプルプログラム readL2L_hdf5.f では、L2 低解像度データファイルから、以下の格納データを読込んで、内容をテキスト表示します。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文
字列メタデータを読込めません。

格納データ* Scan Time* Latitude of Observation Point* Longitude of Observation Point* NumberOfScans は配列サイズから調べます。 * Geophysical Data
* Pixel Data Quality
以下は固定値を使用します。
P.15 基礎知識編３．１０参照* OverlapScans
以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

199

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none
4 C include
5
include 'amsr2time_f.h'
時刻変換用サブルーチンヘッダーを:インクルードします。
8 C fixed value
9
integer(4),parameter::LMT=2200 ! limit of NumberOfScans10
integer(4),parameter::AM2_DEF_SNUM_HI=486 ! high resolution pixel width11
integer(4),parameter::AM2_DEF_SNUM_LO=243 ! low resolution pixel width:
標準プロダクトのスキャン数上限は15 C interface variable
2200 で充分ですが、
16
integer(4) i,j! loop variable
17
integer(4) ret! return status
準リアルプロダクトを使用する場合は、
18
character(len=512) buf ! text buffer
2 周回程度繋がる場合があるので、
19
character(len=512) fn ! filename
LMT=9000 としてください。
20
integer(HID_T) fhnd
! file handle(標準の 4 パス分程度)
21
integer(HID_T) ahnd
! attribute handle
22
integer(HID_T) atyp
! attribute typeHDF5 用インターフェイス
23
integer(HID_T) dhnd
! dataset handle
24
integer(HID_T) shnd
! dataspace handle
変数を宣言します。
25
integer(HSIZE_T) sz1(3) ! array size 1
26integer(HSIZE_T) sz2(3) ! array size 2
:
スキャン数
37
integer(4) num! NumberOfScans
オーバーラップスキャン数
38
integer(4) ovr! OverlapScans
39
parameter(ovr=0)
メタデータ用変数を宣言します。
※HDF5 の FORTRAN90 ライブラリでは
可変長文字列のメタデータを読込めないので、後で固定値を設定します。
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。
43 C array data
時刻
44
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime
緯度45
real(4) lat(AM2_DEF_SNUM_LO,LMT) ! lat46
real(4) lon(AM2_DEF_SNUM_LO,LMT) ! lon
経度
47
real(4) geo1(AM2_DEF_SNUM_LO,LMT) ! geophysical data layer 1
物理量
48
real(4) geo2(AM2_DEF_SNUM_LO,LMT) ! geophysical data layer 249
real(4) geotmp(AM2_DEF_SNUM_LO,LMT*2) ! geophysical data temporary
品質フラグ
50
integer(4) pdq1(AM2_DEF_SNUM_LO,LMT) ! pixel data quality layer 1
51
integer(4) pdq2(AM2_DEF_SNUM_LO,LMT) ! pixel data quality layer 2
52
integer(4) pdqtmp(AM2_DEF_SNUM_LO,LMT*2) ! pixel data quality temporary
配列データ用変数
を宣言します。

200

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
61 C hdf5 initialize
62
call H5open_f(ret)63
if(ret.lt.0)then64
write(*,'(a,i12)')'h5open_f error: ',ret65
call exit(1)66
endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
67 C open
68
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
69
if(ret.lt.0)then70
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
71call exit(1)
72
endif

201

AMSR2 データ利用解説文書◇NumberOfScans の設定 ※左側の数字は行番号です
HDF5 の FORTRAN90 ライブラリでは可変長文字列のメタデータを読み込めないので、
NumberOfScans を配列サイズから調べます。ここでは”Scan Time”のサイズを調べています。
配列サイズを取得するには、データセットをオープンして、データスペースをオープンしてから、
データセットのサイズ取得関数を使用します。不要になったハンドルはクローズします。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
90 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
91 C calculate NumberOfScans from array size and OverlapScans
92
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)93
call H5Dget_space_f(dhnd,shnd,ret)94
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)95
if(ret.lt.0)then96
write(*,'(a)')'H5Sget_simple_extent_dims error: Scan Time'97
call exit(1)98
endif
NumberOfScans は、
99call H5Sclose_f(shnd,ret)「配列のスキャン数－(OverlapScans×２)」となります。
100
call H5Dclose_f(dhnd,ret)101
num=sz1(1)-ovr*2
102
write(*,'(a,i12)')'NumberOfScans(RETRIEVE BY ARRAY SIZE): ',num103
write(*,'(a,i12)')'OverlapScans(FIXED VALUE): ',ovr◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

202

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンして、読込み用変数の各次元サ
イズを配列変数に設定しておきます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。

◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
111 C read array: scantime
112! read113
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)114
sz1(1)=LMT
115
call H5Dread_f(dhnd
読込み116+,H5T_NATIVE_DOUBLE,r8d1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
117
if(ret.lt.0)then118
write(*,'(a,a)')'H5Dread error: ','Scan Time'119
call exit(1)
120
endif
121
call H5Dclose_f(dhnd,ret)122! convert
123
call amsr2time(num,r8d1,st)
時刻変換
124! sample display
125
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
126+'time(scan=1): '127+,st(1)%year
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、
128+,st(1)%month
うるう秒を含めた 1993/01/01 からの通算秒です。
129+,st(1)%day130+,st(1)%hour
このままでは日時情報として扱い難いので、
131+,st(1)%minute
このサンプルプログラムでは年/月/日/時/分/秒に変換する
132+,st(1)%second
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
call amsr2time(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます

203

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
P.15 基礎知識編３．１０参照

緯度経度データを読込みます。

133 C read array: latlon
134! read lat
135call H5Dopen_f(fhnd,'Latitude of Observation Point',dhnd,ret)136
sz1(1)=LMT137
sz1(2)=AM2_DEF_SNUM_LO
138
call H5Dread_f(dhnd139+,H5T_NATIVE_REAL,lat,sz1,ret,H5S_ALL_F,H5S_ALL_F)
140
if(ret.lt.0)then
緯度読込み
141
write(*,'(a,a)')'H5Dread error: '142+ ,'Latitude of Observation Point'143
call exit(1)
144
endif
145
call H5Dclose_f(dhnd,ret)146! read lon
147
call H5Dopen_f(fhnd,'Longitude of Observation Point',dhnd,ret)148
sz1(1)=LMT
149
sz1(2)=AM2_DEF_SNUM_LO
150
call H5Dread_f(dhnd151+,H5T_NATIVE_REAL,lon,sz1,ret,H5S_ALL_F,H5S_ALL_F)
152
if(ret.lt.0)then
経度読込み
153
write(*,'(a,a)')'H5Dread error: '154+ ,'Longitude of Observation Point'155
call exit(1)
156
endif
157
call H5Dclose_f(dhnd,ret)158! sample display
159
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon(pixel=1,scan=1): '160+,lat(1,1),lon(1,1)

204

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、物理量に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値
161 C read array: geophysical data for 1 layer162
if((gid(30:32).ne.'SND').and.(gid(30:32).ne.'SST'))then163
call H5Dopen_f(fhnd,'Geophysical Data',dhnd,ret)164! get scale
165
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)
スケール読込み
166
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)167
call H5Aclose_f(ahnd,ret)
168! read169
sz1(1)=LMT
170
sz1(2)=AM2_DEF_SNUM_LO
読込み
171
call H5Dread_f(dhnd172+ ,H5T_NATIVE_REAL,geo1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
173
if(ret.lt.0)then174
write(*,'(a,a)')'H5Dread error: '175+,'Geophysical Data'
このスケール処理は AMTK を使用する場合は
176
call exit(1)自動的に行われます。
177
endif
178
call H5Dclose_f(dhnd,ret)→ P.16 基礎知識編３．１２参照
179! change scale180
do j=1,num
181
do i=1,AM2_DEF_SNUM_LO
スケール処理182
if(geo1(i,j).gt.-32767)geo1(i,j)=geo1(i,j)*sca
183
enddo
欠損値(-32768)と異常値(-32767)は除外して、
184
enddo
スケールを適用します。
185
endif

205

AMSR2 データ利用解説文書

2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。

186 C read array: geophysical data for 2 layer187
if((gid(30:32).eq.'SND').or.(gid(30:32).eq.'SST'))then
188
call H5Dopen_f(fhnd,'Geophysical Data',dhnd,ret)189! get scale
190
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)191
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)
192
call H5Aclose_f(ahnd,ret)193! read194
sz1(1)=LMT*2
195
sz1(2)=AM2_DEF_SNUM_LO
196
call H5Dread_f(dhnd197+ ,H5T_NATIVE_REAL,geotmp,sz1,ret,H5S_ALL_F,H5S_ALL_F)
198
if(ret.lt.0)then
199
write(*,'(a,a)')'H5Dread error: '200+,'Geophysical Data'
201
call exit(1)
202
endif
203
call H5Dclose_f(dhnd,ret)204! separate & change scale205
do j=1,num
206
do i=1,AM2_DEF_SNUM_LO
207
geo1(i,j)=geotmp((i-1)*2+1,(j-1)*2+1)
208
geo2(i,j)=geotmp((i-1)*2+2,(j-1)*2+1)
209
if(geo1(i,j).gt.-32767)geo1(i,j)=geo1(i,j)*sca
210
if(geo2(i,j).gt.-32767)geo2(i,j)=geo2(i,j)*sca
211
enddo
212
enddo
213
endif

206

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
積雪深(SND)、海面水温(SST)は品質フラグが 2 層あるのでこの 2 つとそれ以外で処理を分けています。
214 C read array: pixel data quality for 1 layer215
if((gid(30:32).ne.'SND').and.(gid(30:32).ne.'SST'))then
216
call H5Dopen_f(fhnd,'Pixel Data Quality',dhnd,ret)217
sz1(1)=LMT
218
sz1(2)=AM2_DEF_SNUM_LO
219
call H5Dread_f(dhnd220+ ,H5T_NATIVE_INTEGER,pdq1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
221
if(ret.lt.0)then
222
write(*,'(a,a)')'H5Dread error: '223+,'Pixel Data Quality'
224
call exit(1)
225
endif
226
call H5Dclose_f(dhnd,ret)
227
endif
2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。
228 C read array: pixel data quality for 2 layer229
if((gid(30:32).eq.'SND').or.(gid(30:32).eq.'SST'))then230! read231
call H5Dopen_f(fhnd,'Pixel Data Quality',dhnd,ret)232
sz1(1)=LMT*2
233
sz1(2)=AM2_DEF_SNUM_LO
234
call H5Dread_f(dhnd235+ ,H5T_NATIVE_INTEGER,pdqtmp,sz1,ret,H5S_ALL_F,H5S_ALL_F)
236
if(ret.lt.0)then
237
write(*,'(a,a)')'H5Dread error: '238+,'Pixel Data Quality'239
call exit(1)
240
endif
241
call H5Dclose_f(dhnd,ret)242! separate
243
do j=1,num
244
do i=1,AM2_DEF_SNUM_LO245
pdq1(i,j)=pdqtmp(i,num*0+j)
246
pdq2(i,j)=pdqtmp(i,num*1+j)
247
enddo
248
enddo
249
endif
L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。HDF5 を終了します。
1027 C close
1028
call H5Fclose_f(fhnd,ret)1029
call H5close_f(ret)◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

207

AMSR2 データ利用解説文書

８．３．２ コンパイル方法(build_readL2L_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL2L_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
911～12 行目に、使用するコンパイラを指定します。
時刻変換関数が C 言語のため、C コンパイラも指定します。
インテルコンパイラ(ifort/icc)または PG コンパイラ(pgf90/pgcc)を指定します。
10 # compiler
11 fc=ifort
12 cc=icc
13
14 # source filename
15 fsrc="readL2L_hdf5.f"
16 csrc="amsr2time_.c"
17 obj=`echo $csrc|sed "s/¥.c/.o/g"`
18
19 # output filename
20 out=readL2L_hdf5_f
21
22 # library order
23 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
24
25 # c compile
26 cmd="$cc -g -c $csrc"
27 echo $cmd
28 $cmd
29
30 # f compile
31 cmd="$fc -g $fsrc $obj -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
32 echo $cmd
33 $cmd
34
35 # garbage
36 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2L_hdf5_f.sh
icc -g -c amsr2time_.c
ifort -g readL2L_hdf5.f amsr2time_.o -o readL2L_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

208

AMSR2 データ利用解説文書

８．３．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2L_hdf5_f GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGCLWLA0000000.h5
GranuleID(RETRIEVE FROM FILENAME): GW1AM2_201303011809_125D_L2SGCLWLA0000000
NumberOfScans(RETRIEVE BY ARRAY SIZE):
1972
OverlapScans(FIXED VALUE):
0limit of NumberOfScans = 2200
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time(scan=1): 2013/03/01 18:09:10
latlon(pixel=1,scan=1): ( 84.4574, -78.1076)
geo1(pixel=1,scan=1): -32767.000 [Kg/m2] (PDQ:112)

209

AMSR2 データ利用解説文書

８．４ L2 高解像度データ読込み
降水量(PRC)が L2 高解像度です。
積算雲水量(CLW)・海氷密接度(SIC)・土壌水分量(SMC)・積雪深(SND)・海面水温(SST)・海上風速(SSW)・可降水量(TPW)は L2 低解像度を参照ください。
８．４．１ サンプルプログラム readL2H_hdf5.f 解説
サンプルプログラム readL2H_hdf5.f では、L2 高解像度データファイルから、以下の格納データを読込んで、内容をテキスト表示します。
TAI93 形式時刻の変換には、サブルーチンを用意しています。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文
字列メタデータを読込めません。

格納データ* Scan Time* Latitude of Observation Point for 89A- Latitude of Observation Point for 89B* NumberOfScans は配列サイズから調べます。 * Longitude of Observation Point for 89A- Longitude of Observation Point for 89B* Geophysical Data for 89A
以下は固定値を使用します。
- Geophysical Data for 89B* OverlapScans* Pixel Data Quality for 89A- Pixel Data Quality for 89B
P.15 基礎知識編３．１０参照

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

210

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none
4 C include
5
include 'amsr2time_f.h'
時刻変換用サブルーチンヘッダーを:インクルードします。
8 C fixed value
9
integer(4),parameter::LMT=2200 ! limit of NumberOfScans10
integer(4),parameter::AM2_DEF_SNUM_HI=486 ! high resolution pixel width11
integer(4),parameter::AM2_DEF_SNUM_LO=243 ! low resolution pixel width:
標準プロダクトのスキャン数上限は14 C interface variable
2200 で充分ですが、
15
integer(4) i,j! loop variable
16
integer(4) ret! return status
準リアルプロダクトを使用する場合は、
17
character(len=512) buf ! text buffer
2 周回程度繋がる場合があるので、
18
character(len=512) fn ! filename
LMT=9000 としてください。
19
integer(HID_T) fhnd
! file handle(標準の 4 パス分程度)
20integer(HID_T) ahnd
! attribute handle
21
integer(HID_T) atyp
! attribute typeHDF5 用インターフェイス
22
integer(HID_T) dhnd
! dataset handle
23
integer(HID_T) shnd
! dataspace handle
変数を宣言します。
24
integer(HSIZE_T) sz1(3) ! array size 125
integer(HSIZE_T) sz2(3) ! array size 2
:
スキャン数
35
integer(4) num! NumberOfScans
オーバーラップスキャン数
36
integer(4) ovr! OverlapScans
37
parameter(ovr=0)
メタデータ用変数を宣言します。
※HDF5 の FORTRAN90 ライブラリでは
可変長文字列のメタデータを読込めないので、後で固定値を設定します。
時刻データには AM2_COMMON_SCANTIME 構造体を使います。
配列の次元数はデータによって異なります。
スキャン数はパスによって若干上下するので、上限を決めて宣言しておきます。
ここでは上限として LMT=2200 を設定しています。
AM2_DEF_SNUM_HI は高解像度ピクセル数(486)です。
AM2_DEF_SNUM_LO は低解像度ピクセル数(243)です。
41 C array data
時刻42
type(AM2_COMMON_SCANTIME) st(LMT) ! scantime
43
real(4) lat89a(AM2_DEF_SNUM_HI,LMT) ! lat for 89a44
real(4) lat89b(AM2_DEF_SNUM_HI,LMT) ! lat for 89b 緯度
45
real(4) lon89a(AM2_DEF_SNUM_HI,LMT) ! lon for 89a 経度
46
real(4) lon89b(AM2_DEF_SNUM_HI,LMT) ! lon for 89b
47
real(4) geo1_89a(AM2_DEF_SNUM_HI,LMT)
物理量
48
real(4) geo1_89b(AM2_DEF_SNUM_HI,LMT)
49
integer(4) pdq1_89a(AM2_DEF_SNUM_HI,LMT)
50
integer(4) pdq1_89b(AM2_DEF_SNUM_HI,LMT) 品質フラグ
配列データ用変数
を宣言します。

211

AMSR2 データ利用解説文書◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
59 C hdf5 initialize
60
call H5open_f(ret)61
if(ret.lt.0)then
62
write(*,'(a,i12)')'h5open_f error: ',ret63
call exit(1)64endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
65 C open
66
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
67
if(ret.lt.0)then68
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
69call exit(1)
70
endif

212

AMSR2 データ利用解説文書◇NumberOfScans の設定 ※左側の数字は行番号です
HDF5 の FORTRAN90 ライブラリでは可変長文字列のメタデータを読み込めないので、
NumberOfScans を配列サイズから調べます。ここでは”Scan Time”のサイズを調べています。
配列サイズを取得するには、データセットをオープンして、データスペースをオープンしてから、
データセットのサイズ取得関数を使用します。不要になったハンドルはクローズします。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
82 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
83 C calculate NumberOfScans from array size and OverlapScans84
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)85
call H5Dget_space_f(dhnd,shnd,ret)86
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)87
if(ret.lt.0)then
88
write(*,'(a)')'H5Sget_simple_extent_dims error: Scan Time'89
call exit(1)90
endif
NumberOfScans は、
91
call H5Sclose_f(shnd,ret)「配列のスキャン数－(OverlapScans×２)」となります。
92
call H5Dclose_f(dhnd,ret)93
num=sz1(1)-ovr*2
94
write(*,'(a,i12)')'NumberOfScans(RETRIEVE BY ARRAY SIZE): ',num
95
write(*,'(a,i12)')'OverlapScans(FIXED VALUE): ',ovr◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値

213

AMSR2 データ利用解説文書◇時刻データ読込み※左側の数字は行番号です

データを読込むためには、データセットを H5Dopen()でオープンして、読込み用変数の各次元サ
イズを配列変数に設定しておきます。
時刻データの格納形式は TAI93 形式なので年/月/日/時/分/秒に変換します。

◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
103 C read array: scantime
104! read105
call H5Dopen_f(fhnd,'Scan Time',dhnd,ret)106
sz1(1)=LMT
107
call H5Dread_f(dhnd
読込み108+,H5T_NATIVE_DOUBLE,r8d1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
109
if(ret.lt.0)then110
write(*,'(a,a)')'H5Dread error: ','Scan Time'111
call exit(1)
112
endif
113
call H5Dclose_f(dhnd,ret)114! convert
115
call amsr2time(num,r8d1,st)
時刻変換
116! sample display
117
write(*,'(a,i4.4,"/",i2.2,"/",i2.2," ",i2.2,":",i2.2,":",i2.2)')
118+'time(scan=1): '119+,st(1)%year
AMSR2 プロダクトの時刻格納形式は、TAI93 形式と呼ばれる、
120+,st(1)%month
うるう秒を含めた 1993/01/01 からの通算秒です。
121+,st(1)%day122+,st(1)%hour
このままでは日時情報として扱い難いので、
123+,st(1)%minute
このサンプルプログラムでは年/月/日/時/分/秒に変換する
124+,st(1)%second
サブルーチンを用意しています。この時刻変換は AMTK を使用する場合は自動的に行われます。
◆時刻形式の変換→ P.11 基礎知識編３．６参照
call amsr2time(num,in,out)num: スキャン数を指定します
in: TAI93 形式の時刻データを指定します
out: [戻り値]AM2_COMMON_SCANTIME 構造体で年/月/日/時/分/秒データが返されます214

AMSR2 データ利用解説文書◇緯度経度データ読込み ※左側の数字は行番号です
P.15 基礎知識編３．１０参照

緯度経度データを読込みます。

125 C read array: latlon for 89a
126! read lat
127call H5Dopen_f(fhnd128+,'Latitude of Observation Point for 89A',dhnd,ret)129
sz1(1)=LMT
130sz1(2)=AM2_DEF_SNUM_HI
131
call H5Dread_f(dhnd132+,H5T_NATIVE_REAL,lat89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
緯度読込み
133
if(ret.lt.0)then134
write(*,'(a,a)')'H5Dread error: '135+ ,'Latitude of Observation Point for 89A'
136
call exit(1)
137
endif
138
call H5Dclose_f(dhnd,ret)139! read lon
140
call H5Dopen_f(fhnd141+,'Longitude of Observation Point for 89A',dhnd,ret)142
sz1(1)=LMT
143
sz1(2)=AM2_DEF_SNUM_HI
144
call H5Dread_f(dhnd
経度読込み
145
+,H5T_NATIVE_REAL,lon89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
146
if(ret.lt.0)then147
write(*,'(a,a)')'H5Dread error: '148+ ,'Longitude of Observation Point for 89A'
149
call exit(1)
150
endif
151
call H5Dclose_f(dhnd,ret)152! sample display
153
write(*,'(a,"(",f9.4,",",f9.4,")")')'latlon89a(pixel=1,scan=1): '154+,lat89a(1,1),lon89a(1,1)

215

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、物理量に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値
185 C read array: geophysical data for 1 layer for 89a
186
call H5Dopen_f(fhnd,'Geophysical Data for 89A',dhnd,ret)187! get scale
188
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)
スケール読込み
189
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)190
call H5Aclose_f(ahnd,ret)191! read192
sz1(1)=LMT
193
sz1(2)=AM2_DEF_SNUM_HI
194
call H5Dread_f(dhnd
読込み
195+,H5T_NATIVE_REAL,geo1_89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
196
if(ret.lt.0)then197
write(*,'(a,a)')'H5Dread error: '198+ ,'Geophysical Data for 89A'
199
call exit(1)
このスケール処理は AMTK を使用する場合は
200
endif
201
call H5Dclose_f(dhnd,ret)
自動的に行われます。
202! change scale→ P.16 基礎知識編３．１２参照
203
do j=1,num
204
do i=1,AM2_DEF_SNUM_HI
205
if(geo1_89a(i,j).gt.-32767)geo1_89a(i,j)=geo1_89a(i,j)*sca
スケール処理206
enddo
欠損値(-32768)と異常値(-32767)は除外して、
207
enddo
スケールを適用します。

216

AMSR2 データ利用解説文書◇L2 品質フラグデータ読込み※左側の数字は行番号です

L2 品質フラグデータを読込みます。
231 C read array: pixel data quality for 1 layer for 89a
232
call H5Dopen_f(fhnd,'Pixel Data Quality for 89A',dhnd,ret)233
sz1(1)=LMT234
sz1(2)=AM2_DEF_SNUM_HI
235
call H5Dread_f(dhnd236+,H5T_NATIVE_INTEGER,pdq1_89a,sz1,ret,H5S_ALL_F,H5S_ALL_F)
237
if(ret.lt.0)then238
write(*,'(a,a)')'H5Dread error: '239+ ,'Pixel Data Quality for 89A'
240
call exit(1)
241
endif
242
call H5Dclose_f(dhnd,ret)
L2 品質フラグには、アルゴリズム開発者が設定した物理量算出に係る補足情報が格納されています。
0～15 は OK 状態、16～255 は NG 状態を現します。
NG 状態の場合、物理量には欠損値(-32768)または異常値(-32767)が格納されています。
L2 品質フラグの詳細については、「AMSR2 高次プロダクトフォーマット説明書」(*1)を参照ください。
(*1)http://suzaku.eorc.jaxa.jp/GCOM_W/data/data_w_format_j.html◇終了処理 ※左側の数字は行番号です
ファイルをクローズします。HDF5 を終了します。
261 C close262
call H5Fclose_f(fhnd,ret)263
call H5close_f(ret)◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

217

AMSR2 データ利用解説文書

８．４．２ コンパイル方法(build_readL2H_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL2H_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
911～12 行目に、使用するコンパイラを指定します。
時刻変換関数が C 言語のため、C コンパイラも指定します。
インテルコンパイラ(ifort/icc)または PG コンパイラ(pgf90/pgcc)を指定します。
10 # compiler
11 fc=ifort
12 cc=icc
13
14 # source filename
15 fsrc="readL2H_hdf5.f"
16 csrc="amsr2time_.c"
17 obj=`echo $csrc|sed "s/¥.c/.o/g"`
18
19 # output filename
20 out=readL2H_hdf5_f
21
22 # library order
23 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
24
25 # c compile
26 cmd="$cc -g -c $csrc"
27 echo $cmd
28 $cmd
29
30 # f compile
31 cmd="$fc -g $fsrc $obj -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
32 echo $cmd
33 $cmd
34
35 # garbage
36 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL2H_hdf5_f.sh
icc -g -c amsr2time_.c
ifort -g readL2H_hdf5.f amsr2time_.o -o readL2H_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

218

AMSR2 データ利用解説文書

８．４．３ プログラム実行結果のサンプル
サンプルプログラムでは固定配列を多数使用しているため、環境によっては、リソース不足でセグ
メントエラーが発生します。その場合は、以下の制限解除コマンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL2H_hdf5_f GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
input file: GW1AM2_201303011809_125D_L2SGPRCHA0000000.h5
GranuleID(RETRIEVE FROM FILENAME): GW1AM2_201303011809_125D_L2SGPRCHA0000000
NumberOfScans(RETRIEVE BY ARRAY SIZE):
1972
OverlapScans(FIXED VALUE):
0limit of NumberOfScans = 2200
amsr2time: AMSR2_LEAP_DATA = /export/emc3/util/common/AMTK_AMSR2_DATA/leapsec.dat
amsr2time: year=1993 month= 7 tai93sec= 15638401.00
amsr2time: year=1994 month= 7 tai93sec= 47174402.00
amsr2time: year=1996 month= 1 tai93sec= 94608003.00
amsr2time: year=1997 month= 7 tai93sec= 141868804.00
amsr2time: year=1999 month= 1 tai93sec= 189302405.00
amsr2time: year=2006 month= 1 tai93sec= 410227206.00
amsr2time: year=2009 month= 1 tai93sec= 504921607.00
amsr2time: year=2012 month= 7 tai93sec= 615254408.00
amsr2time: number of leap second = 8time(scan=1): 2013/03/01 18:09:10
latlon89a(pixel=1,scan=1): ( 84.4188, -77.9502)
latlon89b(pixel=1,scan=1): ( 84.3305, -78.8925)
geo1_89a(pixel=1,scan=1): -32767.0 [mm/h] (PDQ: 16)
geo1_89b(pixel=1,scan=1): -32767.0 [mm/h] (PDQ: 16)219

AMSR2 データ利用解説文書

８．５ L3 輝度温度データ読込み
８．５．１ サンプルプログラム readL3B_hdf5.f 解説
サンプルプログラム readL3B_hdf5.f では、L3 輝度温度データファイルから、以下の格納データを読込んで、内容をテキスト表示します。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文
字列メタデータを読込めません。

格納データ* Brightness Temperature (H)- Brightness Temperature (V)以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

220

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none:
9 C interface variable
10
integer(4) i,j! loop variable11
integer(4) ret! return status12
character(len=512) buf ! text buffer
13
character(len=512) fn ! filename
14
integer(HID_T) fhnd
! file handle
15
integer(HID_T) ahnd
! attribute handle
16
integer(HID_T) atyp
! attribute type17
integer(HID_T) dhnd
! dataset handle
18
integer(HID_T) shnd
! dataspace handle
HDF5 用インターフェイス
19
integer(HSIZE_T) sz1(3) ! array size 1
変数を宣言します。
20
integer(HSIZE_T) sz2(3) ! array size 221
integer(4) x! grid size x
22
integer(4) y! grid size y:
28 C meta data
29 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
30 C retrieve GranuleID from filename
31 C
character(len=512) geo ! GeophysicalName
32
character(len=512) gid ! GranuleID:
35 C array data
配列データ用変数36
real(4),allocatable::tbH(:,:) 輝度温度を宣言します。
37
real(4),allocatable::tbV(:,:)
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
46 C hdf5 initialize
47
call H5open_f(ret)48
if(ret.lt.0)then49
write(*,'(a,i12)')'h5open_f error: ',ret50
call exit(1)51
endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
52 C open
53
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
54
if(ret.lt.0)then55
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
56call exit(1)
57
endif

221

AMSR2 データ利用解説文書◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
75 C get grid size
76
call H5Dopen_f(fhnd,'Brightness Temperature (H)',dhnd,ret)77
call H5Dget_space_f(dhnd,shnd,ret)78
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)79
if(ret.lt.0)then80
write(*,'(a,a)')'H5Sget_simple_extent_dims error: '81+ ,'Brightness Temperature (H)'82
call exit(1)
83
endif
84
call H5Sclose_f(shnd,ret)85
call H5Dclose_f(dhnd,ret)
86
x=sz1(1);87
y=sz1(2);88
write(*,'(a,i12)')'grid size x: ',x89
write(*,'(a,i12)')'grid size y: ',y◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メモリ領域を確保します。
90 C memory allocate
91
allocate(tbH(x,y),stat=ret)
92
if(ret.ne.0)then93
write(*,'(a)')'memory allocate error: tbH'
94
call exit(1)
95
endif

222

AMSR2 データ利用解説文書◇輝度温度データ読込み ※左側の数字は行番号です
輝度温度データを読込みます。
輝度温度は格納型が 2byte 符号なし整数(0～65535)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(65535)と異常値(65534)は除外します。
◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
101 C read horizontal
102
call H5Dopen_f(fhnd,'Brightness Temperature (H)',dhnd,ret)103! get scale
104
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)
スケール読込み
105
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)106
call H5Aclose_f(ahnd,ret)107! read108sz1(1)=y109
sz1(2)=x
読込み
110
call H5Dread_f(dhnd111+,H5T_NATIVE_REAL,tbH,sz1,ret,H5S_ALL_F,H5S_ALL_F)
112
if(ret.lt.0)then113
write(*,'(a,a)')'H5Dread error: '114+ ,'Brightness Temperature (H)'
このスケール処理は AMTK を使用する場合は
115
call exit(1)自動的に行われます。
116
endif
→ P.16 基礎知識編３．１２参照
117
call H5Dclose_f(dhnd,ret)118! change scale119
do j=1,y120
do i=1,x
スケール処理121
if(tbH(i,j).lt.65534)tbH(i,j)=tbH(i,j)*sca
122
enddo
欠損値(65535)と異常値(65534)は除外して、
123
enddo
スケールを適用します。

223

AMSR2 データ利用解説文書◇終了処理 ※左側の数字は行番号です
メモリを開放します。
239 C memory free240
deallocate(tbH)
241
deallocate(tbV)
ファイルをクローズします。HDF5 を終了します。
◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
242 C close243
call H5Fclose_f(fhnd,ret)244
call H5close_f(ret)
245
end

224

◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

AMSR2 データ利用解説文書

８．５．２ コンパイル方法(build_readL3B_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL3B_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
10 # compiler
11 fc=ifort
12
13 # source filename
14 fsrc="readL3B_hdf5.f"
15
16 # output filename
17 out=readL3B_hdf5_f
18
19 # library order
20 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
21
22 # f compile
23 cmd="$fc -g $fsrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3B_hdf5_f.sh
ifort -g readL3B_hdf5.f -o readL3B_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

225

AMSR2 データ利用解説文書

８．５．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3B_hdf5_f GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110.h5
GranuleID(RETRIEVE FROM FILENAME): GW1AM2_20130200_01M_EQMA_L3SGT06LA1110110
grid size x:
1440
grid size y:
720
ASCII ART OF HORIZONTAL BRIGHTNESS TEMPERATURE (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||411233344443444444444444444444444444444444444444444444443344322222244444||111134311113444444444444444444444444444444444444444444444444434233343111||124523445555555544444444444444443431234344414455544444444444211211111111||154544444444444444444444444544111111111111111113554444444442221111111112||412242554414444544444445341131111111111111111111455544445511111111111115||444444444424445554455554411111111111111111111111155555351111111111111124||444444442444111555155531111111111111111112111111111551511411111111111444||555555555551111121111311121111111111111111111111111111141554111111111155||115555555111111111115155311111111111111111111111111111114555554111111111||111555553111111111111111421111312111111111111111111111111555555551111111||111555521511111111111111455555111111111111111111111111111145555521111111||111155511111111111111113555555511111111111111111111111111154552111111111||111111111111111111111111111111111113111111111111111111111155111111111111||111111111111111111111111111111111111111111111111111111111351111111111111||111111111111111111111111111111111111111111111111111111111111111111111111||343323444333342434334344444444433433211111111111111111111344444441111133||333333333333333333333333333333334333333322222333333344334433333333333333|+------------------------------------------------------------------------+

226

AMSR2 データ利用解説文書

ASCII ART OF VERTICAL BRIGHTNESS TEMPERATURE (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||433344444444455455444444444444444444444454444444444444444444433333244545||333345433334554554444544444444444444444444545444444444444445544344344333||335534455555555555554555445455554443345455434555554444554444333333333333||355555555555555555455555555554333333333333333334555555555543333333333333||433343555535555555555555453343333333333333333333555555555533333333333335||555555555545555555555555533333333333333333333333355555453333333333333335||555555553555333555355543333333333333333333333333333553533433333333333555||655566655553333333333433343333333333333333333333333333353555333333333355||335555556333333333335355433333333333333333333333333333335555554333333333||333555554333333333333333433333433333333333333333333333333555555563333333||333555533533333333333333566665333333333333333333333333333355555543333333||333365533333333333333334666666533333333333333333333333333355554333333333||333333333333333333333333333333333334333333333333333333333355333333333333||333333333333333333333333333333333333333333333333333333333453333333333333||333333333333333333333333333333333333333333333333333333333333333333333333||444334444444443444444444444444444444333333333333333333333444555543333344||444444443344444444443333443444444444444444334444444444444444444444444444|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[1]: 50-100K[2]:100-150K[3]:150-200K[4]:200-250K[5]:250-300K[6]:300-350K[*]:other227

AMSR2 データ利用解説文書

８．６ L3 物理量データ読込み
８．６．１ サンプルプログラム readL3G_hdf5.f 解説
サンプルプログラム readL3G_hdf5.f では、L3 物理量データファイルから、以下の格納データを読込んで、内容をテキスト表示します。
メタデータ※HDF5 の FORTRAN90 ライブラリでは可変長文
字列メタデータを読込めません。

格納データ* Geophysical Data

以下の説明では、プログラムの似たような繰返しを省略して、上記の*印を付けたデータ読込みについて抜粋して解説します。各々の HDF5 関数は、最初に使用する際に使用説明を記載します。
HDF5 ライブラリでは、ファイルをオープンした後に、各データについてもオープンとクローズを繰り返します。各データの読込みは以下のような流れになります。
データをオープンする →必要な場合はスケールを取得する→ データを読込む → データをクローズする

228

AMSR2 データ利用解説文書◇変数宣言 ※左側の数字は行番号です1
program main
HDF5 用 use 文を宣言します。
2
use hdf5
3
implicit none:
9 C interface variable
10
integer(4) i,j! loop variable11
integer(4) ret! return status12
character(len=512) buf ! text buffer
13
character(len=512) fn ! filename
14
integer(HID_T) fhnd
! file handle
15
integer(HID_T) ahnd
! attribute handle
16
integer(HID_T) atyp
! attribute type17
integer(HID_T) dhnd
! dataset handle
18
integer(HID_T) shnd
! dataspace handle
HDF5 用インターフェイス
19
integer(HSIZE_T) sz1(3) ! array size 1
変数を宣言します。
20
integer(HSIZE_T) sz2(3) ! array size 221
integer(4) x! grid size x
22
integer(4) y! grid size y:
30 C meta data
31 C HDF5 FORTRAN LIBRARY CAN'T RETRIEVE VARIABLE STRING !
32 C retrieve GranuleID from filename
33 C
character(len=512) geo ! GeophysicalName
34
character(len=512) gid ! GranuleID:
37 C array data38
real(4),allocatable::geo1(:,:)
配列データ用変数
物理量
39
real(4),allocatable::geo2(:,:)
を宣言します。
40
real(4),allocatable::geotmp(:,:,:)
この時点では、配列データ用のメモリ領域は確保されていません。
後程、配列サイズを調べてから、メモリ領域の確保を行います。

◇開始処理 ※左側の数字は行番号です
HDF5 の初期化処理を行います。
◇HDF5 の初期化
call H5open_f(ret)ret: [戻り値]失敗の場合は負の値
49 C hdf5 initialize
50
call H5open_f(ret)51
if(ret.lt.0)then52
write(*,'(a,i12)')'h5open_f error: ',ret53
call exit(1)54
endif
ファイルをオープンします。
◇HDF5 ファイルオープン
call H5Fopen_f(fn,label1,fhnd,ret,label2)
fn: オープンするファイル名を指定します
label1: アクセスモードを指定します H5F_ACC_RDONLY_F で読込専用になります
fhnd: [戻り値]開いたファイルのハンドル値
ret: [戻り値]失敗の場合は負の値
label2: H5P_DEFAULT_F を指定します
55 C open
56
call H5Fopen_f(fn,H5F_ACC_RDONLY_F,fhnd,ret,H5P_DEFAULT_F)
57
if(ret.lt.0)then
58
write(*,'(a,a)')'H5Fopen error: ',fn(1:len_trim(fn))
59call exit(1)
60
endif

229

AMSR2 データ利用解説文書◇配列サイズ取得とメモリ領域確保※左側の数字は行番号です

配列サイズを取得します。
◇データセットのオープン
call H5Dopen_f(fhnd,nam,dhnd,ret)
fhnd: ファイルハンドル値を指定します
nam: データセット名を指定します
dhnd: [戻り値]データセットのハンドル値
ret: [戻り値]失敗の場合は負の値◇データスペースのオープン
call H5Dget_space_f(dhnd,shnd,ret)
dhnd: データセットハンドル値を指定します
shnd: [戻り値]データスペースのハンドル値
ret: [戻り値]失敗の場合は負の値◇データセットのサイズ取得
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)
shnd: データスペースハンドル値を指定します
sz1: [戻り値]データセットの各次元サイズ
sz2: [戻り値]データセットの各次元の最大サイズ
ret: [戻り値]失敗の場合は負の値
79 C get grid size
80
call H5Dopen_f(fhnd,'Geophysical Data',dhnd,ret)81
call H5Dget_space_f(dhnd,shnd,ret)82
call H5Sget_simple_extent_dims_f(shnd,sz1,sz2,ret)83
if(ret.lt.0)then84
write(*,'(a,a)')'H5Sget_simple_extent_dims error: '85+ ,'Geophysical Data'
86
call exit(1)
87
endif
88
call H5Sclose_f(shnd,ret)89
call H5Dclose_f(dhnd,ret)
90x=sz1(2);91
y=sz1(3);92
write(*,'(a,i12)')'grid size x: ',x93
write(*,'(a,i12)')'grid size y: ',y◇データスペースのクローズ
call H5Sclose_f(shnd,ret)
shnd: データスペースハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇データセットのクローズ
call H5Dclose_f(dhnd,ret)
dhnd: データセットハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
メモリ領域を確保します。
94 C memory allocate layer 1
95
allocate(geo1(x,y),stat=ret)
96
if(ret.ne.0)then
97
write(*,'(a)')'memory allocate error: geo1'
98
call exit(1)
99
endif

230

AMSR2 データ利用解説文書◇物理量データ読込み※左側の数字は行番号です

物理量データを読込みます。
積雪深(SND)・海面水温(SST)は物理量が 2 層あるので、この 2 つとそれ以外で処理を分けています。
積雪深の 2 層目は積雪水量[cm]です。海面水温の 2 層目は 10GHz による SST[℃]です。
物理量は格納型が 2byte 符号あり整数(-32768～32767)で、スケール値が設定されているので、輝度温度に付属しているアトリビュートにアクセスして、スケール値を読み出します。
スケールを適用する際は、欠損値(-32768)と異常値(-32767)は除外します。
◇アトリビュートのオープン
call H5Aopen_f(dhnd,nam,ahnd,ret)
dhnd: データセットハンドル値を指定します
nam: アトリビュート名を指定します
ahnd: [戻り値]アトリビュートのハンドル値
ret: [戻り値]失敗の場合は負の値◇アトリビュートのクローズ
call H5Aclose_f(ahnd,ret)
ahnd:アトリビュートハンドル値を指定します
ret: [戻り値]失敗の場合は負の値◇アトリビュート読込み
call H5Aread_f(ahnd,atyp,buf,sz1,ret)
ahnd: アトリビュートハンドル値を指定します
otyp: 出力変数の型を指定します
buf: 出力変数を指定します
sz1: buf の各次元サイズを設定しておきます(スカラ読込みでは無視されます)
ret: [戻り値]失敗の場合は負の値◇データ読込み
call H5Dread_f(dhnd,dtyp,buf,sz1,ret,label1,label2)
dhnd: データセットハンドル値を指定します
dtyp: データタイプ値を指定します
buf: 読込み用の変数を指定します
sz1: buf の各次元サイズを設定しておきます
ret: [戻り値]失敗の場合は負の値
label1,label2: 部分配列を読込む場合に使用します
全て読込む場合は、どちらも H5S_ALL_F を指定します
113 C read layer 1
114
if(gid(30:32).ne.'SND')then
115
call H5Dopen_f(fhnd,'Geophysical Data',dhnd,ret)116! get scale
117
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)
スケール読込み
118
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)119
call H5Aclose_f(ahnd,ret)120! read121
sz1(1)=y122
sz1(2)=x
123
call H5Dread_f(dhnd
読込み
124+ ,H5T_NATIVE_REAL,geo1,sz1,ret,H5S_ALL_F,H5S_ALL_F)
125
if(ret.lt.0)then126
write(*,'(a,a)')'H5Dread error: '127+,'Geophysical Data'
このスケール処理は AMTK を使用する場合は
128
call exit(1)
129
endif
自動的に行われます。
130
call H5Dclose_f(dhnd,ret)→ P.16 基礎知識編３．１２参照
131! change scale132
do j=1,y133
do i=1,x
スケール処理134
if(geo1(i,j).gt.-32767)geo1(i,j)=geo1(i,j)*sca
135
enddo
欠損値(-32768)と異常値(-32767)は除外して、
136
enddo
スケールを適用します。
137
endif

231

AMSR2 データ利用解説文書

2 層ある場合は、一時変数で全体を読込んだ後に、層ごとに分割しています。
138 C read layer 1 & 2
139
if(gid(30:32).eq.'SND')then140
call H5Dopen_f(fhnd,'Geophysical Data',dhnd,ret)141! get scale
142
call H5Aopen_f(dhnd,'SCALE FACTOR',ahnd,ret)143
call H5Aread_f(ahnd,H5T_NATIVE_REAL,sca,sz1,ret)144
call H5Aclose_f(ahnd,ret)145! read146
sz1(1)=y147
sz1(2)=x148
sz1(3)=2
149
call H5Dread_f(dhnd150+ ,H5T_NATIVE_REAL,geotmp,sz1,ret,H5S_ALL_F,H5S_ALL_F)
151
if(ret.lt.0)then152
write(*,'(a,a)')'H5Dread error: '153+,'Geophysical Data'
154
call exit(1)
155
endif
156
call H5Dclose_f(dhnd,ret)157! separate158
do j=1,y159
do i=1,x160
geo1(i,j)=geotmp(1,i,j)161
geo2(i,j)=geotmp(2,i,j)
162
enddo
163
enddo
164
! change scale165
do j=1,y166
do i=1,x167
if(geo1(i,j).gt.-32767)geo1(i,j)=geo1(i,j)*sca
168
if(geo2(i,j).gt.-32767)geo2(i,j)=geo2(i,j)*sca
169
enddo
170
enddo
171
endif

◇終了処理 ※左側の数字は行番号です
メモリを開放します。
357 C memory free358
deallocate(geo1)359
if(gid(30:32).eq.'SND')then
360
deallocate(geo2)
361
endif
ファイルをクローズします。HDF5 を終了します。
◇ファイルのクローズ
call H5Fclose_f(fhnd,ret)
fhnd:ファイルハンドル値を指定します
ret: [戻り値]失敗の場合は負の値
362 C close363
call H5Fclose_f(fhnd,ret)364
call H5close_f(ret)232◇HDF5 の終了
call H5close_f(ret)ret: [戻り値]失敗の場合は負の値

AMSR2 データ利用解説文書

８．６．２ コンパイル方法(build_readL3G_hdf5_f.sh 解説)
コンパイルに使用するスクリプト build_readL3G_hdf5_f.sh の内容について以下に説明します。
※左側の数字は行番号です
1 #!/bin/sh
2
3 ### environment
4 export LANG=C5
7～8 行目に、インストールしたライブラリの場所を指定します。
指定したライブラリディレクトリ直下には include ディレクトリと lib ディレクトリが必要です。
6 # library directory
7 HDF5=/home/user1/util/hdf5_1.8.4-patch1
8 SZIP=/home/user1/util/szip_2.1
9
11 行目に、使用するコンパイラを指定します。
インテルコンパイラ(ifort)または PG コンパイラ(pgf90)を指定します。
10 # compiler
11 fc=ifort
12
13 # source filename
14 fsrc="readL3G_hdf5.f"
15
16 # output filename
17 out=readL3G_hdf5_f
18
19 # library order
20 lib="-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm"
21
22 # f compile
23 cmd="$fc -g $fsrc -o $out -I$HDF5/include -I$SZIP/include -L$HDF5/lib-L$SZIP/lib $lib"
24 echo $cmd
25 $cmd
26
27 # garbage
28 rm -f *.o◇コンパイル実行サンプル※読みやすいように改行を追加しています。

$ ./build_readL3G_hdf5_f.sh
ifort -g readL3G_hdf5.f -o readL3G_hdf5_f-I/home/user1/util/hdf5_1.8.4-patch1/include-I/home/user1/util/szip_2.1/include-L/home/user1/util/hdf5_1.8.4-patch1/lib-L/home/user1/util/szip_2.1/lib-lhdf5hl_fortran -lhdf5_hl -lhdf5_fortran -lhdf5 -lsz -lz -lm

233

AMSR2 データ利用解説文書

８．６．３ プログラム実行結果のサンプル
環境によっては、リソース不足でセグメントエラーが発生します。その場合は、以下の制限解除コ
マンドを実行してください。
＜csh/tcsh 環境の場合＞$ unlimit＜sh/bash 環境の場合＞※以下のコマンドを順番に、4 つとも実行してください。
$ ulimit -d unlimited$ ulimit -m unlimited$ ulimit -s unlimited$ ulimit -v unlimited$ ./readL3G_hdf5_f GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
input file: GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000.h5
GranuleID(RETRIEVE FROM FILENAME): GW1AM2_20130200_01M_EQMA_L3SGCLWLA0000000
grid size x:
1440
grid size y:
720
ASCII ART OF GEOPHYSICAL DATA LAYER #1 (X/ 20GRID Y/ 40GRID)+------------------------------------------------------------------------+|||#21#####################################################################||2212###1113##########################################################222||1##################################11######3################011#42223322||2#############################00101112413333233###############343413131#||#20#######2###############00#1223452344213211120##########3355421131121#||#########################4#3222223232100110111110#######14*41111201111##||########0###000###0####111111112101201110*131121100##1#11#01211110100###||###########1011111111#211#11111210011121333223224321000#1###1111000000##||11#######00010122125#3###1#12232321100010020110001011122#######222321111||000######122131112311112#01112#11312212323110100000000110########1001110||100####32#12111141111000######2232322421212441331110011010######11111100||1000###1211232211251100########131112232110121313122011010#####231111001||11131212231110111111211111110012102#1231221223311213111021##011124223242||*33222511232222222223223331421022422322211024222222122113##0111421221132||101122112221111222111111111222312232232331243321212323221223312232222111||####################################311122122221112111221########21221##||########################################################################|+------------------------------------------------------------------------+[#]:missing[ ]:out of observation[0]: 0.000 - 0.030 Kg/m2[1]: 0.030 - 0.060 Kg/m2[2]: 0.060 - 0.090 Kg/m2[3]: 0.090 - 0.120 Kg/m2[4]: 0.120 - 0.150 Kg/m2[5]: 0.150 - 0.180 Kg/m2[*]:other

234

AMSR2 データ利用解説文書

９．AMSR2 プロダクトデータ一覧
以下に、サンプルプログラムで取り扱ったデータ一覧を示します。AMSR2 プロダクトには、これ以外にもデータがあります。詳しくは、関連文書の AMTK 取扱い説明書等をご覧ください。関連文書は、
GCOM-W1 データ提供サービス(http://gcom-w1.jaxa.jp/)からダウンロードできます。
表 10 サンプルプログラムで取り扱った L1B データ一覧
HDF5 データセット名*は算出値のため非格納

AMTK
出力型
ＴＭ

AMTK
アクセス関数AMTK_getScanTime()

AMTK
アクセスラベル

ＬＬ

AMTK_getLatLon()

AM2_LATLON_89A

486 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_89B

486 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_LO

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_06

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_07

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_10

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_18

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_23

243 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_36

243 x SCAN

Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ１
Ｕ１

Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｉ４
Ｉ４

AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathInt()AMTK_get_SwathInt()

AM2_TB06H
AM2_TB06V
AM2_TB07H
AM2_TB07V
AM2_TB10H
AM2_TB10V
AM2_TB18H
AM2_TB18V
AM2_TB23H
AM2_TB23V
AM2_TB36H
AM2_TB36V
AM2_TB89AH
AM2_TB89AV
AM2_TB89BH
AM2_TB89BV
AM2_PIX_QUAL_LO
AM2_PIX_QUAL_HI

Land_Ocean Flag 6 to 36

Ｕ１

Ｉ４

AMTK_get_SwathInt()

AM2_LOF_LO

Land_Ocean Flag 89

Ｕ１

Ｉ４

AMTK_get_SwathInt()

AM2_LOF_HI

243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
243 x SCANx 6
486 x SCANx 2
243 x SCAN
243 x SCAN

Scan Time
Latitude of Observation Point for 89ALongitude of Observation Point for 89A
Latitude of Observation Point for 89B
Longitude of Observation Point for 89B* 緯度(低周波平均)* 経度(低周波平均)* 緯度(6G)* 経度(6G)* 緯度(7G)* 経度(7G)* 緯度(10G)* 経度(10G)* 緯度(18G)* 経度(18G)* 緯度(23G)* 経度(23G)* 緯度(36G)* 経度(36G)
Brightness Temperature (6.9GHz,H)
Brightness Temperature (6.9GHz,V)
Brightness Temperature (7.3GHz,H)
Brightness Temperature (7.3GHz,V)
Brightness Temperature (10.7GHz,H)
Brightness Temperature (10.7GHz,V)
Brightness Temperature (18.7GHz,H)
Brightness Temperature (18.7GHz,V)
Brightness Temperature (23.8GHz,H)
Brightness Temperature (23.8GHz,V)
Brightness Temperature (36.5GHz,H)
Brightness Temperature (36.5GHz,V)
Brightness Temperature (89.0GHz-A,H)
Brightness Temperature (89.0GHz-A,V)
Brightness Temperature (89.0GHz-B,H)
Brightness Temperature (89.0GHz-B,V)
Pixel Data Quality 6 to 36
Pixel Data Quality 89

HDF5
格納型
Ｒ８
Ｒ４
Ｒ４
Ｒ４
Ｒ４

SCAN

Earth Incidence
Ｉ２
Ｒ４
AMTK_get_SwathFloat()
AM2_EARTH_INC
Earth Azimuth
Ｉ２
Ｒ４
AMTK_get_SwathFloat()
AM2_EARTH_AZ
Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体

235

サイズ

AMSR2 データ利用解説文書

表 11 サンプルプログラムで取り扱った L1R データ一覧
HDF5 データセット名*は抽出値のため非格納

AMTK
出力型
ＴＭ

AMTK
アクセス関数AMTK_getScanTime()

AMTK
アクセスラベル

ＬＬ

AMTK_getLatLon()

AM2_LATLON_RS_89A

486 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_RS_89B

486 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_RS_LO

243 x SCAN

Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ２
Ｕ１
Ｕ１

Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｒ４
Ｉ４
Ｉ４

AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathFloat()
AMTK_get_SwathInt()AMTK_get_SwathInt()

AM2_RES06_TB06H
AM2_RES06_TB06V
AM2_RES06_TB07H
AM2_RES06_TB07V
AM2_RES10_TB10H
AM2_RES10_TB10V
AM2_RES23_TB18H
AM2_RES23_TB18V
AM2_RES23_TB23H
AM2_RES23_TB23V
AM2_RES36_TB36H
AM2_RES36_TB36V
AM2_RES36_TB89H
AM2_RES36_TB89V
AM2_TB89AH
AM2_TB89AV
AM2_TB89BH
AM2_TB89BV
AM2_PIX_QUAL_LO
AM2_PIX_QUAL_HI

Land_Ocean Flag 6 to 36

Ｕ１

Ｉ４

AMTK_get_SwathInt()

AM2_LOF_RES_LO

Land_Ocean Flag 89

Ｕ１

Ｉ４

AMTK_get_SwathInt()

AM2_LOF_RES_HI

243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
243 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
486 x SCAN
243 x SCANx 4
486 x SCANx 2
243 x SCAN
243 x SCAN

Scan Time
Latitude of Observation Point for 89ALongitude of Observation Point for 89A
Latitude of Observation Point for 89B
Longitude of Observation Point for 89B* 緯度(低周波用)* 経度(低周波用)
Brightness Temperature (res06,6.9GHz,H)
Brightness Temperature (res06,6.9GHz,V)
Brightness Temperature (res06,7.3GHz,H)
Brightness Temperature (res06,7.3GHz,V)
Brightness Temperature (res10,10.7GHz,H)
Brightness Temperature (res10,10.7GHz,V)
Brightness Temperature (res23,18.7GHz,H)
Brightness Temperature (res23,18.7GHz,V)
Brightness Temperature (res23,23.8GHz,H)
Brightness Temperature (res23,23.8GHz,V)
Brightness Temperature (res36,36.5GHz,H)
Brightness Temperature (res36,36.5GHz,V)
Brightness Temperature (res36,89.0GHz,H)
Brightness Temperature (res36,89.0GHz,V)
Brightness Temperature (original,89GHz-A,H)
Brightness Temperature (original,89GHz-A,V)
Brightness Temperature (original,89GHz-B,H)
Brightness Temperature (original,89GHz-B,V)
Pixel Data Quality 6 to 36
Pixel Data Quality 89

HDF5
格納型
Ｒ８
Ｒ４
Ｒ４
Ｒ４
Ｒ４

SCAN

Earth Incidence
Ｉ２
Ｒ４
AMTK_get_SwathFloat()
AM2_EARTH_INC
Earth Azimuth
Ｉ２
Ｒ４
AMTK_get_SwathFloat()
AM2_EARTH_AZ
Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体

236

サイズ

AMSR2 データ利用解説文書

表 12 サンプルプログラムで取り扱った L2 低解像度データ一覧
AMTK
出力型
ＴＭ

AMTK
アクセス関数AMTK_getScanTime()

AMTK
アクセスラベル

Scan Time
Latitude of Observation PointLongitude of Observation Point

HDF5
格納型
Ｒ８
Ｒ４
Ｒ４

ＬＬ

AMTK_getLatLon()

AM2_LATLON_L2_LO

243 x SCAN

Geophysical Data

Ｉ２

Ｒ４

AMTK_get_SwathFloat()

AM2_SWATH_GEOA(*1)

Pixel Data Quality

Ｕ１

Ｕ１

AMTK_get_SwathUChar()

AM2_PIX_QUALLAYER x
243 x SCAN
243 x SCAN
x LAYERHDF5 データセット名

サイズ
SCAN

Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体(*1)1 層目だけ取得する場合は「AM2_SWATH_GEO1」、2 層目だけ取得する場合は「AM2_SWATH_GEO2」

表 13 サンプルプログラムで取り扱った L2 高解像度データ一覧
AMTK
出力型
ＴＭ

AMTK
アクセス関数AMTK_getScanTime()

AMTK
アクセスラベル

Scan Time
Latitude of Observation Point for 89ALongitude of Observation Point for 89A
Latitude of Observation Point for 89B
Longitude of Observation Point for 89B

HDF5
格納型
Ｒ８
Ｒ４
Ｒ４
Ｒ４
Ｒ４

ＬＬ

AMTK_getLatLon()

AM2_LATLON_L2_89A

486 x SCAN

ＬＬ

AMTK_getLatLon()

AM2_LATLON_L2_89B

486 x SCAN

Geophysical Data for 89A

Ｉ２

Ｒ４

AMTK_get_SwathFloat()

Geophysical Data for 89B

Ｉ２

Ｒ４

AMTK_get_SwathFloat()

AM2_SWATHA_GEOA(*1)
AM2_SWATHB_GEOA(*2)

Pixel Data Quality for 89A

Ｕ１

Ｕ１

AMTK_get_SwathUChar()

AM2_PIX_QUAL_A

Pixel Data Quality for 89B

Ｕ１

Ｕ１

AMTK_get_SwathUChar()

AM2_PIX_QUAL_B

LAYER x
486 x SCAN
LAYER x
486 x SCAN
486 x SCAN
x LAYER
486 x SCAN
x LAYERHDF5 データセット名

サイズ
SCAN

Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体(*1)1 層目だけ取得する場合は「AM2_SWATHA_GEO1」、2 層目だけ取得する場合は「AM2_SWATHA_GEO2」(*2)1 層目だけ取得する場合は「AM2_SWATHB_GEO1」、2 層目だけ取得する場合は「AM2_SWATHB_GEO2」

表 14 サンプルプログラムで取り扱った L3 輝度温度データ一覧
HDF5
AMTK
AMTK
AMTK
格納型 出力型
アクセス関数
アクセスラベル
Brightness Temperature (H)Ｕ２Ｒ４
AMTK_get_GridFloat()
AM2_GRID_TBH
Brightness Temperature (V)Ｕ２Ｒ４
AMTK_get_GridFloat()
AM2_GRID_TBV
Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体(*1)P.10「図 6 L3 グラニュール ID」参照。格納順は(経度または横)→(緯度または縦)。
HDF5 データセット名

サイズ
(*1)
(*1)

表 15 サンプルプログラムで取り扱った L3 物理量データ一覧
AMTK
アクセスラベル
AM2_GRID_GEOA
Geophysical Data
Ｉ２
Ｒ４
AMTK_get_GridFloat()(*2)
Ｉ４:4byte 符号付き整数型、Ｉ２:2byte 符号付き整数型、Ｕ２:2byte 符号なし整数型、Ｕ１:1byte 符号なし整数型、
Ｒ８:8byte 浮動小数点型、Ｒ４:4byte 浮動小数点型、ＴＭ:時刻構造体、ＬＬ:緯度経度構造体(*1)P.10「図 6 L3 グラニュール ID」参照。格納順は(経度または横)→(緯度または縦)。
(*2)1 層目だけ取得する場合は「AM2_GRID_GEO1」、2 層目だけ取得する場合は「AM2_GRID_GEO2」
HDF5 データセット名

HDF5
格納型

AMTK
出力型

237

AMTK
アクセス関数

サイズ(*1) x LAYERAMSR2 データ利用解説文書

１０．AMTK 定数
表 16～表 17 に AMTK に定義されている定数を示します。
表 16 AMTK 定数
定数名
AM2_DEF_SNUM_HI
AM2_DEF_SNUM_LO
AM2_DEF_IMISS
AM2_DEF_UIMISS
AM2_DEF_CMISS
AM2_DEF_RMISS

内容
高解像度ピクセル数
低解像度ピクセル数
2byte 符号あり整数欠損値
2byte 符号なし整数欠損値
1byte 符号なし整数欠損値
浮動小数点数欠損値

表 17
地図投影
等緯度経度(低解像度)
等緯度経度(高解像度)
ポーラステレオ北(低解像度、TB・SIC)
ポーラステレオ北(高解像度、TB・SIC)
ポーラステレオ南(低解像度、TB・SIC)
ポーラステレオ南(高解像度、TB・SIC)
ポーラステレオ北(低解像度、SND)
ポーラステレオ北(高解像度、SND)

方向
経度
緯度
経度
緯度
横
縦
横
縦
横
縦
横
縦
横
縦
横
縦

238

L3 解像度定数
定数名
AM2_DEF_L3L_EQ_X
AM2_DEF_L3L_EQ_Y
AM2_DEF_L3H_EQ_X
AM2_DEF_L3H_EQ_Y
AM2_DEF_L3L_PN1_X
AM2_DEF_L3L_PN1_Y
AM2_DEF_L3H_PN1_X
AM2_DEF_L3H_PN1_Y
AM2_DEF_L3L_PS_X
AM2_DEF_L3L_PS_Y
AM2_DEF_L3H_PS_X
AM2_DEF_L3H_PS_Y
AM2_DEF_L3L_PN2_X
AM2_DEF_L3L_PN2_Y
AM2_DEF_L3H_PN2_X
AM2_DEF_L3H_PN2_Y

値
486
243
-3276865535
255-9999.0

値
1440
720
3600
1800
304
448
760
1120
316
332
790
830
432
574
1080
1435