netcdfのインストール(C,C++,Fortran)

netcdfは、日本のスパコンには標準装備でインストールされているようだ。汎用的なデータ保存用フォーマットとして便利そうなので、手元の環境にインストールした。とりあえずconfigureのオプションだけまとめる。C版が基本になっており、C++Fortran版はC板のラッピングとなっている。Fortranのmake checkが中々通らず苦労した。


./configure --prefix=/hogehoge/netcdf-4.4.1.1 CC=icc LDFLAGS=-L/hogehoge/hdf5-1.8.18/lib CPPFLAGS="-I/hogehoge/hdf5-1.8.18/include -DNDEBUG -DpgiFortran" CXX=icpc FC=ifort --enable-netcdf-4


./configure --prefix=/hogehoge/netcdf-cxx4-4.3.0 CC=icc CXX=icpc LDFLAGS=-L/hogehoge/netcdf-4.4.1.1/lib CPPFLAGS=-I/hogehoge/netcdf-4.4.1.1/include


./configure --prefix=/hogehoge/libs/netcdf-fortran-4.4.4 CC=icc FC=ifort LDFLAGS="-L/hogehoge/libs/netcdf-4.4.1.1/lib -lnetcdf" CPPFLAGS="-I/hogehoge/libs/netcdf-4.4.1.1/include" --disable-fortran-type-check

何回かコンパイルに失敗し、ダメ元でフォルダを一度消して、tarファイルの解凍からやり直したらうまくいった。distcleanなどは行っていたのだが、何やらゴミが残っていたらしい。

Ubuntu16.04へのVTK7.1のインストール

言わずと知れた可視化ライブラリVTKであるが、その機能はフリーソフトparaviewにより簡単にGUIで使用することができる。物好きでもない限りわざわざVTKを触る必要もない…と思っていた。ただ、paraviewを使用した単純作業を最低でも数百回やることになったら話は別である。最初はparaviewのpythonスクリプトでのり切ろうかと思ったが、どうもいろいろ制約が生じて面倒な予感。保険のつもりでVTKの最新版をインストールした。

面倒なので、やった作業だけまとめておく。

libncurses-devのインストール(apt-getでよい)
cmakeの最新版のインストールソースコードから)
端末を再起動させ、cmakeとccmakeのバージョンが一致している(3.8.0以上)であることを確認する。
Qt5のインストール(optional)
vtkの最新版をソースからインストール(ccmakeによりインテルコンパイラを選択)
bashrcにVTK_DIRを記入

Intel Math Kernel Libraryでの大規模疎行列の直接解法<実践>

MKLは普通にLAPACKが使えるのだが、なぜか直接解法ソルバであるPARDISOがデフォルトで使用できる。LAPACKの普通のLU分解とは違い、PARDISOはマルチフロンタル法による高速化、グラフ理論に基づくfill inの削減(metisを使用している?)が行われている。数十万次元くらいの定常解析なら十分実用可能ではないかと期待している。

PARDISOは下記の公式ページにマニュアルがおいてある。サンプルコードを見ればサブルーチンpardisoの使い方がわかるはず。
PARDISO 5.0.0 Solver Project

サブルーチンの引数などは下記をみればだいたいわかるので、正直余裕すぎて書くことがない…と、思っていたが、なぜかプログラムが動かない。サンプルコードは動くが、それをモジュール化して自分のコードに組み込むとセグメンテーション違反が生じる。

仕方ないので調べたところ、/opt/intel/mkl/exampleにpardisoのサンプルコードが入っているらしい。
PARDISO 使用時のヒント | iSUS

確認したところ、公式のサンプルコードと内容が微妙に違う!頭を抱えつつMKLのサンプルを自分のコードにコピペして実行すると、正常に動作することを確認。理不尽。intel MKLのバージョンは2016だけど、PARDISOのバージョンは多少古いのかもしれない。

Intel Math Kernel Libraryでの大規模疎行列の直接解法<動機>

そこらの教科書による独学で力学分野における数値計算を学び、プログラム実装を行う場合、悲しいことに、連立方程式のソルバの検討に一番時間を食う。

たいていの場合、学習者のレベルが上がるにつれて、使用するソルバは

直接法(ガウスの消去法・LU分解)

定常反復法(ガウス・ザイデル法、SOR法)

非定常反復法(CG法ベース)

という流れになるのではないだろうか。日本語の教科書にはそのように書かれているし。計算対象が大規模になるにつれ、直接法より反復法、それもCGベースの非定常反復法が持て囃されていく。

しかしながら、CGベースの方法は対角成分は他より相対的に小さい場合には、まー収束しない。ひどい場合は発散する。この手の問題はだいたい何かの連成問題で頻繁に生じる(複数構造物の接触、流体構造連成、電気機械連成など)。ただでさえ複雑な定式化、実装を抱えて疲弊しているのに。


そんな理由から、数値計算として十分研究レベルになりうるレベルの計算を行う場合、普通の非定常反復法のさらにその先がほしくなる。その一番手っ取り早い方法がLU分解ベースの直接解法である。古くはスカイライン法やウェーブフロント法などがあるが、並列化効率のよいマルチフロンタル法が提案・実装されはじめ、欧米発のライブラリが結構世に出ている。Intel math kernel libraryに付属しているPardisoも大規模疎行列の直接解法ソルバーである。ここではその使用方法を備忘録としてまとめておきたい。ま、マニュアルが相当充実してるので、その必要もないかもしれないけど…。

FXgenのインストール(Ubuntu16.04 64bit)

理研のソフトウェアFXgenをUbuntuにインストールした。
とはいえ、すでに実行ファイルが配布されているので特に難しくはない。

2つほど動的ライブラリが見つからないと怒られたので、下記で対応した。

cd /usr/lib/x86_64-linux-gnu/
sudo ln -s ./libnotify.so.4 libnotify.so.1

sudo apt-get install libjpeg62

解析のメインコードは自分で書きたくなるのが人情だけど、この手の便利な前処理のソフトは積極的に人に頼っていきたい。

静的ライブラリのコンパイルエラーの一例

(自分の中では)大規模な数値解析用プログラムを作成しており、静的ライブラリを複数作ってコンパイルする必要にかられている。
下記のリンクの問題を知らず、数時間ずっと悩んでいた。リンクの順番にも依存関係あるのね。

静的ライブラリのリンク時にundefined referenceエラーが出る(gcc)

知識がいい加減すぎるので、ちゃんと下記を読んで学ぶ次第。

GNU Make 第3版

GNU Make 第3版

Rでよく使うfunctionまとめ

よく忘れるので、完全に自分のためのメモを作成する。

クリップボードからデータのコピー

x=read.delim("clipboard")

散布図のプロット

plot(x,xlim=c(),ylim=c(),col="black",pch=2)

ピアソンの相関係数の計算

cor.test(x$dataname,x$dataname2,method="p")

回帰直線の計算

lm1<-lm(dataname2~datanamae1,data=x)

直交多項式(二次)

lm1<-lm(dataname2~poly(datanamae1,degree=2),data=x)

回帰線の描画をしたい場合

predict.c<-predict(lm1)
plot(X,predict.c,type="l")

回帰直線の作画

abline(lm1,lwd=1,col="blue")

図の上書き

par(new=T)

dataの全要素をcontensについて昇順に入れ替え

data2<-data[order(data$contents),]