Smiling Life

Smiling Lifeのメンバーによる気象モデルWRFと周辺環境、自作パソコン、その他もろもろのお話です。ぜひ見てね!!

netcdf

より安全なnetCDFライブラリのインストール

unidata_logonetCDF形式は大気科学関係のデータでよく使用されますが,このデータをC言語やFortranで使用するためにはライブラリが必要です.以前はソースコードを落としてきて全て自分でコンパイルするのが標準的でしたが,いまはパッケージマネージャでインストール出来るようになりましたし,システム上の様々なアプリケーションがnetCDFを使用するようになったので,下手に自分で構築したライブラリにPATHを通しているとアプリケーション間でコンフリクトすることがあります.

そこで,できる限りパッケージマネージャでインストール出来る,つまり依存関係とコンフリクトを監視してもらえる状態でインストールしておき,コンパイラやマシンに依存するような部分だけを自前でコンパイルするのが安全なインストール方法ではないかと思います.全てGNUコンパイラで閉じるような場合には自前でコンパイルすることはない,ということになります.

具体的には,HDF5,netcdf for C までパッケージマネージャを使ってGNUでコンパイルされたライブラリをインストールします.そしてモジュールがコンパイラ依存になってしまうFortran向けライブラリだけ自分でコンパイルします.以下,その手順を記しておきます.

1. GNUコンパイル済みライブラリのインストール
HDF5とnetcdf, netcdf-fortranをインストールします.GNUコンパイラでFortranプログラムをコンパイルする場合のために,GNU版のnetcdf-fortranもインストールしておきます.
RedHat系の場合
># yum install hdf5-devel hdf5-static
># yum install netcdf-devel netcdf-static
># yum install netcdf-fortran-devel

SUSE系の場合
># zypper install hdf5 hdf5-devel hdf5-devel-static
># zypper install netcdf netcdf-devel netcdf-devel-static
># zypper install netcdf-fortran netcdf-fortran-devel netcdf-fortran-static

2. GNU以外のコンパイラでnetcdf-fortranをインストール
GNU版のHDF5とnetcdfを利用してnetcdf-fortranをintel compilerでコンパイルします.ここではintel compilerの例を記載します.基本的には他のコンパイラでも同じですので,コンパイラのオプションを読み替えてください.
まず,unidata netcdf download pageからnetcdf-fortranのソースをダウンロードし,適当な場所に展開しておきます.その後,下記のような環境変数とともにconfigureを実行します.この例では,インストール先が"/ap/intel/netcdf-fortran/4.4.4"ですがどこでも構いませんので適宜読み替えてください.

config-intel.sh
export CDFROOT="/usr"
export LD_LIBRARY_PATH="${CDFROOT}/lib64:${LD_LIBRARY_PATH}"
export LDFLAGS="-L${CDFROOT}/lib64 -I${CDFROOT}/include"
export OPTIM="-O3 -mcmodel=large -fPIC ${LDFLAGS}"
#
export CC=icc
export CXX=icpc
export FC=ifort
export F77=ifort
export F90=ifort
export CPP='icc -E -mcmodel=large'
export CXXCPP='icpc -E -mcmodel=large'
export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"
#
export CFLAGS=" ${OPTIM}"
export CXXFLAGS=" ${OPTIM}"
export FCFLAGS=" ${OPTIM}"
export F77FLAGS=" ${OPTIM}"
export F90FLAGS=" ${OPTIM}"
#
./configure --prefix=/ap/intel/netcdf-fortran/4.4.4 \
--enable-large-file-tests --with-pic

あとは,make, make installと進めればOKです.
インストールがちゃんと出来たようであれば最後にPATHを通しておきましょう.
export NETCDFF="/ap/intel/netcdf-fortran/4.4.4"
export PATH="${NETCDFF}/bin:${PATH}"
export LD_LIBRARY_PATH="${NETCDFF}/lib64:${LD_LIBRARY_PATH}"
export MANPATH="${NETCDFF}/man:${MANPATH}"

3. 問題対策
これでインストールすると,ライブラリは"~~/4.4.4/lib64"として,lib64ディレクトリの中に入ります.しかし,nf-configを実行するとnetcdf-fortranのLD_PATHが"~~/lib"と表記されます.インストール先とnf-configが合いませんので,nf-confgを用いてconfigureを行うアプリケーションをコンパイルするとnetcdf-fortranライブラリが正しくサーチされず,Linkingの時点でコンパイルに失敗してしまいます.そこで,Tentativeな対策ですが,lib64の中身をlibとしても静的リンクするかコピーしておきましょう.
># cp /ap/intel/netcdf-fortran/4.4.4/lib64 /ap/intel/netcdf-fortran/4.4.4/lib

以上で終了です.

WRF ARWpostで1ヶ月以上連続データが読めない?

f3b2187b.jpgWRFの後処理ソフト "ARWpost" を使ったいた時の問題です.最近あまりWRFを使っていなかったので私が取り残されている…ということも考えられますが…

[ 事象 ]
1つのwrfout_***.nc(netcdfフォーマットの出力データ)に,モデル内時間で1ヶ月を越える長さでデータ出力するとARWpostで変換するときに,1ヶ月を越えたデータの時刻を検索でヒット出来ずにARWpostが落ちる.しかし,ncdumpやncview等で見るとwrfoutファイルにデータはちゃんと入っており描画出来る.でも,ARWpostでは読めない.

[ 解決策 ]
wrf.exe実行時に同じwrfoutファイルの中に含まれるデータが1週間程度の単位になるように区切って出すように設定する.これでARWpostで正しく読んでGrADS形式に変換出来るようになった.namelist.inputの"time_control"の項目の"history_interval"を適宜変更すればよい.
この問題がARWpostのカレンダー機能に起因するのか,netcdfのAPIで指定するncid関連のレコードナンバーに起因するのかわからない.少なくとも1つのwrfoutファイルに40ステップを出力する設定ではARWpostでの変換に成功した.

