ラベル JAGURS の投稿を表示しています。 すべての投稿を表示
ラベル JAGURS の投稿を表示しています。 すべての投稿を表示

2023/12/28

JAGURS on (intel) Mac w/ Homebrew

More recent information on June 4, 2024, we need to prepare ourself proj because proj@7 has been disabled. It's still available if you are using MacPorts.

Error: proj@7 has been disabled because it is a versioned formula! It was disabled on 2024-02-12.

(2024.9.6追記)

LIBS=-L$(PROJ4_DIR)/lib -L$(NETCDF)/lib -lnetcdff -lnetcdf -lsz -lproj $(FFTW3_LIB) -lm

のように,homebrew で他のバージョンのprojが /usr/local 等に入っている場合,自分で入れたPROJ4のディレクトリを先にリンカに指定する必要がある.


2023年12月27日現在の macOS Ventura 13.6.3 + Homebrew でのJAGURSのコンパイルについて再整理しておく。


  • gcc ... gfortran を使うので、gcc と gfortran をbrew で入れて、/usr/local/bin/gcc を使う。
    • FC=/usr/local/bin/gfortran
    • CC=/usr/local/bin/gcc
      • /usr/local/bin/gcc は無さそうなので, /usr/local/bin/gcc-14
  • proj ... メインのproj は、9.3.1 なので、おそらく動かない?ので、7.2.1 なproj@7 パッケージを使う。
    •   PROJ4_DIR=/usr/local/opt/proj@7
  • netcdf ... netcdf-fortran パッケージを入れる
  • fftw3 ... Homebrew のパッケージ名が fftw に変わってた
% brew install gcc gfortran proj@7 netcdf-fortran fftw


Makefile.gfortran をベースにして、以下の修正。

-FC=mpif90

+FC=/usr/local/bin/gfortran


-PROJ4_DIR=$(HOME)/local

-CC=gcc

+PROJ4_DIR=/usr/local/opt/proj@7

+CC=/usr/local/bin/gcc-13


-FFTW3_INCLUDE_DIR=$(HOME)/local/include

+FFTW3_INCLUDE_DIR=/usr/local/include


-NETCDF=$(HOME)/local

+NETCDF=/usr/local


-MPI=ON

+MPI=OFF


特殊な手続きは無しでコンパイル出来るようになったな。。。この記事の役割もほぼ終わったな。


input/ の中でそのままテスト計算(MPI部分はtsun.parから削除) on 1.4GHz dual cores Core i7

../src/jagurs par=tsun.par  4113.94s user 52.32s system 120% cpu 57:42.04 total

 

 



2022/02/06

JAGURS on MacOS Monterey with homebrew


 iMac 24" (M1)と iMac 27" (Intel) で改めてJAGURSで計算できる環境を作ったのでそのまとめ.

【訂正】2022.4.23

homebrew で, proj@7 が入っていることを同僚が教えてくれました.ので,proj-4.9.3は必要なく,Makefileで/opt/homebrew/Cellar/proj@7/7.2.1を/opt/homebrew/lib より前に指定すれば大丈夫なようです.かつ,最新版JAGURS(D0516)で,2020年に書いた mapproject.c の対応が本流に入ってるので,proj@7で無修正で動くようになりました.

ライブラリとして,netcdf, fftw3, proj4 が必要だけど,proj4は新しいのだと動かないので古いのを持ってくる.netcdfとfftw3は homebrew ので問題なし.

% brew install netcdf netcdf-fortran fftw3

proj4は,past-release から proj-4.9.3.tar.gz を持ってきました.

% ./configure --prefix=$HOME/local

% make

% make install


JAGURSのコンパイルは,Makefile.gfortran をベースにしました.

% rm Makefile (Makefile.SC_ICEに向いてるので)

% cp Makefile.gfortran Makefile


MPIはなし,とりあえず /usr/bin/gcc

% rcsdiff -u Makefile

===================================================================

RCS file: Makefile,v

retrieving revision 1.1

diff -u -r1.1 Makefile

--- Makefile    2022/02/04 21:52:49     1.1

+++ Makefile    2022/02/04 22:58:07

@@ -1,18 +1,18 @@

 # FC: Specify Fortran90 compiler command.

-FC=mpif90

+FC=gfortran


 # Added for displacement.

 # PRJ4_DIR: Specify PROJ.4 install directory.

 # CC&CFLAGS: Specify C compiler command and flags.

 PROJ4_DIR=$(HOME)/local

-CC=gcc

