ADVENTUREのインストールで調べたLinuxコマンド

Linux素人なので、コマンドを調べながら作業している。次のエントリで調べながら使ったLinuxのコマンドをメモしておこうと思う。
科学計算ごっこ: ADVENTUREを試す その0-0 前段

1. find, grep, xargs, sed

似たような文字列の置換が多かったので、何かないかと調べてみた。今回は、findとgrepで置換したい文字列を探して表示して、確認→確認して置換したいものだけが引っかかったら、その文字列をfindとsedで置換。正直、長いコマンドの意味までちゃんと理解していない。
具体的なコマンドの例は、以下。
find . -type f -print | xargs grep 'iostream\.h'
find . -type f | xargs sed -i "s/iostream.h/iostream/g"
参考にしたサイトはたとえば、次のようなところ。

2. diff, patch

これは、現在も探り探り。ちゃんとパッチファイルができているかの検証がイマイチ。
とりあえず、元ソースのディレクトリと、変更済みのディレクトリを用意して、下記のコマンドでパッチファイルをとりあえず作成した。
diff -cN -r AdvTriPatch-1.8_bk AdvTriPatch-1.8_cl > AdvTriPatch.patch
参考にしたサイトは、以下。

ADVENTUREを試す その1-1 インストール作業1

ADVENTUREをインストールして行こう。インストールディレクトリは、″$HOME/usr/bin/ADVENTURE″とした。 ディレクトリを作成して、パスを通して、作業開始。

1. ADVENTURE_CAD

ダウンロードしたファイルを解凍後、そのディレクトリ内のREADMEを参考に、コンパイル。2回makeを実行するが、MakefileのOptimization flagsだけ、-Oから-O2に変更してみた。気になるところがないではないが、実行ファイルadvcadがすんなりできたので、上記ディレクトリにコピーして終了。

2. ADVENTURE_Tripatch

INSTALLファイルを参考に、下記を実行。
./configure --prefix=$HOME/usr/bin/ADVENTURE

Makefileの中を見て、c++をg++に変更。その後、makeすると、エラーが出る。少しずつソースを修正しながら、makeを続けていった。出てきたエラーは、たとえば、こんなん。
  • 致命的エラー: iostream.h: そのようなファイルやディレクトリはありません
  • エラー: ‘ostream’ does not name a type
  • エラー: ‘endl’ was not declared in this scope
  • エラー: ‘cout’ was not declared in this scope
  • エラー: ‘ios’ has not been declared
インクルード関連は、#include<iostream.h>を#include<iostream>などにすればコンパイルが通る様子。その他、#include<stream.h>とかを消したり、#include<string.h>は#include<cstring>に変更したり、なかなか細々した作業。
下半分は、頭にstd::をつければいいみたい。

動くかはさておき、これでひと通りのコンパイルは通る。
意外と時間がかかったので、インストール作業のメモは、一旦ここまで。パッチファイルにまとめておこう…

------------------ 進捗まとめ ------------------
全体更新日:2013/05/11
状態:準備段階。進捗10%。
エントリーまとめ:
ADVENTUREを試す その0-0 前段
ADVENTUREを試す その0-1 準備
ADVENTUREを試す その1-1 インストール作業1
ADVENTUREを試す その2 計算例
------------------ 進捗まとめ ------------------

ADVENTUREを試す その0-1 準備

準備したことを順番にメモしておこう。

1. Ubuntu 13.04のインストール

Ubuntu.comから64bit版をダウンロードしてきて、インストール。設定なんかは下記のサイトを参考にちょこちょこ。
Ubuntu 13.04をインストールした直後に行う設定 & インストールするソフト