米国ではARWpost + GrADSを使っている人は希で,ほとんどNCLを使っていて,なおかつ最近はPyNGLへ移行しているみたいだからバグフィックスの見込みは薄いかと思います.長らくARWpostは更新されてないもんね.

CentOS7をWorkstationとして使うための準備など

CentOS-7ここには,CentOS7を使って解析等を行うために必要な準備をメモしておきます.いくつか以前のバージョンと異なる操作が含まれていますのでご注意ください.

コンテンツ
 1. NTFSのマウント
 2. Google Chromeのインストール
 3. Intel コンパイラー & Intel MPIライブラリ
 4. HDF5 / netcdf のインストール
 5. ncview
 6. Ruby-Gphys
 7. GMT のインストール
 8. PAPIのインストール
 9. ホスト名の変更


1. NTFSのマウント
NTFSのインストールはこれまでと変わりません.下記のほかにもrpmforgeからfuse-ntfs-3gが使用できます.rpmforgeよりはepelの方が安定性重視かなっと思ってepelを優先してみました.
># yum install --enablerepo=epel ntfs-3g


2. Google Chromeのインストール
CentOS6.xではカーネルが古くChromeの最新版をインストール出来ませんでしたが,CentOS7になって最新版がインストール出来るようになりました.Chromeが復活です!私の環境で依存関係としてインストールしなければならなかったのは下記のものでした.Chrome自身のインストールで問題になった点はありませんでした.
># yum install libXScrnSaver

Google Chrome本体は,普通にfedora x86-64向けをダウンロードしてきて,root権限でインストールすればOKです.そのほかにOperaもトライしてみましたが正常にインストールできました.


3. Intel コンパイラー & Intel MPIライブラリ
Intel Compilerのインストールにおいて依存関係のあったコンポーネントは下記のものです.epelまでの範囲で全てインストールすることができます.

># yum install --enablerepo=epel pangox-compat
># yum install redhat-lsb.x86_64
># yum install libstdc++.so.6


また,SELinuxの無効化が必要です.これをしないとHYDRAでうまくMPIプロセスが起動しません.変更方法としてはこれまでと大きく変わりません.

># sestatus
SELinux status: enabled

># vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled


上記のように"enforcing"を"disabled"に変更します.その後,システムを再起動しましょう.設定変更の確認をして完了です!
># sestatus
SELinux status: disabled

インテルコンパイラーやMPI,Vtune, Inspectorのインストール自体に特に問題はありませんでした(もちろんunsupported OSとは出ますが…).


4. HDF5 / netcdf のインストール
Intel compilerを用いてHDF5,netcdfについては,これまでと大きく変わりなくコンパイル,インストールすることができました.

注意した点はnetcdfのインストール時にnetcdf4をenableにしてコンパイルするときに,configureの段階でszipのライブラリ名がlibszでなく,libszipとして宣言して検索してくるので-lszipがヒットせずconfigureに失敗していた点があります.普通にszipをインストールするとlibsz.***しか作成されないので,libszip.***としても静的リンクを貼って対処しました.


5. ncview
netcdfファイルのクイックルックに便利なncviewですが,epelリポジトリからyumで簡単にインストールすることができました.便利になったものですね〜.
># yum install --enablerepo=epel ncview


6. Ruby-Gphys
CentOS7ではRubyが2.0.0系ですが,Gphysをインストールするためのrpmを構築することに成功し,手元のサーバでリポジトリを公開していますので,私を誰だか知っている方は必要がありましたらご連絡ください.


7. GMT のインストール
ここではGMT5.1.1のインストールを行ってみました.
インストールに必要な依存関係は,cmake,fftw3、fftw3-devel、zlib、zlib-devel でした.全てepelまでのリポジトリからyumでインストールできます.以下,GMT本体のインストール方法をメモしておきます.

まず下記のサーバ(もしくはミラー)から必要なファイルをダウンロードします.
http://gmt.soest.hawaii.edu/projects/gmt/wiki/Download
 gmt-5.1.1-src.tar.gz
 gshhg-gmt-2.3.2.tar.gz
 dcw-gmt-1.1.1.tar.gz
上記3つをダウンロードします.

gshhg-gmt-2.3.2.tar.gzとdcw-gmt-1.1.1.tar.gzは展開して出来たディレクトリをGMTをインストールするつもりのディレクトリ(たとえば,"/usr/local/gmt/5.1.1"など)へmoveしておきます.

次にgmt-5.1.1-src.tar.gzを展開して出来たディレクトリに移動します.
>$ cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmake
>$ vi cmake/ConfigUser.cmake

として,このファイルを編集してgshhgやdcwの在処,GMTをインストールするprefix等を設定します.
あとは下記のコマンドを順々に実行すればインストールすることができるはずです.

>$ mkdir build
>$ mv build
>$ cmake .. (".."を忘れないでください)
>$ make
>$ make check
># make install


詳しくは下記のサイトの"Building GMT from source"の項目を参照してください.
http://gmt.soest.hawaii.edu/projects/gmt/wiki/BuildingGMT


8. PAPIのインストール
Xeon E5-2620 (Sandybridge)の環境下で,PAPI 5.3.2のコンパイルに成功しています.ただし,デフォルト環境ではCycleカウンタには120%を超える誤差がありました.より正確な測定とインストールのチェックを行うには,CPU Frequencyを固定して実行することをおすすめします.