+CC=/usr/bin/gcc

 CFLAGS=-g -I$(PROJ4_DIR)/include


 # BASE: Specify basic compiler options.

 BASE=-cpp -fconvert=big-endian


 # FFTW3_INCLUDE_DIR: Specify FFTW3 include directory.

-FFTW3_INCLUDE_DIR=$(HOME)/local/include

+FFTW3_INCLUDE_DIR=/opt/homebrew/include


 # FFTW3_LIB: Specify linker options to link FFTW3.

 FFTW3_LIB=-lfftw3

@@ -21,7 +21,7 @@

 OPT=-O2 -fopenmp -I$(FFTW3_INCLUDE_DIR)


 # NETCDF: Specify the path to NetCDF library.

-NETCDF=$(HOME)/local

+NETCDF=/opt/homebrew


 # LIBS: Specify linker options.

 LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) -lm

@@ -40,7 +40,7 @@


 # MPI=ON: MPI version is made.

 # Else, serial version is made.

-MPI=ON

+MPI=OFF


 # USE_ALLTOALLV=ON: Use MPI_Alltoallv for inter-nest communications.

 # Else, MPI_Allreduce is used.

 

せっかくなので,inputにあるサンプルをベースにして,ベンチマーク.

Intel ... 3.6GHz 10コア第10世代Intel Core i9プロセッサ

M1 ... 4つの高性能コアと4つの高効率コアを搭載した8コアCPU、8コアGPU、16コアNeural Engineを持つApple M1チップ

% cat gridfile.dat

SD01 SD01 1 bathy.SD01.grd disp.SD01.grd

SD02 SD01 0 bathy.SD02.grd disp.SD02.grd

SD03 SD02 0 bathy.SD03.grd disp.SD03.grd


tsun.par:

dt=0.5

tend=21600

itmap=1200


こんな感じの設定で,M1はフルに8コアなので,Intelもそれに合わせて OMP_NUM_THREADS=8 に制限して実行した.

Intel ... All 5187.004 [s](デフォ20coresで 4823.238[s])

M1 ... All 5174.547 [s]


2020/11/25

JAGURS on MacOS Big Sur with homebrew


自分の環境のパッケージ管理を MacPorts から homebrew に乗り換えたりしたので改めてJAGURS を作り直してみる.ソースコードは,github から latest release になってる V0515a を持ってくる.使う環境は以下の通り:

MacBook Air (13-inch, 2017)

2.2GHz dual core Intel Core i7

8GB 1600MHz DDR3 memory

Big Sur

ライブラリのインストール

% brew install gmt fftw

 どうやら,proj_api.h が標準include pathに入ってくれなくなった?ようです.ので,

% find /usr/local -name proj_api.h

で探して,出てきたディレクトリを 

PROJ4_DIR=/usr/local/Cellar/proj@7/7.2.1

のように設定して下さい.以下のMakefileでは設定されていません (汚い).

Makefileの編集(編集後のファイルをリンク先に置いておきます)

Makefile@ -> Makefile.SC_ICE されてるので,とりあえず解除してから編集しています.編集箇所は,コンパイラを gcc-10, gfortran-10 にして,ライブラリ関係を /usr/local に設定. -lfftw が必要.MPI= なしに設定.-openmp は -o penmp として機能してしまうので, -fopenmp に修正.

% rm Makefile

% cp Makefile.SC_ICE Makefile

% rcsdiff Makefile

===================================================================

RCS file: Makefile,v

retrieving revision 1.1

diff -r1.1 Makefile

2c2

< FC=ifort

---

> FC=/usr/local/bin/gfortran-10

7,9c7,9

< PROJ4_DIR=/home/G10004/t-katou/JAGURS/local

< CC=icc

< CFLAGS=-g -traceback -I$(PROJ4_DIR)/include

---

> PROJ4_DIR=/usr/local

> CC=/usr/local/bin/gcc-10

> CFLAGS=-I$(PROJ4_DIR)/include

12c12

< BASE=-fpp -assume byterecl

---

> BASE=-cpp

18c18

< FFTW3_LIB=-mkl=sequential

---

> FFTW3_LIB=-lfftw3

23c23

< OPT=-O2 -openmp -openmp-report2 -I$(FFTW3_INCLUDE_DIR)

---

> OPT=-O2 -fopenmp

27c27

< NETCDF=/opt/atlocal/netcdf/4.1.3

---

> NETCDF=/usr/local

31c31

< LIBS=-i-dynamic -L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/atlocal/supplibs/lib -lhdf5_hl -lhdf5 -lcurl -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF4!

---

> LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lcurl -lsz -lproj $(FFTW3_LIB) # for NetCDF4!

47c47

< MPI=ON

---

> MPI=


