エラー記録と対処

"No module named clawutil"というエラー

make data の実行でこの python 上のエラーが発生.

その1

echo $PYTHONPATH

を実行した際に,$CLAW と同じパスが含まれているのを確認した上で,python 上で

In [1]: import clawpack
In [2]: from clawpack import clawutil

ができるか確認.2行目でエラーが出るはず.

ls -l $CLAW/clawpack/

で見ると,"/raid/xxx/" と環境依存のリンク元となっており,リンクとして機能していなかったことが原因.リンク元をlnで貼り直した.

初期設定では絶対パスのリンクになっており,$CLAW のパスが変わると毎回リンクを修正することになるので,相対パスにしておいたほうが良い.

cd $CLAW/clawpack
ln -fs ../amrclaw/src/python/amrclaw amrclaw 
ln -fs ../classic/src/python/classic classic 
ln -fs ../clawutil/src/python/clawutil clawutil 
ln -fs ../pyclaw/src/forestclaw forestclaw 
ln -fs ../geoclaw/src/python/geoclaw geoclaw 
ln -fs ../pyclaw/src/petclaw petclaw 
ln -fs ../pyclaw/src/pyclaw pyclaw
ln -fs ../riemann/src riemann 
ln -fs ../visclaw/src/python/visclaw visclaw

その2

上の設定ができていても 'No module named clawpack.clawutil.data' のようなエラーが出た.
python コマンドのデフォルトが python2 なのか python3 なのかを確認したら,2系だった.
ベースの Makefile である $CLAW/clawutil/src/Makefile.common の PYTHON を python3 に書き換えると安全.

PYTHON ?= python3
CLAW_PYTHON ?= $(PYTHON)

安易に /usr/bin/python のリンクを張り替えたり,rc ファイルで alias をつけると,他のパッケージとの依存関係でおかしくなる可能性があるのでやるなら慎重に.


同一のtopography(地形データ)ファイルを読めない

ある実行ファイル xgeoclaw が地形ファイルを読んでいる途中に別の実行ファイルが同じ地形ファイルを読もうとするとエラーになる.
$GEOLIB の topo_module.f90 の中の open 文が,status='unknown'で action は未指定になっているから.

open(xx,...,status='unknown',action='read')

にすれば解決する.

NetCDF, curl, OpenSSL の依存関係によるコンパイルエラー

NetCDF を有効にして geoclaw をコンパイルすると,下記のようなエラーが出てきて,実行ファイル xgeoclaw が生成できなかった.

/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_cleanup@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_perform@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_setopt@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_strerror@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_init@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_easy_getinfo@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_version_info@CURL_OPENSSL_3'
/usr/local/netcdf-4.6.1/lib/libnetcdf.so: undefined reference to `curl_global_init@CURL_OPENSSL_3'
/home/miyashita/AMR/clawpack/clawutil/src/Makefile.common:139: recipe for target 'xgeoclaw' failed

以前に curl を再インストールした記憶があり,その時の curl, openssl の環境が NetCDF をインストールした時と違うから…???
のような気がしたので,今の環境で NetCDF C を再インストールした.configure は下記の通り.

./configure --prefix=${NCDIR} --enable-netcdf-4 --enable-shared --enable-dap

オプションの最後, --enable-dap は

--enable-dap
      Enable DAP support. The configure script will attempt to locate the curl and xml2 libraries, 
      but if it fails, then it is necessary to specify their location using –with-xml2=/some/path and –with-curl=/some/path.
      It is assumed that the directories /some/path/include and /some/path/lib exist. 

と書いてあるので重要だと思う.
NetCDF を再インストールしたらエラーがなくなった.

Type mismatch

Clawpack v5.7.1 の examples をコンパイルするときに,gfortran が新しいバージョンであると,判定が厳しくなっていて型の不一致でエラーが出る.

Error: Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(4)/REAL(8)).

issue #191で言われているように,type mismatch を見過ごすように設定することでエラーにはならない.
example/storm-surge/ike/Makefile 内で以下のように FFLAGS を追加した.

# Environment variable FC should be set to fortran compiler, e.g. gfortran
FFLAGS += -fallow-argument-mismatch



セグフォ

お馴染みのセグフォが出た.

SIGSEGV: Segmentation fault - invalid memory reference.

セグフォの原因は多々考えられるので,以下はセグフォになる一例.
setrun.py を編集して再runしただけでこのエラーが出現した.差分を確認すると,fgmax の fg.minlevel_check が原因だった.

    fg = fgmax_tools.FGmaxGrid()
    fg.point_style = 2  # uniform rectangular x-y grid
    fg.dx = 1.0/60.0/4.0        # desired resolution of fgmax grid
    fg.x1 = 133.5
    fg.x2 = 134.5
    fg.y1 = 32.5
    fg.y2 = 33.5
    fg.min_level_check = 3 # which levels to monitor max on
    fg.arrival_tol = 1.0e-2
    fg.tstart_max = clawdata.t0  # just before wave arrives
    fg.tend_max = clawdata.tfinal    # when to stop monitoring max values
    fg.dt_check = 10.0     # how often to update max values
    fg.interp_method = 0   # 0 ==> pw const in cells, recommended
    rundata.fgmax_data.fgmax_grids.append(fg)  # written to fgmax_grids.data

fg.minlevel_check が 3 だと,おそらく波到達時にレベル3に達していないなどの理由でエラーになる.
fg.minlevel_check を 1 にするとエラーがでなくなった.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2023-06-29 (Thu) 09:09:53 (294d)