インストール時の注意点は,PAPIをコンパイルするときにMPIのPATHを切っておくことです.そうでないと,mpi関係のファイルを自動的にコンパイルしようとして謎のエラーを出しました.この方法でインストールすると,MPI向けにチューニングされたライブラリを使用できなくなりますが,公式releaseのファイルを直接実行して意味不明なエラーを吐くぐらいのものなら,今はやめておいた方が無難だろうと思います.

その他のインストール方法はこれまでと変わりません.詳しくは下記を参照してください.
http://blog.livedoor.jp/rootan2007/archives/51814755.html


9. ホスト名の変更
ホスト名の変更方法は,CentOS6.xから大きく変更されています.下記のコマンドによってホスト名等の設定を変更します.ここでは設定したいホスト名を"hoge.moge.jp",マシンの説明を"my-main-machine"として説明します.

まず下記のコマンドで現在の状況を確認します.
># hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-desktop
Chassis: desktop
Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-123.6.3.el7.x86_64
Architecture: x86_64


次のコマンドでホスト名とマシンの説明を設定します.
># hostnamectl set-hostname hoge.moge.jp
># hostnamectl set-icon-name my-main-machine


設定を確認して終了です.
># hostnamectl
Static hostname: hoge.moge.jp
Icon name: my-main-machine
Chassis: desktop
Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-123.6.3.el7.x86_64
Architecture: x86_64

ncview 2.1.1 in Vine Linux 6.1

vine6Vine Linuxのバージョンが上がって、インストールされているnetcdfとhdf5のバージョンも上がってきたので、前にメモした時よりも新しいncviewがRPMでインストール出来るようになりました!
ncviewはnetcdfファイルを簡単に描画出来るクイックビューソフトです。
というわけで、インストール方法をメモしておきます。
以前、Vineにインストールしていたncviewは1.9xxでしたが、今回は2.1.1です。


まずは、必要なrpmファイルをダウンロードです。
RPM search ( http://rpm.pbone.net/ )
からダウンロードします。
このサイトのsearchのところに"udunits"とか"ncview"って入力して検索かけてください。

いろんなLinux distribution向けのrpmファイルがヒットしてきますが…
 udunits2 --> fedora 15 (x86-64)
 ncview --> fedora 16 (x86-64)

に対応したものを選択します。
で、結果としてそれぞれ下記をダウンロードすることになると思われます。
 udunits2-2.1.19-2.fc15.x86_64.rpm
 ncview-2.1.1-1.fc16.x86_64.rpm



次にrpmを入れる前に下準備です。
次のものをapt-getでインストールしてください。
 netcdf-devel
 hdf5-devel



最後に…1). udunits、2). ncview の順番でrpmコマンドにてインストールしましょう。
rpmコマンドは、
 ># rpm -ivh udunits2-2.1.19-2.fc15.x86_64.rpm
としてインストールするんでしたね。

ちなみに、
 ># rpm -ivh --test xxxxx.rpm
とすると、事前にちゃんとインストールできるかどうか確認できますよ。

WRF インストール with netcdf-4.x.x

f3b2187b.jpgWRF環境を構築する際に、最近のnetcdfを使うとライブラリのリンクに失敗して、うまくコンパイルできないことがあります。これはnetcdf-4.x.x以降、fortran用のnetcdfライブラリファイルが、libnetcdff.aとしてlibnetcdf.aから分離されたことが原因です。WRF本体はこの変更に対応していますが、WPSやARWpostでは対応不足、もしくは未対応となっています。この問題を解決するには下記のようにMakefileを編集します。

#WRF本体のコンパイルについて追記しました(2012/12/02)
#WRF本体は下記の変更を加えなくても正常に動作しますが、コンパイラによってはコンパイルに失敗します。



確認した環境は…
 Intel Xeon E5 / RHEL系 6.x x86-64
 Intel composer XE 2012 & intel MPI
 jasper-1.900.1 (compiled by icc/icpc/ifort)
 netcdf-4.1.3 (compiled by icc/icpc/ifort)
 WRFV3.4.1
 WPSV3.4.1
 ARWpost 3.1


下記のように"-lnetcdff"を書き加えます。

WRFV3/external/io_netcdf/makefile:
(7行目)
LIBS = -L$(NETCDFPATH)/lib -lnetcdf
 ↓ ↓ ↓
LIBS = -L$(NETCDFPATH)/lib -lnetcdff -lnetcdf


WPS/util/src/Makefile:
(43行目)
-L$(NETCDF)/lib -I$(NETCDF)/include -lnetcdf
 ↓ ↓ ↓
-L$(NETCDF)/lib -I$(NETCDF)/include -lnetcdff -lnetcdf


ARWpost/src/Makefile:
(19行目)
-L$(NETCDF)/lib -I$(NETCDF)/include -lnetcdf
 ↓ ↓ ↓
-L$(NETCDF)/lib -I$(NETCDF)/include -lnetcdff -lnetcdf

この変更を施したあと、通常通りに…
./configure
./compile
と進んでゆけばOKです。

ある computer に netcdf をインストール

kcomputer-system-boardある computerにnetcdfをインストールするときのconfigureをメモしておきます。結構たくさんのプログラムがnetcdfを必要としますが、あるコンピュータにはライブラリとして用意されていませんので自力で入れないといけないですね〜。ただし、ここにあげた方法が完全に正しいという保証はいたしません…ご容赦ください。


それで肝心の方法ですが、下記のようなスクリプトを作ってconfigureを行なってください。これだけで、あとは make と make install を行えばOKです。クロスコンパイルしているので、当然 make check はできません。