あと,mapproject.c の修正が必要です.#include <proj_api.h> の前に #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H を追加します.

% rcsdiff -p mapproject.c

===================================================================

RCS file: mapproject.c,v

retrieving revision 1.1

diff -p -r1.1 mapproject.c

*** mapproject.c        2020/11/25 05:49:41     1.1

--- mapproject.c        2020/11/25 05:50:08

***************

*** 1,6 ****

--- 1,7 ----

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

+ #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H

  #include <proj_api.h>


  static  projPJ pj_tmerc, pj_latlong;

 

2020/01/15

M 6.4 - 8km S of Indios, Puerto Rico on 7 Jan. 2020

津波波形データベース構築の一例として,1月7日にプエルトリコで発生した地震による津波のデータ収集と計算をやってみた.

波源断層モデル
Moment Tensor (USGS)
(17.916, 293.187) 13.5 km,  Dip: 43 deg., Strike: 268 deg., Rake: -58 deg.

M0 - S 関係 (cite) から,
(L, W) = (20.0073963517812 km, 10.00369817589060 km)
slip amount: 0.500816743451796 m

DEM作成
GEBCO 2019から,当該領域の切り出し (grdcut) を行った.GEBCO_2019.nc は, grdmath を用いて正負を反転してある.
% grdmath GEBCO/GEBCO_2019/GEBCO_2019.nc NEG = GEBCO_2019.nc

% grdcut -R290/300/15/20 $bathymetry/GEBCO_2019.nc -Ggebco.grd


GEBCO 2019 から切り出した地形データでJAGURSを走らせると,北西の領域端にかかっている島のところで発散が生じた.そのため,周囲3分角(15秒角の12メッシュ)は,水深100 mよりも浅い海と陸地を水深 100 mで固定する修正を grdmask と grdmath で行った.下記は, GMT 6.0.0 (Homebrew on OS X)  を使用している( -I15s は, -I15c に相当).

% cat<<EOF | grdmask -A -Gmask.grd -I15s -Rgebco.grd -N100/100/NaN
290:3  15:3
290:3  19:57
299:57 19:57
299:57 15:3
EOF
% grdmath gebco.grd mask.grd LT mask.grd MUL 0 NAN gebco.grd AND = masked_gebco.grd=cf

(解説)
grdmask で,標準入力から縁取りの4点を入力して, -N 領域外/線上/内側 の値を指定する. -Rgebco.grd で元のDEMと範囲を合わせて,分解能も指定する(-I15s).さらに,大円ではなく直線で四角にするため -A オプションを付ける.
        -A Suppress connecting geographic points using great circle arcs, i.e., connect by straight lines,
           unless m or p is appended to first follow meridian then parallel, or vice versa.

験潮所
ITIC (International Tsunami Information Center) のアラートで 0.02 mの津波が観測されたようなので,UNESCO IOC Sea Level Station Monitoring Facilityevent からMagueyes Island PR staion のデータを "show data" から取得. 200〜2000秒のバンドパスフィルタをかけた.


(lat, lon) = (17.9701, -67.0464)  だったが,DEMに重ね合わせると,ずれていたので, (17.9636, 292.9536) に移動した.

JAGURS計算
設定した断層パラメータで, dt=1.0 s で計算した.

2020/01/09

JAGURS on Catalina with HPC Compiler for MacOS X


HPC Compiler for MacOS X を Catalina で使うには,ちょっと面倒なようです.

コマンドラインで gcc を利用すると,「開発元を検証できないため開けません。」というポップアップが表示されてしまいます.よくあるセキュリティ上の警告ですが,なにせ,実行ファイルを1つ1つ対処してあげなければいけないので,JAGURS を make するには,

/usr/local/bin/gcc
/usr/local/bin/gfortran
/usr/local/libexec/gcc/x86_64-apple-darwin19/9.2.0/cc1
/usr/local/libexec/gcc/x86_64-apple-darwin19/9.2.0/collect2

の4つが必要でした.さらに,実行時にダイナミックライブラリのリンクでも必要で, .dylib 毎に聞かれます・・・一気にYesにする方法もありますが,ちまちまやるとしたら,システム環境設定を開いておくと,一つ一つ聞かれました.Ctrl+open よりは楽です.



2019/12/25

GitHubのfork/cloneを本家に同期させる

昨今,ツールが便利になり過ぎて,それならこっちの方法の方が良いよぉ〜とか,お決まりの方法がなくて,ぽりすーで決まったりするところがあるから逆に初心者には面倒な世の中になったなと思いながら, GitHub をいじり始めたのでメモ.

