Diff of ROMS/Climatological Runs


#br
* Prepare Climatology [#sc1ac203]
#br

まずはclimatologyの計算をしてみましょう.これは,境界条件や外力条件に長期間の平均値を用いることにより,「気候学的に平均的な」海洋の状態をシミュレートしようというもので,モデリングの基本になります.

#br
** ROMS climatological run用のファイルの準備 [#e98f6554]

- climatology用データファイルの確認

各自のhome directoryにDATAディレクトリを配置し,その中にデータをコピーしてある.

 $ cd ~/DATA

*** 1) SRTM30 Topography [#y6672b3f]

 ~/DATA/SIO_Topo/srtm30.nc

グローバル水深データベース(30秒グリッド ~ 1 km)
データソース:
 http://topex.ucsd.edu/WWW_html/srtm30_plus.html
同梱されているsrtm30.mは,生データをnetcdfに変換するmatlabスクリプト.

*** 2) SCOW [#f90050e9]

The Scatterometer Climatology of Ocean Winds by Risien and Chelton
人工衛星(QuikSCAT)によるグローバルな海上風データベース.
データソース:
 http://cioss.coas.oregonstate.edu/scow/
使用するデータは,zonal(経度方向)およびmeridional(緯度方向)の風応力.
 wind_stress_zonal_monthly_maps.nc
 wind_stress_meridional_monthly_maps.nc

*** 3) SODA [#xba79e8a]

Simple Ocean Data Assimilation (POPベースのグローバル海洋モデル+データ同化) by Carton et al. 毎月出力@0.5度データを,月平均気候値(monthly clomatology)に再構成したファイルを使用.
 SODA_1996_2007_monthly_clim.nc
データソース:
 http://www.atmos.umd.edu/~ocean/

以下のデータは,~/matlab/Roms_tools以下に配置されている.

*** 4) COADS [#ja447f0e]

グローバルな海上における各種フラックス(熱,放射,SSTなど)の気候値データベース.
 ~/matlab/Roms_tools/COADS05
フラックス等のデータ種類毎に別ファイルに分かれている.
データソース:
 http://www.ncdc.noaa.gov/oa/climate/coads/

*** 5) Pathfinder AVHRR [#c6ff41b3]

グローバルな海面水温データベース.人工衛星(Pathfinder)の赤外線センサー(AVHRR)から再構成されたmonthly climatology.
 ~/matlab/Roms_tools/SST_pathfinder

*** 6) MSM [#s856d0c0]

気象庁メソ気象モデルGPV-MSM.気候値は整備中.

#br
** グリッドファイルの作成 [#i43cb7e8]
#br

*** 1) easy grid (EGRID) [#ff913a1f]

matlab用スクリプト「easy」を起動して,計算領域を設定する.

 $ cd ~/matlab/EGRID
 $ mat
 >> easy

領域の中心座標(緯度,経度で指定),x軸とy軸の長さ,格子点数(nx, ny),領域の傾きを決めてグリッドを作成.
グリッドファイル「roms_grd.nc」が作られる.水深データにはetopo5というグローバル5分間隔地形データを用られ,仮の地形(hraw)が計算される.2011年6月時点では,easy gridのバグのため,hrawの正負の符号が逆になってしまっている.この修正は,「mod_depth.m」で行うか,次のようにmatlabで簡単にすることができる.

 >> nc=netcdf('jpcoast_grd.nc','w');
 >> hraw=nc{'hraw'}(:);
 >> nc{'hraw'}(:)=-hraw;
 >> close(nc);

注意点:ROMSではインテル製CPUのパイプライン構造に最適化するためにスレッド化されている.また,並列計算では複数のCPUを使用することになる.そのため,通常は計算領域を分割することを意識する必要がある.例えば,学生用WSではCPUは4つのコアを持っており,かつハイパースレッディングという仮想的なコア増設技術を使用しているので,最大で8コア利用できる.基本的な考えかたとして,領域を8分割して各コアにそれぞれの分割領域の計算をさせることになる.よって,平面的な格子点数が200 x 200である場合,8コアに領域を分割すると,x方向に2で,y方向に4で割って8分割すればよい(param.h中のnsub_x=2, nsub_e=4).ただし,CPUのパイプラインを最大限効率的に利用する場合は,分割後の小領域(タイル)は100 x 10程度であることが望ましい.その場合,200 x 200の計算領域に対する最適な分割数は,nsub_x=2, nsub_e=20となる(合計80タイル:8の倍数なので8コアCPUで利用可能).大型計算機で計算する場合は,一般的にCPUの数が16, 32, 64, 128, 256のように2のべき乗であることが多い.そのため,計算領域はなるべく多くの公約数を持つ数にすると,様々な計算環境に対応できる.つまり,200 x 200よりは,192 x 192にした方が汎用性が高いグリッドになる.


*** 2) editmask [#wa67cb29]

同じくmatlab用スクリプト「editmask」を起動し,詳細な海岸線情報をもとに,land maskを修正する.まず,easy gridで作成したグリッドファイルをeditmaskのあるディレクトリにコピーし,editmaskを起動する.

 $ cd ~/matlab/grid_tools/editmask
 $ cp -pv ~/matlab/EGRID/roms_grd.nc project_grd.nc
 $ mat
 >> editmask

このとき,標準的なグリッドファイル名(roms_grd.nc)を,各プロジェクトに対応したファイル名に変更することを推奨する.例えば,東日本を対象にした,解像度5kmのグリッドであれば,eastjp5km_grd.ncのようにすると,他のグリッドを作成したときに判別しやすくなる.

また,editmaskを起動すると,「ROMSグリッドファイル」と「海岸線ファイル」を要求される.前者には上記のproject_grd.ncを指定,後者には対応する地域の海岸線ファイルを適宜していする.もし海岸線ファイルがない場合は,NOAAのCoastline ExtractorでASCII形式の海岸線ファイルをDLし,editmaskと同じディレクトリにあるmatlabスクリプト「convert_coastline_extractor_uswc_noaa.m」を適宜修正して変換すれば良い.

land maskは各格子点で定義されている,陸と海を判別するフラッグであり,1だと海,0だと陸で計算から除外される.easy gridで自動作成されたland maskは解像度の粗い地形データetopo5に基づいて計算されているので,実際の海岸線と結構ずれてしまっているため,この作業が必要になる.海と陸の判定は各計算領域によって異なるので一概には言えないが,一般的には格子の40%以上が海ならば海にセットする.海峡部や複雑地形がある場合,格子の解像度が低いと海陸の判定が難しくなるが,なるべく1グリッドの幅の水路は作らないように,最低でも2グリッドの幅になるように調整すると,大きな流速の出現が抑制され,安定に計算できることが多いので,留意すること.


*** 3) extract_3sec_bath.m [#fa0bbc68]

このスクリプトは,NOAA Coastal Reliefデータという3秒(約90m)間隔の高解像度地形データを切りだし,project_grd.ncに線形補間してマッピングするものである.この3秒データはアメリカ周辺海域のデータしか含まないので,SRTM30データやJEGG(海上保安庁水路部による500m間隔の日本沿岸地形データベース)などを使って同じような作業をする必要がある.計算領域によって高解像度地形データセットは異なるので,プロジェクト毎に対応しなければならない.
今回のclimatologyモデリングでは空間解像度が粗い(10 km前後)であると思われるので,この部分の作業は行わない.作業の詳細については別の機会に説明する.


*** 4) lsmooth [#w9006cb7]

editmask(プラスextract_3sec_bath.m)の作業が終わったら,グリッドファイルをプロジェクトディレクトリにコピーする.例えば,

 $ cd ~/ROMS
 $ mkdir project1
 $ cd project1
 $ mkdir grid
 $ cd grid
 $ cp -pv ~/matlab/grid_tools/editmask/project_grd.nc .

のように整理するとスッキリするかも知れない.さらに下記のコマンドを実行する.

 $ lsmooth  50  0.18  project_grd.nc

「lsmooth」はフォートランで書かれたスクリプトであり,グリッドファイル中のhrawをもとに,最小水深を設定した上(上記の場合は50m)で,σ座標エラーを防ぐためのスムージング(上記の場合,パラメータrmax=0.18)を施し,「h」としてグリッドファイルに書き込む作業を行う.1000km以上の大領域では陸棚の効果を擬似的に取り込むため,50 mとか100 mにすると良い結果が得られる.解像度の高い小領域では,潮位変動などを受容する最小の水深を設定することが多い(例えば,2mとか).rmaxの値は 0.2以下にしないと,地形急変部での計算値の信頼性が著しく低下する.ここでの推奨値は0.18である.


*** 5) mod_cgrid.m [#j42b60c1]

親グリッド(SODAなどのグローバルデータや,ROMSによる親グリッド)と子グリッド(現在作成しているグリッド)では,解像度の違いなどに起因して子グリッド境界線上における地形と,同じポイントでの親グリッドの水深が異なる可能性がある.このスクリプトは2つのグリッドの地形を適当な距離で徐々にブレンドするものである.今回は鉛直デカルト座標系のSODAが親グリッドであるので,地形適合座標のROMSとは地形が相当異なることが予想されるが,どのみちSODAとROMSではモデルの性質が大きく異なるため,子グリッド境界上でのデータの差は地形の差以上に大きい.そのため,今回はこれを考慮しない.しかし,ROMS --> ROMSへのネスティングでは,このブレンド作業をすることによって境界におけるノイズ等を大幅に抑制できることが分かっているので,必ず考慮しなければならない.

#br
** 外力ファイルの作成 [#wdf4c968]
#br

*** make_frc_clim.m [#h5ad91e2]

~/ROMS/project1/bryに格納されているはず.
COADS,Pathfinder,SCOWデータをROMSグリッド上にマッピングするためのスクリプト.最初の10数行を適宜編集すれば,自動的にmonthly clomatologyによる外力(forcing)ファイルが作成される.編集する項目は以下の通り.

 frc_name        これから作成するforcingファイルのパス(./project_frc_clm.ncなど)
 grdname        もとになるROMS用グリッドファイルのパス(../grid/project_grd.ncなど)
 coads_dir        COADSデータが格納されているディレクトリへのパス
 scow_zon, scow_mer    SCOWデータ(zonal, meridional成分)へのパス
 sst_file            Pathfinderデータへのパス
 ROMS_title        このforcingファイルの説明(出力ncファイルに書き込まれる)

これ以外はデフォルトのままでOK.

#br
** 初期条件・境界条件ファイルの作成 [#h964e457]
#br

*** make_soda_clim_bry_ini_v2.m [#id848d0b]

~/ROMS /project1/bryに格納されているはず.SODAのmonthly climatologyを3次元的にROMSグリッドにマッピングするスクリプト.最初の10数行を編集して実行すれば,初期条件(iniファイル.12 月と1月の平均値)と境界条件(bryファイル)のファイルを作成してくれる.

 bry_name        これから作成するbryファイルのパス(./project_soda_clim_bry.ncなど)
 ini_name        これから作成するiniファイルのパス(./project_soda_clim_ini.ncなど)
 grdname        もとになるROMS用グリッドファイルのパス(../grid/project_grd.ncなど)
 coefmat        3次元補間係数のファイル(中間ファイル.ROMSには使わない)
 
 volcon = true            3次元流速と,水深平均流速との間に生じる誤差の補正(常にtrue)
 create_ini = true        iniファイルを新規作成するかどうか(基本的にtrue)
 create_bry = true       bryファイルを新規作成するかどうか(基本的にtrue)
 
 obc = [1 0 1 1]            開境界フラッグ.順番は[S E N W].1は開境界,2は閉境界.
 scoord = 'NEW'        鉛直S座標の式(UCLA-ROMS用は必ず'NEW'にする)
 N = 32                       鉛直方向のメッシュ分割数
 theta_s                    S座標の海表面付近の鉛直格子間隔の細かさ(大きいほど細かい.標準値は5-10程度)
 theta_b                    S座標の海底面付近の鉛直格子間隔の細かさ(大きいほど細かい.標準値は0-2程度.0は細かくしない設定)
 hc=200                    混合層のおおよその厚さ.この水表面からz = -hcまでの間の鉛直メッシュ間隔をtheta_sで制御することになる.
 
 soda                    SODAデータへのパス
 ROMS_title        ini, bryファイルの説明(出力ncファイルに書き込まれる)