#!/bin/sh
export NCBYTE_T="integer(selected_int_kind(2))"
export NCSHORT_T="integer*2"
export NF_INT1_T="integer(selected_int_kind(2))"
export NF_INT2_T="integer*2"
export NF_INT1_IS_C_SHORT=1
export NF_INT2_IS_C_SHORT=1
export NF_INT_IS_C_INT=1
export NF_REAL_IS_C_FLOAT=1
export NF_DOUBLEPRECISION_IS_C_DOUBLE=1
#
export CC=fccpx
export CXX=FCCpx
export FC=frtpx
export F77=frtpx
#
export CFLAGS="-Xg -O3 -KPIC"
export FFLAGS="-X9 -O3 -KPIC"
export F77FLAGS="-X7 -O3 -KPIC"
#
export CPP='fccpx -E'
export CXXCPP='FCCpx -E'
export CPPFLAGS="-DNDEBUG -DNAGf90Fortran"
#
./configure --prefix=/home/${GROUP}/${USER}/netcdf-4.1.3 \
--host=sparc64v-sparc-linux-gnu \
--enable-shared --disable-dap --disable-netcdf-4 \
--disable-fortran-compiler-check --disable-fortran-type-check



もし、netcdf-4を作成したければ、まず下記のURLを参考にHDF5をインストールします。
http://todo.issp.u-tokyo.ac.jp/ja/members/wistaria/log/1wqum2
そのあと、次のようなスクリプトでconfigureすればOKのはずです。


#!/bin/sh
export NCBYTE_T="integer(selected_int_kind(2))"
export NCSHORT_T="integer*2"
export NF_INT1_T="integer(selected_int_kind(2))"
export NF_INT2_T="integer*2"
export NF_INT1_IS_C_SHORT=1
export NF_INT2_IS_C_SHORT=1
export NF_INT_IS_C_INT=1
export NF_REAL_IS_C_FLOAT=1
export NF_DOUBLEPRECISION_IS_C_DOUBLE=1
#
export CC=fccpx
export CXX=FCCpx
export FC=frtpx
export F77=frtpx
#
export CFLAGS="-Xg -O3 -KPIC"
export FFLAGS="-X9 -O3 -KPIC"
export F77FLAGS="-X7 -O3 -KPIC"
#
export CPP='fccpx -E'
export CXXCPP='FCCpx -E'
export CPPFLAGS='-DNDEBUG -DNAGf90Fortran -I/home/${GROUP}/${USER}/build/hdf5-1.8.8/include'
#
export LDFLAGS='-L/home/${GROUP}/${USER}/build/hdf5-1.8.8/lib'
export LIBS='-lhdf5 -lsz'
#
./configure --prefix=/home/${GROUP}/${USER}/netcdf-4.1.3 \
--host=sparc64v-sparc-linux-gnu \
--enable-shared --disable-dap \
--disable-fortran-compiler-check --disable-fortran-type-check



京子ちゃんとの付き合いは何かと苦労が絶えないものですが、
いっちょがんばっていきまっしょい!

HDF5 - netCDF4.1.3 Full specのインストール

unidata_logo先日、netcdf-4.2.1.1のコンパイル方法をメモしたけど、いろんなところで使うときに不具合発生…
ってことで、やっぱり安定版は4.1.3かなぁ〜〜?そこで今回はHDF5使用のnetcdf-4.1.3のフルバージョンをインストールする方法をメモしておきます。
これ1個で全部に対応可能になります!説明は簡素にいきます!

使用した環境は…
 Xeon-E5 / CentOS6.3 / Intel composer XE 2013
です。


0. 環境準備
># yum groupinstall "Development Tools" "Development Libraries"
(OSインストール時にやってればスキップです)


1. zlibのインストール
一般にインストール済みですが、高速化を目指してIntel composerを使って自力でコンパイルします。
ダウンロードサイト: http://www.zlib.net/
ソース: zlib-1.2.7.tar.gz

--

>$ export CC=icc
>$ export CFLAGS="-O3 -xAVX -fma -fPIC"

>$ ./configure --prefix=/usr/local/zlib-1.2.7

>$ make
>$ make check
># make install



2. jpeglibのインストール
ダウンロードサイト: http://www.ijg.org/
ソース: jpegsrc.v8c.tar.gz

--

>$ export CC=icc
>$ export CXX=icpc
>$ export FC=ifort
>$ export CFLAGS='-O3 -xAVX -fma -fPIC'
>$ export CXXFLAGS='-O3 -xAVX -fma -fPIC'
>$ export FFLAGS='-O3 -xAVX -fma -fPIC'

>$ ./configure --prefix=/usr/local/jpeg-8c

>$ make
>$ make check
># make install



3. Szipのインストール
ダウンロードサイト: http://www.hdfgroup.org/doc_resource/SZIP/
ソース: szip-2.1.tar.gz


>$ export CC=icc
>$ export CXX=icpc
>$ export FC=ifort
>$ export CFLAGS='-O3 -xAVX -fma -fPIC'
>$ export CXXFLAGS='-O3 -xAVX -fma -fPIC'
>$ export FFLAGS='-O3 -xAVX -fma -fPIC'

>$ ./configure --prefix=/usr/local/szip-2.1

>$ make


makeのときに…
警告: conversion to ‘size_t’ from ‘long int’ may change the sign of the result
といったメッセージが多量に出ますが目をつぶってスルーします…

>$ make check
ここで"All test passed."と出ればOK!そして最後に…

># make install


4. HDF5のインストール
ダウンロードサイト: http://www.hdfgroup.org/ftp/HDF5/current/src/
ソース: hdf5-1.8.9.tar.gz


>$ export CC=icc
>$ export CXX=icpc
>$ export F77=ifort
>$ export F90=ifort
>$ export FC=ifort
>$ export CFLAGS='-O3 -xAVX -fma -fPIC'
>$ export CXXFLAGS='-O3 -xAVX -fma -fPIC'
>$ export FCFLAGS='-O3 -xAVX -fma -fPIC'