ともかく,むかぁ〜し,fork した JAGURS が自分のところにありました.
https://github.com/naotaka-chikasada/jagurs

が,この作業を開始した時点で,2017年の古いまま.まずは,これを最新にしなきゃいけない.ということで,「GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する」を参考に,少し足りないところを補足して整理しました.

自分のforkしたJAGURSを取得(ユーザ名は要修正)
% git clone https://username@github.com/username/jagurs.git

upstreamという名前(←たぶん,何でも良い)で,本家を名指し(remote add).
% cd jagurs
% git remote add upstream https://github.com/jagurs-admin/jagurs.git
(この作業は,今後やらなくてよいはず)

本家を追従
% git fetch upstream

マージ
% git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.
% git merge upstream/master
Already up to date.

最後にサーバにアップロード
% git push origin

参考にさせていただいたブログでは,最後のサーバにアップロードが無いので,ウェブで見えるレポジトリが更新されませんでした.

2019/06/12

遠地の波形

Baba et al. (2016) で提案されているSD+EL+GPの計算はJAGURSで出来ますが,EL (Elastic Loading) を有効にするため,
with_elastic_loading=1
として,パッケージとして配布されている
m_pyfile='PREM_Ggz.nc'
を使うと,GPも含んでいるため,漏れなく gravitational potential change も付いてきます.マニュアルには書かれていませんが,パッケージに入っている PREM_Gz.nc を使うと,ELのみが適用されるようです(確認中).

海⽔密度効果は,独立に
with_density=1
を設定することで有効に出来ます.

If you specify
with_elastic_loading=1
option to apply elastic loading in your simulation using PREM_Ggz.nc file which is included in JAGURS package, the gravitational potential change is also adopted. Because PREM_Ggz.nc contains not only elastic loading but also gravitational potential change. If you omit GP, PREM_Gz.nc should be set as m_pyfile parameter. 

Error発生:
netcdf err=-51 in file=PREM_Ggz.nc
これは, https://www.unidata.ucar.edu/software/netcdf/docs/nc-error-codes.html によると,"Not a netcdf file".

どうやら,ライブラリ関係が古かったためだったよう.ただし,詳細は詰めていない.
動いてた環境(MacPorts):
  hdf5 @1.10.5_0+cxx+hl (active)
  netcdf @4.6.3_0+dap+netcdf4 (active)
  netcdf-fortran @4.4.5_5+gcc7 (active)

駄目だった環境(Source build @linux):
  hdf5-1.8.19
  netcdf-4.4.1.1
  netcdf-fortran-4.4.4

駄目だった環境(linux)で,hdf5-1.10.5, netcdf-c-4.6.3, netcdf-fortran-4.4.5 を使ったところ,問題なくELが計算できた.

If you have an error of "netcdf err=-51 in file=PREM_Ggz.nc", please update hdf5 and netcdf libraries. I'm not sure the real reason, but I succeeded to execute JAGURS with hdf5-1.10.5, netcdf-c-4.6.3 and netcdf-fortran-4.4.5 instead of hdf5-1.8.19, netcdf-4.4.1.1 and netcdf-fortran-4.4.4.

2019/05/24

JAGURSのNCDIO

スパコンじゃないにしても,大量に計算をする場合に出力ファイル数というのは意外と気をつけなければいけません.JAGURSでは,NCDIOオプションを付けてコンパイルすることで,初期⽔位,⽔位変動,最⼤波⾼,最⼩波⾼,到着時刻分布をドメイン毎に1つのファイルにまとめてくれる機能があります.

※ 利用しての気付きとして,計算をやり直す時などに既にSD01.ncファイルが存在しているときちんと計算結果が出力されないという制限があります.計算をやり直す前に出力ファイルを一旦消してから実行する必要があるようです.

Makefileに
OUTPUT=NCDIO
を指定するか,
make -e OUTPUT=NCDIO
などのようにコマンドライン引数で指定します.

まとまったファイルに何が入っているかは,NetCDFパッケージに含まれている以下のコマンドで確認することが出来ます.
ncdump -h SD01.nc

そして,例えば,最大波高(max_height)を抽出するには,GMTのgrdreformat が使えます.
grdreformat SD01.nc\?max_height SD01.zmax.grd

もちろん,QGIS等のGISソフトに対しては,SD01.nc をそのまま入力することが出来ます.

2018/11/09

JAGURSのNaN