その他、gfortranをインストール。
他には、zshを入れた。(参考にしたサイト:Zshの設定プロファイル(.zprofileと.zshrc) | Kitchen Garden Blog

2. ADVENTUREのダウンロード

ADVENTUREプロジェクトから必要なモジュールをダウンロード。ダウンロードしたのは下記のモジュール。
  • ADVENTURE_CAD
  • ADVENTURE_TriPatch
  • ADVENTURE_TetMesh
  • ADVENTURE_BCtool
  • ADVENTURE_IO
  • ADVENTURE_Metis
  • ADVENTURE_Solid
  • ADVENTURE_POSTtool
基本的には、ADVENTURE_BaseSourcePackに入っているが、ADVENTURE_Solidのver2.0を使用したい場合には、別途、申請書を提出する必要がある様子。
個人利用でも受け付けてくれました。

3. OpenMPIのインストール

次のサイトを参考に、入れてみようかと。
transitive.info - Ubuntu 13.04 で OpenMPI を使ってみる

MPICHにする必要があるかもしれないから、経過は、追々。

------------------ 進捗まとめ ------------------
全体更新日:2013/05/11
状態:準備段階。進捗10%。
エントリーまとめ:
ADVENTUREを試す その0-0 前段
ADVENTUREを試す その0-1 準備
ADVENTUREを試す その1-1 インストール作業1
ADVENTUREを試す その2 計算例
------------------ 進捗まとめ ------------------

ADVENTUREを試す その0-0 前段

ADVENTURE PROJECTなるものがある。

設計用大規模計算力学システム開発プロジェクトとして、並列計算に対応したFEMソフトウェアを開発しているようだ。オープンソースということで、これを試してみようかと。プロジェクト詳細は下記リンクより。

ADVENTURE PROJECTへ

並列計算するようなクラスターを個人で持っている訳でもないので、ひとまず、お家のノートパソコンに入れてみて、4コアくらいの並列計算ができれば満足しようと思う。MPICHに対応しているとのことだが、試みにopenMPIを使ってみたいと思っている。上手くいかなければ、方向転換をすればいい。やろうとしているのが同ノード内での並列計算だから、そもそもMPIは必要ないのかもしれない。
とくかく、やってみる。

前段として、Ubuntu 13.04をインストールした。これも含め、今後のエントリー予定をまとめると次のようになる。

ADVENTUREを試す その0-1 準備
ADVENTUREを試す その1 インストール
ADVENTUREを試す その2 計算例

インストールが上手くいかないと、エントリーが分割されていくだろう。また、エントリーを読み進めて行った最後の最後で「できませんでした」なんてオチを披露するのは、悪い気がするので、下記のまとめを、徐々に更新していこう。

------------------ 進捗まとめ ------------------
全体更新日:2013/05/11
状態:準備段階。進捗10%。
エントリーまとめ:
ADVENTUREを試す その0-0 前段
ADVENTUREを試す その0-1 準備
ADVENTUREを試す その1-1 インストール作業1
ADVENTUREを試す その2 計算例
------------------ 進捗まとめ ------------------

一切、更新されないままだったら、超恥ずかしいな。

matplotlibとBasemap その1

matplotlibにBasemapを合わせて使うと、地図上へのプロットができるようになる。
Basemapがけっこう好き。
PythonxyのホームページのAdditionalPluginsの中にも入ってるし、導入もちょろい。

Plotting data on a map (Example Gallery)にある例を参考に、簡単なお絵かきをしてみた。
# -*- coding: utf-8

# 簡単な地図上へのプロット
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

# フォントの指定(※それぞれの環境で異なる)
import matplotlib.font_manager as fm
prop_e = fm.FontProperties(fname='E:\\usr\\Python27\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\arial.ttf')
prop_j = fm.FontProperties(fname='E:\\usr\\Python27\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\ipag.ttf')

# 適当な場所の緯度と経度(東京駅と大阪駅)
tokyo_lat = 35.681394
tokyo_lon = 139.766060
osaka_lat = 34.701921
osaka_lon = 135.494985

fig = plt.figure(figsize=(8,8))
m = Basemap(projection='merc',llcrnrlat=32.0,urcrnrlat=40.1,\
            llcrnrlon=133.0,urcrnrlon=141.1, lat_ts=20,resolution='f')

m.drawcoastlines( linewidth=0.5, color='k' )
m.fillcontinents(color='#eeeeee',lake_color='#ddeeff')
m.drawstates( linewidth=0.5, color='k' )
m.drawcountries()
m.drawmapboundary(fill_color='#ddeeff')
# draw parallels and meridians.
# フォントの指定をしてない場合注意(fontproperties=prop_eを消す)
m.drawparallels(np.arange(32.0, 40.1, 2.0), labels = [1,0,0,0], fontsize=12, fontproperties=prop_e)
m.drawmeridians(np.arange(133.0, 141.1, 2.0), labels = [0,0,0,1], fontsize=12, fontproperties=prop_e)

# 東京駅
t_x, t_y = m( tokyo_lon, tokyo_lat)
m.plot( t_x, t_y, 'g*', ms = 10 )
# 大阪駅
o_x, o_y = m(osaka_lon, osaka_lat)
m.plot( o_x, o_y, 'bo', ms = 10 )
# 駅名を入れる。フォントの指定をしてない場合注意(fontproperties=prop_jを消す)
plt.text(o_x + 10000, o_y + 10000, u"大阪駅", fontproperties=prop_j)
plt.text(t_x + 10000, t_y + 10000, u"東京駅", fontproperties=prop_j)

if 1:
  plt.savefig('map.emf')
  plt.savefig('map.png')

if 1:
  plt.show()

結果はこんな感じ。

地図の下地を出す部分と、緯度・経度をXY座標に変換する部分を除けば、プロットの仕方は、matplotlibのまんま。
駅名の文字を出す位置をいじるのは、手探りで決めた→今後の課題か。
後、点をプロットする時は、本当なら、明示的に地図より上にプロットするように書いた方がいいのかもしれない。zorderか何か使う奴。
地図に色をつけて、矢印をプロットしたら、矢印が地図の下に隠れてしまった。

文字の正しい処理は今後の課題だけど、ひとまず、日本語も出た。

SciPyでFFT

一番よく使うのが、FFT。さらっと、コードを載せておく。
プロットは、模索中。
# -*- coding: utf-8

# FFT(SciPy)のテスト

import numpy as np
import scipy.fftpack as sf
import matplotlib.pyplot as plt

# 適当な信号(ランダム) 最大振幅は1.0
mu, sigma = 0, 0.1
dt = 0.01
val = np.random.normal(mu, sigma, 3000)
val /= max(abs(val))
time = np.arange(0, 30.0, dt)
# SciPyを用いてFFT
fourier_val = sf.fft(val) * dt
freq = sf.fftfreq(len(time), dt)

# 簡易プロット
fig = plt.figure(figsize=(9,6))
# 元波形
ax1 = plt.subplot(211)
plt.xlim(0.0, 30.0)
plt.ylim(-1.0, 1.0)
plt.xlabel("time(sec)")
plt.ylabel("random")
plt.plot(time, val, "-")
# フーリエスペクトル
ax2 = plt.subplot(212)
ax2.set_xscale("log")
ax2.set_yscale("log")
plt.xlim(1.0, 10.0)
plt.ylim(0.01, 1.0)
plt.xlabel("Frequency(Hz)")
plt.ylabel("amp")
n = len(freq)
plt.plot(freq[0:n/2], abs(fourier_val[0:n/2]), "-")

# 出力の方法
if 1:
  plt.savefig("fft_plot1.png")
  plt.savefig("fft_plot1.emf")

if 1: 
  plt.show()

出力される結果はこんなん。
単位は、例えば加速度(m/s2とかgal)の信号に対して、FFT後の単位が(m/sとかgal*s)とかになる感じ。
フーリエ変換後にどんな単位にしとくのがいいかは、よく分からない。

最後の出力の部分は、よくあるif文の使い方を真似てみた。
matlabとかでよく見る使い方。
昔は嫌いだったけど、今後使えるかもと、再評価してるとこ。

ランダム波形としては、本当はホワイトノイズを使いたかった。本来、こういうやり方をするべきなんだろう。 波形もスペクトルもきれいですもんね。 今回は簡単に、numpy.random.normalを参考にしました。

matplotlibでプロット その1

matplotlibの使い方から整理していく。

なぜか知らないけど、初めはsin波を書いてみることになっているようなので、例にならって、そのように。
# -*- coding: utf-8 -*-

# matplotlibでプロットその1

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2.0 * np.pi, 0.1)
y = np.sin(x)