>$ ./configure --prefix=/usr/local/hdf5-1.8.9 \
--enable-fortran --enable-fortran2003 --enable-cxx \
--with-szlib=/usr/local/szip-2.1 \
--with-zlib=/usr/local/zlib-1.2.7/include,/usr/local/zlib-1.2.7/lib \
--enable-static-exec --enable-production --enable-hl

>$ make
>$ make check
># make install


ここでPATHを通したくなりますが、GUI環境も使用している場合はPATHを通さないでください。GNOME関連のアプリがconfliction起こして立ち上がらなくなります。Run level=3のサーバにインストールしている場合はPATHを通しても構いません。

5. netcdf 4のインストール
ダウンロードサイト: http://www.unidata.ucar.edu/downloads/netcdf/index.jsp
ソース: netcdf-4.1.3.tar.gz


C言語用とFortran・C++言語用は分けてインストールしますので、2回コンパイルすることになります。
1回目:Fortran・C++言語用

>$ export CC=icc
>$ export CXX=icpc
>$ export FC=ifort
>$ export F77=ifort
>$ export F90=ifort

>$ export CFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export CXXFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export FCFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export F77FLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export F90FLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"

>$ export CPP='icc -E -mcmodel=large'
>$ export CXXCPP='icpc -E -mcmodel=large'
>$ export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"

>$ ./configure --prefix=/usr/local/netcdf-4.1.3 \
--enable-shared --disable-netcdf-4 --disable-dap

>$ make
>$ make check
># make install



2回目:C言語用
次に2回目のコンパイルを行いますが、make cleanは行いません。そのままで…

>$ export HDFROOT="/usr/local/hdf5-1.8.9"
>$ export LD_LIBRARY_PATH="${HDFROOT}/lib:${LD_LIBRARY_PATH}"
>$ export LDFLAGS="-L${HDFROOT}/lib -I${HDFROOT}/include"

>$ export CC=icc
>$ export CXX=icpc
>$ export FC=ifort
>$ export F77=ifort
>$ export F90=ifort

>$ export CFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export CXXFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export FCFLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export F77FLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"
>$ export F90FLAGS="-O3 -xAVX -fma -mcmodel=large -fPIC"

>$ export CPP='icc -E -mcmodel=large'
>$ export CXXCPP='icpc -E -mcmodel=large'
>$ export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"

>$ ./configure --prefix=/usr/local/netcdf-4.1.3 \
--with-hdf5=/usr/local//hdf5-1.8.9 \
--with-zlib=/usr/local/zlib-1.2.7 \
--with-szlib=/usr/local/szip-2.1 \
--enable-shared --enable-netcdf-4 --enable-dap \
--disable-fortran --disable-cxx

>$ make
>$ make check
># make install


*make checkのときに"nc_test4 -- tst_file6"がfailになってしまいますが、目をつぶっておきます。どうしても気になる場合は、~/nc_test4/tst_file6.c をnetcdf-4.2.1.1の中の同じファイルと交換してmake checkをやり直してみてください。
これですべてのテストを通過することができます。

最後にPATHを通しておきます。

>$ vi .bashrc
export NETCDF="/usr/local/netcdf-4.1.3/"
export NCHOME="${NETCDF}"
export NETCDFHOME="${NETCDF}"
export NETCDFROOT="${NETCDF}"
export PATH="${NETCDF}/bin:${PATH}"
export LD_LIBRARY_PATH="${NETCDF}/lib:${LD_LIBRARY_PATH}"
export MANPATH="${NETCDF}/man:${MANPATH}"



以上で、openDAP, zlib圧縮, HDF5-hl 対応のnetcdf-4が完成です!

netcdf 4.2 with fortran インストール方法

unidata_logonetcdfのバージョンが4.2に上がり、これに伴いコンパイル方法が変更されました。
大きな変更点はC++とFortran向けのライブラリが別パッケージになったことです。
環境はXeon-E5、Intel Compiler、CentOS6.3です。GNUコンパイラーの場合はOptimizationを適宜変更してください。
*C++版はconfigureに失敗していまして、まだ解決していませんので、とりあえずC版とFortran版についてインストール方法をメモしておきます。

1.ダウンロード
http://www.unidata.ucar.edu/downloads/netcdf/index.jsp
からソースコードをダウンロードします。

C版:netcdf-4.2.1.1.tar.gz
Fortran版:netcdf-fortran-4.2.tar.gz

上記が今現在の最新版です。


2.C版のコンパイル
netcdf-4.2.1.1.tar.gzを/tmpなど適当なディレクトリに展開し、該当ディレクトリに移動して、下記のスクリプトを作成してください。

>$ vi netcdf4.2_config.sh

export HDFROOT="/usr/local/hdf5-1.8.9"
export LD_LIBRARY_PATH="${HDFROOT}/lib:${LD_LIBRARY_PATH}"
export LDFLAGS="-L${HDFROOT}/lib -I${HDFROOT}/include"
export OPTIM="-O3 -xAVX -fma -mcmodel=large"
#
export CC=icc
export CXX=icpc
export FC=ifort
export F77=ifort
export F90=ifort
#
export CFLAGS=" ${OPTIM}"
export CXXFLAGS=" ${OPTIM}"
export FCFLAGS=" ${OPTIM}"
export F77FLAGS=" ${OPTIM}"
export F90FLAGS=" ${OPTIM}"
#
export CPP='icc -E -mcmodel=large'
export CXXCPP='icpc -E -mcmodel=large'
export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"
#
./configure --prefix=/usr/local/netcdf-4.2.1.1 \
--disable-shared --enable-netcdf-4 --enable-dap


ここではHDF5がインストールされていることを仮定しています。
インストールされていない場合は、configureのラインの"--enable-netcdf-4"を"--disable-netcdf-4"と変更してください。スクリプト作成後は実行権限を与えて、実行しconfigureします。