JAGURSの計算結果には陸域(水が届かなかったメッシュ)のデータは含まれません.一方で,出力は2次元のメッシュデータなので何かの値が入っています.どうやら,それが -10000000000 のようです.これを無視してしまうと(というか,autoscaleで描画すると)以下のようになってしまいます.
これは,海に値が入っていないわけでも,陸が黒いわけでもなくて,データなしの -10000000000 が負に大きすぎて黒くなっているに過ぎません.なので,陸域の点を使って透明にしてあげて,色をつけてあげます.
右の2番めのアイコンを使うと,画像の点を指定して透明にする値を入力できます.
これをApplyすると,背景の地図が見えるようになります.
背景(地形図)が見えるようになりましたが,レンジが適切ではないので波が表示されないので,調整します.

これで見た目も良くなりました.

直交座標系での計算

JAGURSで直交座標系(CARTESIAN)で計算するには,Makefileで
    #CARTESIAN=ON
を有効にするために#のコメントアウトを外します.

従って,球座標(JAGURSのデフォルト)で作成したバイナリとは別になりますので時々で使い分ける場合はファイル名を変えるなり,ディレクトリを別にするなりしておく必要があります.

OpenTSUNAMI (杞憂プロジェクト)はぢめます.詳しくは後日.

2018/11/05

JAGURS on OSX (Brief summary in en)


I succeeded to compile and run JAGURS on Mac OSX in the following steps.

1. Install libraries via MacPorts

$ port install netcdf +dap +netcdf4
$ port install netcdf-fortran +gcc8
$ port install proj
$ port install fftw-3 +gfortran
$ port install szip

2. Install compiler from HPC Mac OS X compiler.

3. Download JAGURS from GitHub

4. Modify Makefile using CC=/usr/local/bin/gcc and FC=/usr/local/bin/gfortran. You should use -cpp option in gfortran command line to use preprocessor and -fopenmp option to use OpenMP directive. OR download Makefile.MacOSX.0500 and save as Makefile in src/ directory (diff patch).

日本語はこちら

2018/10/27

ガウス分布初期波源計算

JAGURSでは,Gaussian分布を海底地殻変動(初期水位)として計算することが出来ます.が,,,マニュアルには球座標使用の場合しか書かれていないので少し補足です.

tsun.par に
init_disp_gaussian =1
とすることで使えます.で,gaussianというファイル名でパラメータを用意します.が,単位に注意が必要です.

球座標の場合:
&gaussian h0=波高 lon_o=経度[度] lat_o=緯度[度] L=半値幅[km] /

直交座標の場合:
&gaussian h0=波高 lon_o=X座標 lat_o=Y座標 L=半値幅[座標系の単位] /

のように,m(メートル)が単位になっているUTM等を利用している場合,Lで指定する半値幅はmが単位になります.一方で,球座標の場合,座標は「度」単位,半値幅はkm単位で固定です.

なお,波高に負を指定することで凹んだ初期水位を表現することも可能です.実装は mod_init_disp_gaussian.f90 に入っていますので必要な関数に書き直しちゃうのも簡単かなと.

JAGURS V0407以前では,直交座標の場合には波高(h0)が指定できない(1 mに固定)ので注意が必要です.

2018/10/23

JAGURS on Mac 2


だいぶ時間も経ったし,JAGURSも新しくなったので手順の見直しも兼ねて再整理しておきます.以前の記事はこちら

基本的な環境は以前と同じ.



$ port install netcdf +dap +netcdf4
$ port install netcdf-fortran +gcc8
$ port install proj
$ port install fftw-3 +gfortran
$ port install szip

修正後Makefile
Makefileの差分

というわけで,v0501になっても,手順の変更はなしでした.

せっかくなのでバイナリも配ろうかと思いましたが,どうやらMac OSXではstatic linkが出来ないとのこと...諦めます(手順を教えて頂ける方がいらっしゃいましたらやります).これで出来る??? https://code.i-harness.com/ja/q/ce413

2017/12/20

JAGURS on Mac (High Sierra)


*** 最近のMacPorts はproj がバージョン5になって,ディレクトリ構造が変わったので Makefile も更新しています.最新の記事を参照して下さい. ***

JAGURSをMacで使う手順は,JAGURS on Mac でまとめましたが,手元がHigh Sierraになったので仕切り直し.

ライブラリ関係は,MacPorts で入れてます.
  • NetCDF
    • netcdf @4.4.1.1_1+dap+netcdf4 (active)
    • sudo port install netcdf +dap +netcdf4
  • netcdf-fortran @4.4.4_1+gcc7 (active)
    • sudo port install netcdf-fortran +gcc7
  • PROJ4
    • proj @4.9.3_0 (active)
    • sudo port install proj
  • FFTW3
    • fftw-3 @3.3.5_1+gfortran (active)

netcdf-fortran の variants を +gcc7 にしました.