plt.plot(x, y)
plt.savefig("plot1.png")
plt.savefig("plot1.emf")

一応、配列は、NumPyのarrayを基本で行く。実数倍とか、何かと助かる部分が多い。sinとかπも何も考えずNumPyのものを。


何もいじってないから、ちょっと寂しい。

ちなみに、今は、PNGとEMFの出力をしている。
PNGはブログに貼る用。EMFはWordに貼る用。EMFよりEPSが好きだけど、matplotlibで作成したEPSをWordに貼ると文字(数字とか凡例とか軸タイトルとか)が消える。今のところ、対処法なし→仕方なく。

代わってEMFは、快調。どのバージョンか忘れたけど、ちょっと前までは、EMFを出力するには、インストールした後にコードのバグを修正する必要があって、多少面倒だった。
現バージョンのPythonxyをインストールしてついてくるmatplotlibにはそんな問題もない様子。
文字が消える謎が解決されるまではEMFで行く予定。

後、今回は、SyntaxHighlighterを試す目的もあったんだけど、コードもそれなりに綺麗になっているので、成功か。

順調、順調。

はじめに

「はじめに」から始めるのが好きだ。
僕の資料は大体、「はじめに」から始まる。 

Pythonでちょっとした計算をすることが多くなった。便利過ぎる。 言っても、NumPyとかSciPyでFFTとかして、matplotlibとかmayaviでプロットする程度だけど。

C++の勉強をしながら極々基礎的な有限要素法のプログラムとかも書いている。 追々。 

最近は、PythonxyMingwを使っている。
Windowsでごちょごちょする時に、なんて便利なセットだろう。 

さて、そんなこんなで、ブログを作っては見たが、続くだろうか?