>$ chmod +x netcdf4.2_config.sh
>$ ./netcdf4.2_config.sh


configureがうまく通りましたら、make、make check、そしてroot権限でmake installして終了です。configureがうまく通らない場合は"--enable-dap"を"--disable-dap"に変更したり、PATHを見なおしてください。

>$ make
>$ make check


># make install

最後にPATHを通しておきます。
>$ vi .bashrc
export NETCDF="/usr/local/netcdf-4.2.1.1/"
export NCHOME="${NETCDF}"
export NETCDFHOME="${NETCDF}"
export PATH="${NETCDF}/bin:${PATH}"
export LD_LIBRARY_PATH="${NETCDF}/lib:${LD_LIBRARY_PATH}"
export MANPATH="${NETCDF}/man:${MANPATH}"



3.Fortran版のコンパイル
Fortran版はC版のWrapperですから、C版のコンパイルが成功しPATHを通したあとでコンパイルしてください。先ほどと同様に、netcdf-fortran-4.2.tar.gzを/tmpなど適当なディレクトリに展開し、移動します。そして、下記のスクリプトを作成してください。

>$ vi netcdf4.2-fortran_config.sh

export LDFLAGS="-lnetcdf -L/usr/local/netcdf-4.2.1.1/lib -I/usr/local/netcdf-4.2.1.1/include"
export OPTIM="-O3 -xAVX -fma -mcmodel=large"
#
export CC=icc
export CXX=icpc
export FC=ifort
export F77=ifort
export F90=ifort
#
export CFLAGS=" ${OPTIM} ${LDFLAGS}"
export CXXFLAGS=" ${OPTIM}"
export FCFLAGS=" ${OPTIM}"
export F77FLAGS=" ${OPTIM}"
export F90FLAGS=" ${OPTIM}"
#
export CPP='icc -E -mcmodel=large'
export CXXCPP='icpc -E -mcmodel=large'
export CPPFLAGS="-DNDEBUG -DpgiFortran ${LDFLAGS}"
#
./configure --prefix=/usr/local/netcdf-fortran-4.2 \
--disable-shared


今回は、LDFLAGSがCFLAGSにもかかっていることに注意してください。
このようにしないとmake checkでコケてしまいます。
実行権限を与えて、実行し、makeへ進んでください。
>$ chmod +x netcdf4.2_config.sh
>$ ./netcdf4.2_config.sh
>$ make
>$ make check

># make install



インストールできましたらPATHを通しておきます。
>$ vi .bashrc
export NETCDF_F_VER="/usr/local/netcdf-fortran-4.2/"
export NETCDF_F=${NETCDF_F_VER}
export LD_LIBRARY_PATH="${NETCDF_F}/lib:${LD_LIBRARY_PATH}"



4.リンクを貼っておく
PATHを通していればOKなはずですが、一応4.1.xの頃と同じ/libコンテンツを作るためにnetcdf-fortranからリンクを貼っておきます。

># cd /usr/local/netcdf-4.2.1.1/lib/
># ln -s /usr/local/intel/netcdf-fortran-4.2/lib/libnetcdff.* ./
># ls

libnetcdf.a libnetcdf.la libnetcdff.a libnetcdff.la pkgconfig

以上ですべての作業が完了です。

x86 Open64 における netcdf と mpich2 のコンパイル

open64本日は x86 Open64 Compiler Suite を用いて netcdf と mpich2 をコンパイルする時の設定について情報をあげておきます。今回の情報は少し試行錯誤した結果ですので、ほかに最適な方法があるかもしれません。もし何かご存じでしたらご教授願います。


● netcdf-4.1.1 のコンパイル

------------------------------------------------------------------
http://www.unidata.ucar.edu/downloads/netcdf/index.jsp
よりソースコードをダウンロードし、/tmpなど適当な場所に展開してディレクトリ移動をしておきます。