HPC for Mac OS X は,High Sierra 版がないので,Sierra 対応な 7.1 を入れました.大事なことを書き忘れていた気がします.JAGURSは,V0407 です.Makefile前回の記事から変更していません.


2017/12/06

JAGURSのデータをQGISで表示する

JAGURSで扱うデータは,NetCDFのちょっと古いバージョンですが標準フォーマットなので,GMTだけではなくQGISでも表示できるはずです.ということで,やってみました.

まずは,JAGURS用に変換した標高データ(gebco2min.grd)です.レイヤーの追加で,座標参照システムとして,EPSG:4326(WGS84な緯度経度)を選択します.


それだけで,モノクロで表示されます.ただし,水深が正の値なので海が白くなってしまいます.


色を付けるには,プロパティ→スタイルで,レンダータイプを「単バンド疑似カラー」にします.色は,RdYIBuにしてみました.負の値が赤に割り当てられていますが,今は水深が正の値なので反転はさせないでおきます.


可視化結果が以下の通り.色は,,,これが良いと言うわけではないので(お薦めを見つけたら書き直します)自由に選んで下さい.


ここに,計算結果のSD01.zmax.grdをオーバーレイします.レイヤーの追加で同じくEPSG:4326を指定すれば読み込み完了です.このデータは正のデータだけとりあえず見たいので,0から1の間で白から赤にします.



これだと,既に読み込んである地形データが白で上塗りされてしまってもったいない状態です.プロパティ→透過性で,「画面から値を追加」で陸域を透過設定します.また,追加のデータなし値に0を追加して波が届かなかった場所を背景の地形にします.


結局,最大波高の色をYIOrRdにしています.

見やすいとは言い難いですが,以下のようになりました.

2017/11/29

JAGURSで遠地津波計算

津波の伝播計算を自分がやりたいようにやるには,結局一番大変なのは海底地形データを準備することのようです.一例として,遠地地震(チリ地震等)による津波を計算するため,グローバルな地形データを用意する手順をまとめておきます.

まずは,地形データを入手する必要があります.陸域であれば,SRTMやG-DEMが使えますが,海では,GEBCO (General Bathymetric Chart of the Ocean) を使うことが出来ます.ユーザ登録をする必要はありますが,フリーで使えます(詳細なライセンスはサイトを確認してください.以下でダウンロードした zip にも入っています).

ダウンロードすべきは,"GEBCO_2014 Grid (30 arc-second interval) の User-defined area or global grid | 2D netCDF" です.これにチェックをして,"Add data to basket" を押して,"View basket" に進んで待ちます.分かりやすいインタフェースとは言い難いですが,リクエストしたデータが用意できるまで少し待つ必要があります.データが準備出来たら,ダウンロードすると zip ファイルを取得できます.解凍すると GEBCO_2014_2D.nc が入っていて,これをJAGURSで使える形に変換します.

注意点は以下の通り

  • 極が入っていると計算できないので,必要な領域(太平洋を中心として日本とチリが含まれる範囲等)の切り出します.
  • この時,日付変更線(東経180度と西経180度)をまたぐので,東経で190度等のように東経で0度から360度までの連続的な座標に変換することも同時に必要です.
  • JAGURSは水深が正なので,標高データであるGEBCOのデータを正負反転(-1をかける)させます.
  • NetCDFの標準(?)である nf ではなく,JAGURSは cf を前提にで作られているので変換します.
    • cfとnfは,grdreformat のオプションで確認することが出来ました.cfは,GMT3の古いフォーマットのfloatで,nfがGMT4のデフォルトのフォーマットのようです.以下は grdreformatの出力の抜粋.
    | ID | DESCRIPTION - GMT 3 netCDF legacy formats               |
    | cf | GMT netCDF format (float) (deprecated)                  |
    ----------------------------------------------------------------
    | ID | DESCRIPTION - GMT 4 netCDF standard                     |
    | nf | GMT netCDF format (float)  (COARDS-compliant) [DEFAULT] |

いくつかやり方はあるはずですが,gmt4を使うなら,

   % grdcut GEBCO_2014_2D.nc -Gtmp.grd -R120/300/-60/60
   % grdsample tmp.grd -Gtmp2.grd -I2m
   % grdmath tmp2.grd NEG = gebco2min.grd=cf

という感じになります.grdcut で領域の切り出しをしています.東端を300とすることで東経の連続データとして変換します.grdsample でも-Rを指定できますが,120/300 のように指定をしても,意図したようには機能してくれませんでした.(必要に応じて,30秒グリッドのオリジナルデータを grdsample で解像度を変更しています.ここでは, -I2m で,2分角に変更しています.)最後に,正負を逆転(grdmathNEG)しつつ, =cf でフォーマットをcf に変換しています.
※ 領域を Baba et al. (2017) に合わせました.
出来上がった gebco.grd は,JAGRUS のgridfile.dat で指定する地形データとして利用することが出来ます.ちゃんと確認していませんが,どうやらディレクトリは正しく処理できないようなので(たぶん,delimiterの違い?),実行ディレクトリにシンボリックリンクを作成するのが妥当かと思います.

gmt4は,port install gmt4 でインストールしています.

   % makecpt -I -Cglobe -Z > gebco.cpt
   % pscoast -U -Rgebco2min.grd -JQ150/18 -V -Dc -W1 -B30g30/15g15 -K > gebco2min.ps
   % grdimage gebco.grd -J -Rgebco.grd -O -P -Cgebco.cpt >> gebco2min.ps
したのが以下の感じです(90度回転や切り出しは別途しています).

参考として,2分角メッシュでdt=5秒で24時間分の計算を,MacBook Airでやってみました.OMP_NUM_THREADS=2 で2並列にしています.参照→JAGURS on Mac

[Timer Output]
+-------------------------------+----------+------------+
|Timer region                   |Called    |Elapsed     |
|                               |          |Time[s]     |
+-------------------------------+----------+------------+
|All                            |         1|    5663.732|
|getpar                         |         1|       0.001|
|read_grid_info                 |         1|       0.000|
|read_bathymetry_gmt_grdhdr     |         1|       0.017|
|read_bathymetry_gmt_grd        |         1|       1.331|
|read_friction_gmt_grd          |         1|       0.167|
|initl_wfld                     |         1|       0.715|
|wet_or_dry                     |         1|       0.103|
|boundary_rwg                   |         1|       0.001|
|maxgrd_init_rwg                |         1|       0.148|
|maxgrd_v_init_rwg              |         1|       0.126|
|tgs_open_ct                    |         1|       0.000|
|hrise_rwg                      |        12|       0.394|
|drise_rwg                      |        12|       1.451|
|dump_gmt_nl_vel                |        97|       0.002|
|dump_gmt_nl_hgt                |        97|      55.068|
|tstep_grid_vel                 |     17281|    1265.025|
|- fxy_rwg                      |     17281|    1264.911|
|- mapgrids                     |     34562|       0.004|
|- outsea_rwg                   |     34562|       7.162|
|- recheck_wod                  |     34562|       0.003|
|maxgrd_v_check_nl              |     17281|    2804.151|
|tstep_grid_hgt                 |     17281|     657.405|
|- hxy_rwg                      |     17281|     650.099|
|maxgrd_check_nl                |     17281|     370.801|
|error_check                    |     17281|     271.747|
|maxgrd_write_gmt               |         1|       0.558|
|maxgrd_v_write_gmt             |         1|       0.528|
+-------------------------------+----------+------------+

MacProで4スレッド計算だと以下の感じです.
[Timer Output]
+-------------------------------+----------+------------+
|Timer region                   |Called    |Elapsed     |
|                               |          |Time[s]     |
+-------------------------------+----------+------------+
|All                            |         1|    3255.667|
(略)

2017/11/16

gdalでnetCDF

MacPorts の gdal は,netCDF 対応は variants になってるので作り直しました.これを機に,もろもろ variants をつけて対応フォーマットを増やしておきます.

port install gdal +expat +netcdf +geos +hdf4 +hdf5 +xerces

これで,海底地形データ(GEBCO)を読むことが出来るようになります.GEBCO は,Geral Bathmetry Chart of the Oceans の略で,最大30秒角(約1km)の海底地形のグリッドデータのことです.遠地の津波を計算する場合にはとりあえず用いられているようです.

持ってきたのは,Gridded bathmetry data の GEBCO_2014 Grid (30 arc-second interval) の2D netCDFです.不思議なことに,INT16 GeoTIFF (data) を持ってこようとチェックすると,
Selected image size 43200 pixels width by 21600 pixels height (Max size allowed 10800 pixels width by 10800 pixels height)
と怒られてしまいます.フォーマットでピクセル数は変わらないと思うのですが... 2D netCDF を持ってくれば良さそうです.

% gdalinfo GEBCO_2014_2D.nc
Driver: netCDF/Network Common Data Format
Files: GEBCO_2014_2D.nc
Size is 43200, 21600
.....

INT16で配布されている GEBCO_2014_2D.nc を JAGURS で使えるように cf (Float32な古いnetCDF形式)にします.