次の設定でconfigureを行います。
(コマンド中の"\"は実際には無い改行を表す)
 export CC=opencc
 export CFLAGS='-O3'
 export CXX='openCC -O3'
 export FC=openf90
 export F90=openf90
 export F95=openf95
 export F77=openf90
 export FFLAGS='-O3'

 >$ ./configure --prefix=/usr/local/netcdf-4.1.1-open64 \
 --disable-netcdf-4 --disable-dap


このあとは通常通りでOKです。
 >$ make
 >$ make check
 ># make install


インストールが終わったら下のように.bashrcに記述し、PATHを通して、"ncdump"など適当なコマンドを実行してみて動作することを確認すれば作業完了です。
 export NETCDF="/usr/local/netcdf-4.1.1-open64"
 export NCHOME="${NETCDF}"
 export NETCDFHOME="${NETCDF}"
 export PATH="${NETCDF}/bin:${PATH}"
 export LD_LIBRARY_PATH="${NETCDF}/lib:${LD_LIBRARY_PATH}"
 export MANPATH="${NETCDF}/man:${MANPATH}"



● mpich2-1.3.2p1 のコンパイル
------------------------------------------------------------------
http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.php?s=downloads
よりソースコードをダウンロードし、/tmpなど適当な場所に展開してディレクトリ移動をしておきます。

次の設定でconfigureを行います。
(コマンド中の"\"は実際には無い改行を表す)
 export CC=opencc
 export CXX=openCC
 export FC=openf90
 export F77=openf90
 export CFLAGS=-O3
 export FCFLAGS=-O3
 export FFLAGS=-O3

 ./configure --enable-fast=O3 --enable-fc --with-pm=mpd \
 --with-device=ch3:nemesis --prefix=/usr/local/mpich2-1.3.2p1-open64


このあとは次のコマンドでコンパイルをします。makeが終わったらm.txtにエラーが無いかどうかチェックしてください。
 >$ make |& tee m.txt
 ># make install


インストールが終わったら下のように.bashrcに記述し、PATHを通して、"mpif90 -V"とコマンドを実行してみてバージョンを確認し、ちゃんとOpen64によるMPICH2として動作することを確認すれば作業完了です。
 export MPIROOT="/usr/local/mpich2-1.3.2p1-open64"
 export PATH="${MPIROOT}/bin:${PATH}"
 export MPIBIN="${MPIROOT}/bin:${MPIBIN}"
 export MANPATH="${MPIROOT}/share/man:${MANPATH}"
 export LD_LIBRARY_PATH="${MPIROOT}/lib:${LD_LIBRARY_PATH}"

netcdf-4.1.1に起因するWRFコンパイルのエラー

netcdf1_sm今回はWRFのnetcdf関連のエラー報告です。WRFのコンパイル時に、この記事の最後に添付したようなメッセージを吐いてコンパイルに失敗するというエラーに遭遇しました。本文はかなり複雑で長いため、はじめに概要を述べておきます。

--------------------------------------------------------------------------------------
問題:netcdf-4.x.xをCentOS系列のOSでコンパイルしたものを用いて
 WRFをコンパイルすると失敗する。
対策:CentOSの場合にはnetcdf-3.6.3を用いるようにする。
 もしくはconfigureのときに"--disable-dap"をつけてコンパイルする。
--------------------------------------------------------------------------------------

それでは以下に詳細を報告します。
まず私がエラーが見た環境は…
 WRFV3.2.1、PGIコンパイラ version10.9、netcdf-4.1.1
 CentOS5.4 x86-64、Opteron (Istanbul、Shanghai)

です。またWeb上にあった同様のエラーに遭遇した事例では…
 WRFV3.2、PGIコンパイラ version10.5、netcdf-4.1.1
 Rocks cluster 5.3 for the OS、Opteron (アーキテクチャ不明)

(Rocks clusterはクラスターマシンを簡単にエンドユーザが構築するために作られたLinux Distributionです。MPIやGrid Engineを含めたパッケージを提供しており、OSの本体はCentOS5を使用しているようです。)

詳細はわかりませんが、WRF User's Forumにも以下のようなエントリがあり、同様のエラーであることがわかります。http://forum.wrfforum.com/viewtopic.php?f=20&t=2411

また、WRFのコンパイルまで確かめていませんが・・・
 CentOS5.5 x86-64、intel compiler version 11.x、netcdf-4.1.1、Xeon (Nehalem)
でも同様のバグが起きそうです(netcdfのコンパイル時にDAPがコンパイルされていました)。

一方、上記の環境においてnetcdf-3.6.3を使用すればWRFのコンパイルには成功しています。また、netcdf-4.1.1を使ってWRFのコンパイルに成功した例としては次のものがあります。
 WRFV3.2.1、PGIコンパイラ version10.9、netcdf-4.1.1、
 openSUSE11.3、Opteron (Magny-Cours、Istanbul)


以上から問題を起こす環境はCPU(x86互換ならマシンのアーキテクチャ)によらず、CentOS系のLinux上で動作しており、intel compiler か PGI compilerを使用、かつnetcdf-4.x.xを使用した場合であることがわかります。

----------------------------------------------------------------------------------

では、WRFコンパイル時のエラーの原因を考えます。実はこの問題に対しては特に解決策が書いてあるページは見あたりませんでしたが、1つだけヒントらしき書き込みがありました。
http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-install/Configure.html
このページによると…
 可能性1つめ:"libcurl"系のライブラリをPATHに加えていないか?
 可能性2つめ:netcdfをコンパイルする際に"curl"を含めていないか?


どういうことかといいますと、記事の最後に添付したようなメッセージはOPeNDAP系のライブラリ;"curl"の動作を表すものなのです。このエラーはWRFをコンパイルする時にロードされるライブラリの中に"curl"が含まれていると起きるようです。
(OPeNDAPはnetcdfやHDF5といったフォーマットを対象にネットワークベースでデータアクセスを行うためのライブラリです。そのうちのnetcdf向けのアプリケーションが"curl"というものだそうです。)

「可能性1つめ」を確かめるためLD_LIBRARY_PATHやそこに含まれるライブラリ体系を調べました。すると、"/usr/lib"の中に次のcurl関係のライブラリが入っていました。
 libcurl.a,  libcurl.so
 libcurl.so.3,  libcurl.so.3.0.0

ところが、WRFコンパイルに成功しているopenSUSEにも"/usr/lib"の中に以下が入っていました。
 libcurl.so.4
 libcurl.so.4.2.0

違いは"libcurl.a""libcurl.so"CentOSにだけ入っている点です。でもWRFコンパイルの問題はこれらが呼び出された時に起きているわけではなく、netcdf関係のライブラリが呼び出されたときに起きています。やはりOSのlibcurlではなく、libnetcdf.a自体の問題だと考えるのが妥当でしょう。


「可能性2つめ」とは、具体的にはnetcdf-4.x.xをコンパイルする時、configureの段階で"--with-curl-config"の引数をつけることで、"curl"を含めたnetcdfライブラリを構築されることです。詳しくは次のWebページを参照してください。
http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-install/Configure.html

つまり"curl"は"--with-curl-config"をつけないと有効にならないはずです。少なくとも私の場合はそんなものつけてnetcdfのコンパイルを行っていません。ちなみに、このときのconfigure設定は以下のものです。う〜ん、何かおかしい…そう、ここにnetcdf-4系列の大きな落とし穴があったのです。
 ./configure --prefix=/usr/local/netcdf-4.1.1 --disable-netcdf-4
(環境はOpteronとXeonで、コンパイラはgcc + pgfortran、もしくはicc + ifortです)

netcdfディレクトリにあるINSTALLをよくよく見てみると、
 `--enable-dap'
 Enable DAP support. This flag is set by default if the configure
 script can locate a usable instance of the curl-config program.

というものがあります。このフラグはDAPを有効にするフラグですが、有効な"curl"がPATHに見つかった場合には「デフォルト」で有効になると書いてあります。

確かに今回のCentOS環境でnetcdf4をコンパイルすると確かにコンパイル・プロセスの"make check"のときに怪しき影が見あたります。
 *** Testing DAP to netCDF-3 translation
 Base URL:
 Client Parameters: [cache][netcdf3]
 Caching: on
 Note: The remote tests may be slow or even fail if the server is overloaded
 *** Testing: test.01
 *** URL: [cache][netcdf3]http://test.opendap.org:8080/dods/dts/test.01
 make[3]: *** [check-TESTS] Interrupt
 make[2]: *** [check-am] Interrupt
 make[1]: *** [check-recursive] Interrupt
 make: *** [check-recursive] Interrupt


ここに"DAP"や"opendap"という単語が見あたります。ところが、同じようにコンパイルを実行してもopenSUSEではDAP関連のライブラリ構築が行われません。つまり、CentOSにだけ含まれている、"libcurl.a"と"libcurl.so"がnetcdfのconfigureに検知されてDAP機能が自動的にenableになっているといえるでしょう。

----------------------------------------------------------------------------------

さて、原因がわかってしまえば対策方法は簡単です。

●対策1:netcdfのconfigureをするときに"--disable-dap"のフラグをつけてconfigureして
からmakeする。これでDAP機能をつけずにnetcdf4をコンパイルすることができます。

●対策2:netcdf-4.1.1でなくnetcdf-3.6.3を使用する。

●対策3:CentOSではなくopenSUSEを使う。

上記すべての方法でWRFのコンパイルに成功していますが、もっとも確実に問題を防げるのは、やはりnetcdf-3.6.3でしょうか?しかし、大きなデータのサポートや様々なBug Fixを考えると最新版を使用したいものです。なかなか悩ましいですね。最後にPGIコンパイラでnetcdf-4.1.1のコンパイルに成功したconfigの設定を書いておきます。

 export CC=gcc
 export CXX=g++
 export CPPFLAGS='-DNDEBUG -DpgiFortran'
 export FC=pgfortran
 export FFLAGS='-O2 -w -V -Msignextend'
 ./configure --prefix=/usr/local/netcdf-4.1.1 --disable-netcdf-4 --disable-dap



以下、WRFコンパイル時のエラーメッセージ
----------------------------------------------------------------------------------
・・・・・・・・・・・ < 略 > ・・・・・・・・・・・・・

make[2]: Entering directory `/home/cluster/wrf/WRFV3/external/io_netcdf'
x=`echo "pgf90 -w -Mfree -byteswapio" | awk '{print $1}'` ; export x ; \
if [ $x = "gfortran" ] ; then \
echo removing external declaration of iargc for gfortran ; \
/lib/cpp -C -P -C -P -traditional -I/usr/local/netcdf-4.1.1-pgi/include -I../ioapi_share diffwrf.F90 | sed '/integer *, *external.*iargc/d' > diffwrf.f ;\
else \
/lib/cpp -C -P -C -P -traditional -I/usr/local/netcdf-4.1.1-pgi/include -I../ioapi_share diffwrf.F90 > diffwrf.f ; \
fi
pgf90 -w -Mfree -byteswapio -c -I/usr/local/netcdf-4.1.1-pgi/include -I../ioapi_share diffwrf.f
diffwrf io_netcdf is being built now.
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-ocinternal.o): In function `ocopen':
ocinternal.c:(.text+0x8dd): undefined reference to `curl_version_info'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-http.o): In function `ocfetchhttpcode':
http.c:(.text+0x11): undefined reference to `curl_easy_getinfo'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-http.o): In function `ocsetcurlproperties':
http.c:(.text+0xcb): undefined reference to `curl_easy_strerror'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-http.o): In function `ocfetchlastmodified':
http.c:(.text+0x18e): undefined reference to `curl_easy_setopt'
http.c:(.text+0x19f): undefined reference to `curl_easy_strerror'
http.c:(.text+0x1d3): undefined reference to `curl_easy_setopt'

・・・・・・・・・・・ < 同様のため中略 > ・・・・・・・・・・・・・

/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-http.o): In function `occurlclose':
http.c:(.text+0x386): undefined reference to `curl_easy_cleanup'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-curlfunctions.o): In function `set_verify':
curlfunctions.c:(.text+0x2e): undefined reference to `curl_easy_setopt'
curlfunctions.c:(.text+0x4b): undefined reference to `curl_easy_setopt'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-curlfunctions.o): In function `set_cookies':
curlfunctions.c:(.text+0x6f): undefined reference to `curl_easy_setopt'
curlfunctions.c:(.text+0x8e): undefined reference to `curl_easy_setopt'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-curlfunctions.o): In function `set_proxy':
curlfunctions.c:(.text+0xbb): undefined reference to `curl_easy_setopt'
/usr/local/netcdf-4.1.1-pgi/lib/libnetcdf.a(liboc_la-curlfunctions.o):curlfunctions.c:(.text+0xdf): more undefined references to `curl_easy_setopt' follow
make[2]: [diffwrf] Error 2 (ignored)
make[2]: Leaving directory `/home/cluster/yoshida/wrf/WRFV3/external/io_netcdf'

・・・・・・・・・・・ < 以下略 > ・・・・・・・・・・・・・
訪問者数
  • 今日:
  • 昨日:
  • 累計:

Recent Comments
記事検索
  • ライブドアブログ