% grdreformat GEBCO_2014_2D.nc GEBCO_2014_2D_cf.nc=cf
(これでちゃんと使えるかの確認はこれから)
  → cfに変換するだけでは JAGURS では使えませんでした.その他にもやってあげる必要がありますので別途まとめました

(余談)秒角と距離の対応:
当然ですが,緯度が変わると経度方向の角度と実距離は変化するので固定ではありませんが,緯度方向は一定になっています.ざっくりですが,赤道(か,少しずれた範囲)を基準に考えて,大凡の実距離に換算できます.

  • 10分角 → 約20km(18km)
  • 5分角 → 約10km(9km)
  • 1分角 → 約2km(1.8km)
  • 30秒角 → 約1km
  • 10秒角 → 約300m
  • 1秒角 → 約30m
なので,世界の地形データでよく使われている SRTM30 の30は,30秒角を意味していて,大体1kmの空間解像度があると分かります.

2017/08/12

JAGURS on Mac


JAGURS(高性能津波計算コード)の作者の馬場さんから,Macで動いたなら手順を公開して欲しいという依頼がありましたので,まとめておきます.
(シリアル版かつ手抜きなので順次更新します)
(追記:シリアル版といいつつ,OpenMPは有効に出来るようでした.というわけで,MacOSな1台のマシンでやるにはOpenMPで十分.)

【試した環境】

【依存ライブラリ】
NetCDF,PROJ4,FFTW3が必要ということなので,MacPorts でお手軽に入れました.なので,インストール先は全て /opt/local になりますので,それに合わせてMakefileを修正して下さい.NetCDFはFortranから使えるようにするため,netcdf-fortranパッケージもインストールして下さい.かつ,FFTW3もFortranから使えるようにするため,gfortran variant などを付けておいて下さい.
(というのを考えるのが面倒なので,コンパイルする手順も別途作成します)
  • NetCDF
    •   netcdf @4.4.1.1_0+dap+netcdf4 (active)
      • sudo port install netcdf +dap +netcdf4
    •   netcdf-fortran @4.4.4_0+gcc6 (active)
      • sudo port install netcdf-fortran +gcc6
      • (High) Sierraは HPC compilerがgcc7なので +gcc7 かも
  • PROJ4
    • proj @4.9.3_0 (active)
      • sudo port install proj
  • FFTW3
    • fftw-3 @3.3.5_0+gfortran (active)
      • sudo port install fftw-3 +gfortran 2018.11.12加筆(書き漏れ)
あと,少なくとも私の環境では, -lsz (szip) が無いと言われたので,
  % port install szip
しました.

【コンパイル】
まずは,シリアル版.Makefile.SC_ICEをベースにするようにマニュアルに書いてあるけど,Makefileと同じ内容なので,Makefileでスタートする.

【罠】
フォートランのプログラムファイルが .f90 で提供されています.一方,gnu系(?)のコンパイラでは,.f90の場合,preprocessorが動いてくれません!

#ifdef MULTI
  1
Warning: Illegal preprocessor directive

とか言われます.これは, .F90 にすることで解決するそうです.まさか...
というわけで,ファイル名を .F90 にしてあげて(厳密には,preprocessorを使うソースだけで良いですが面倒なので全部),Makefileの %.o: %.f90 を  %.o: %.F90 にします.
(gfortran に -cpp オプションを渡してあげれば良いだけでした)

【Makefile修正箇所】

  • gfortran で .F90 なファイル(.f90と区別される)にpreprocessorを適用するには, -cpp オプションを指定する.
  • gfortran で OpenMP を使うには, -fopenmp オプションを指定する.

FC=/usr/local/bin/gfortran
PROJ4_DIR=/opt/local
CC=/usr/local/bin/gcc
CFLAGS=-g -I${PROJ4_DIR}/include
BASE=-cpp
FFTW3_INCLUDE_DIR=/opt/local/include
FFTW3_LIB=-lfftw3
OPT=-O2 -fopenmp
NETCDF=/opt/local
LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/local/lib -lhdf5_hl -lhdf5 -lcurl -lsz -lproj $(FFTW3_LIB)
# MPI=ON

修正済Makefileはここに置いておきます

*追加注(2017/10/04)
% make
/usr/local/bin/gcc -c -g -I/opt/local/include mapproject.c
FATAL:/opt/local/bin/../libexec/as/x86_64/as: I don't understand 'm' flag!
make: *** [mapproject.o] Error 1

HPC compilerの /usr/local/bin/gcc を使う場合,as が /opt/local/bin/ になってしまうと,この不具合に当たるようです.PATHの順番を /usr/bin の方が先になっている必要があります.