BiomassGasificationFoam【インストール(Docker環境)】

インターネットを探していたら、BiomassGasificationFoamなるものがあるとのことでインストールしようと思ったのですが、、、

https://iopscience.iop.org/article/10.1088/1742-6596/530/1/012015/pdf

注意しよう!!

論文中のリンクをたどって開こうとするとなぜかリンクが飛ばない、、、と思っていたら、ウイルスバスターさんが危険なサイトとしてブロックしていました。urlをgoogle検索してみてみると、ドイツの怪しげな夜のお店につながっていた模様(なぜだ、、、)

本家のサイト

ventures.euhit.org

ここが新しい本家のページのようです。ただし、後述のようにReserch gateの作者のページにあるファイルが最新のようです。

環境構築

適当な自分の環境でインストールを進めると、

porousReactingZone.H:269:34: error: 'const class Foam::coordinateSystem' has no member named 'axis'
                 return coordSys_.axis();

とエラーが出ます。下でも同じような話が出ています。

Error on biomassGasificationFoam_installPack_1.0 -- CFD Online Discussion Forums

そのため、

  • OpenFOAMのバージョンに注意; (できれば)本家のOpenFoam 2.1.1.にそろえる。

  • ソースコードは作者のresearch gateから引っ張る

にての対応の方針です。Reserch gateの作者ページはこちら

(PDF) Biomass gasification solver based on OpenFOAM - library: biomassGasificationFoam_installPack_1.0.tar

OpenFOAMのインストール(Docker)

バージョン違いのOpenFOAMを入れるため、環境を汚さないようにDockerを使ってインストールします。Docker hubを探すと2.1.1の開発バージョンのものがありましたので、ありがたく使います。なお、これより後バージョン(v2.4とかv4)ではbiomassGasificationFoamがうまくコンパイルできませんでした。

https://hub.docker.com/r/konradmalik/openfoam211

dockerのpullコマンドはコレ。

$ docker pull konradmalik/openfoam211

pullした後は、docker イメージを一応わかりやすくコピー(別名保存)しておきます。今回は、biomass-gasification-foamという名前にしました(変更可)。

$  docker tag openfoamのイメージID biomass-gasification-foam

コンテナを作成します。rootで入ります。通常ユーザでログインすると、よくpermission負けします。

$ docker run -it --user root biomass-gasification-foam /bin/bash

CUI環境に入りますが、一旦exitしたら次回以降はstartで開始します。毎回runで開始すると延々とコンテナを増やすことになってしまいます(初心者らしいミス)。

$ docker start -i コンテナのID

BiomassGasificationFoamのダウンロード

wgetを使って、作者reserch gateページからダウンロードしてきます。

$ wget https://www.researchgate.net/profile/Kamil-Kwiatkowski/publication/258998426_Biomass_gasification_solver_based_on_OpenFOAM_-_library_biomassGasificationFoam_installPack_10tar/data/0c9605299f53bc6c4d000000/biomassGasificationFoam-installPack-10tar.gz

拡張子が変なことになっているので、変更して解凍します。

$ mv biomassGasificationFoam-installPack-10tar.gz biomassGasificationFoam-installPack-10.tar.gz 
$ tar -zxvf biomassGasificationFoam-installPack-10.tar.gz 

なお、dockerコンテナによってはデフォルトでtarとかが入っていなかったりするので、ホスト側からのコピーでもよいです(今回のdocker imageではwgetもtarも入ってました)。

$ docker cp biomassGasificationFoam_installPack_1.0/ コンテナのID:/home/openfoam/

BiomassGasificationFoamのインストール

biomassGasificationFoam_installPack_1.0フォルダ中のREADMEを見ながら進めます。まずは、(一応)必要なライブラリをインストールしておきます。やらなくてもよさそうです。

$ apt-get update
$ apt-get install build-essential flex bison cmake zlib1g-dev qt4-dev-tools libqt4-dev gnuplot libreadline-dev libncurses-dev libxt-dev

biomassGasificationFoam_installPack_1.0フォルダ中に移動し、環境変数を設定します。そのままインストール実行します。

$ cd biomassGasificationFoam_installPack_1.0
$ source biomassGasificationMediaDirectories 
$ ./install

無事インストールができたらコマンドがたたけるハズなので、helpでインストールを確認してみます。

$ biomassGasificationFoam --help

チュートリアル

TGAディレクトリに移動して、

$ biomassGasificationFoam 

で実行してみますが、以下エラーが出てきます。

--> FOAM FATAL IO ERROR: 
Unknown ddt scheme CrankNicholson

/system/fvSchemesのフォルダを修正します。CrankNic"h"olsonのタイポのようですので、修正します。

ddtSchemes
{
    default         CrankNicolson 0.7;
}

満を持して実行。出力は保存しておいた方がよい+結構時間がかかります。

$  biomassGasificationFoam > log &

参考にしました。

BiomassGasificationFoam compiling issue -- CFD Online Discussion Forums

Docker: コンテナにrootログイン - Qiita

Dockerイメージの名前を変更する - Qiita

Dockerでホストとコンテナ間でのファイルコピー - Qiita

[Docker] 起動するとファイルが消えてしまうときに確認してみること | script life 千夜一夜 プログラミング別館

PENGUINITIS - 離散化スキームの設定

Docker【FrontISTRを動かす】

OSSのFEMソフトウェアFrontISTRのDocker利用を通じて、Dockerについての理解を深める回です。

Docker imageをインストールする

以下のFrontISTR公式サイトのダウンロードページに行くと、各バージョンごとのFrontISTRが用意されています。

https://www.frontistr.com/download/

Dockerのボタンを押すと、以下コマンドをコピーしてくれとの表示がされるので、コマンドをコピーします。

docker pull registry.gitlab.com/frontistr-commons/frontistr/fistr1:master

:以下はタグと呼ばれるもののようで、ダウンロードするfrontistrのバージョンで違います。

わき道)Docker imageの格納場所

一般的に、docker imageはdocker hubに保管されています。

hub.docker.com

FrontISTRのdocker imageはGitLab Container Registryにて管理されているようです。

プライベートDockerレジストリとしてのGitLab Container Registry - Qiita

置き場はここのようです。

docker · master · FrontISTR-Commons / FrontISTR · GitLab

ということでdocker imageをpull

$ docker pull registry.gitlab.com/frontistr-commons/frontistr/fistr1:master

Dockerコンテナの起動

コマンドを打ち込んでfrontistrコンテナ環境に移行します。

$ docker run -it registry.gitlab.com/frontistr-commons/frontistr/fistr1:master
# which fistr1

コマンドで実行ファイルの保存先を確認できます(/usr/bin/fistr1にあった。)。

# gfortran -v

でgfortranをインストールしていることを確認します。なお、ファイルを読もうとするとviコマンド(lessも)が無く、困ったなぁってなりましたが、一旦保留(使わないし)。docker環境では、同様の状態の場合も多いようです。

Docker コマンド

$ docker run -it --sig-proxy=false --rm -u $UID -v $PWD:$PWD -w $PWD registry.gitlab.com/frontistr-commons/frontistr/fistr1:master fistr1 -t 1

dockerコンテナを使って、frontistrの実行プログラムを直接するときは、上記コマンドで実行可です。コマンドオプションは以下。(研究会資料をカンニングしています。)

  • ワークディレクトリをホストと同一パスにして(-w)
  • カレントディレクトリをマウントして(-v)
  • UIDを指定し同じものを使う(-u)
  • コンテナへの変更を保存しない(--rm)
  • インタラクティブ(-i)で端末を割り当て(-t)
  • Ctrl+Cなどでコンテナごと落とす(--sig-proxy=false) 

以上、とりあえず深まりました。

参考)FrontISTRのDocker対応

第57回FrontISTR研究会の資料に簡単に記載あり(会員のみ閲覧可)

参考にしました

www.ricos.co.jp

astherier.com

Docker【ことはじめ】

Docker Hello-world

$ docker run hello-world

のコマンドの実行で、hello-worldのimageのダウンロード+コンテナの展開がおこなわれるようです。

$ docker ps

を実行しても特に何も見れないですが、hello-worldは実行後に停止させているからのよう。

$ docker images

を実行すると、hello-worldイメージをダウンロードしていることがわかります。

$ docker ps -a

で停止中のコンテナも見れます。IDも確認です。

$ docker rm ID番号

でコンテナ削除できます。

$ docker rm $(docker ps -q -a)

を打ち込むと、休止中のコンテナをすべて削除できます。

$ docker rmi hello-world

でhello-world imageを削除

Docker Ubuntu

qiita.com

$ docker pull ubuntu

ubuntu imageをインストール。以下コマンドで

$ docker run -it 

ubuntu環境にログインします(すごいなぁ、、、)。-itとはなんだ?

docker run -it の「-it」とはなにか - Qiita

# exit

で環境から抜けれます(コンテナも停止)。コンテナを稼働させながら環境を抜ける(デタッチ)には

ctrl-P+Q

コマンドですが、vscodeを使用していると、ショートカットで負けます。ショートカット負けしないようにするには、ショートカット書き換えしかなさそう?

Dockerのコンテナから抜ける in VSCode - Qiita

エラー

imageをpullしようとしたらなんかうまくいかんかったですが、dockerデスクトップを再起動したらうまくいきました。

Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on xxxx: read udp yyyy:40196->xxxx: i/o timeout

qiita.com

参考にしました。

Docker入門 ~Hello World~ - Qiita

最短で使うDocker入門~Dockerを体験しよう (1/3):CodeZine(コードジン)

コマンドでDockerコンテナを停止・削除、イメージの削除をする - Qiita

Docker【インストール】

WSL2をインストールしたので、Dockerのインストールにトライします。

www.docker.com

ページからインストーラをダウンロード・実行。"Enable WSL 2 Windows Features"にチェックを入れるのを忘れない。

qiita.com

$ docker ps

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

docker Desktopから、WSL2の選択が必要です。Settings→Resources→WSL INTEGRATIONから設定します。

kawadev.net

設定したら、もう一度コマンドを入れます。

$ docker ps

うまく出力されればOK。

PCの再起動後

PCを再立ち上げしたりすると、以下コマンドが出力されたりします。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

docker desktopから見ると、wsl integrationの設定のチェックが外されたりしていたので、再設定。設定を保存する方法とかは確認中、、、

チュートリアル

$ docker run hello-world

dockerが入っていれば、hello-worldイメージが自動的にダウンロードされて実行することができます。

FrontISTRでdocker

チュートリアル代わりに、OSSのFEMソフトウェアFrontISTRでdockerをやってみます。 www.ricos.co.jp

まずは、frontISTR自体をgit cloneして、docker imageを続いてpullします。

$ git clone https://github.com/FrontISTR/FrontISTR.git
$ docker pull registry.gitlab.com/frontistr-commons/frontistr/fistr1:master

実行ディレクトリに移動して、dockerコマンドでFrontISTRを実行します。

$ docker run -it --sig-proxy=false --rm -u $UID -v $PWD:$PWD -w $PWD registry.gitlab.com/frontistr-commons/frontistr/fistr1:master fistr1 -t 1

詳細の理解はおいおいやっていこう

参考にしました

さわって理解するDocker入門 第1回 | オブジェクトの広場

シリアル通信(RS-232C)とは?

実験装置からの出力データがRS-232Cだったので、勉強ベースで情報のまとめ。

シリアル通信とは?

RS-232はシリアル通信の規格とのこと。

シリアル通信の基礎知識 - シリアル通信とは?RS-232C / RS-422 / RS-485の違いはなんだろう? - | コンテック

RS-232 - Wikipedia

windows10に接続する

Windows 10 シリアルへの接続とCOMポート割り当ての変更方法 by ボクにもわかる地上デジタル

シリアル通信を受信する

TeraTermを使ってPICとPC間でシリアル通信をする方法 | 東京海洋大学 田原研究室

pythonでシリアル通信

【Python入門】pySerialでシリアル通信を実行する方法を解説 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

Pythonとハードウェア ー PythonでRS232Cを利用する - - Qiita

実験系でもPythonで効率化したい(2)RS232CとpySerial - Qiita

pytonでfft・ローパスフィルタ

試験結果のデノイズのためにフーリエ解析に基づくローパスフィルタをかけます。 まずは、周波数解析。fftpackを使います。fsには周波数を入れます。

import scipy.fftpack as spfft

X = spfft.fft(data)
amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in X]
freq = spfft.fftfreq( len(amplitudeSpectrum) , d=1.0/fs)

import matplotlib.pyplot as plt
plt.plot(freq,amp)

aidiary.hatenablog.com

ローパスフィルタをかけます。パラメータは

  • fp:通過域端周波数[Hz]
  • fs:阻止域端周波数[Hz]
  • gpass:通過域端最大損失[dB]
  • gstop:阻止域端最小損失[dB]

fnは規格化のための基準の周波数。

wp = fp / fn
ws = fs / fn 
N, Wn = signal.buttord(wp, ws, gpass, gstop)
b, a = signal.butter(N, Wn, "low")
y = signal.filtfilt(b, a, x)

watlab-blog.com

参考にしました。

PythonでFFT実装!SciPyのフーリエ変換まとめ | WATLAB -Python, 信号処理, AI-

周波数解析 — Mechanical Design Lab. of TUMSAT 1.0 documentation

Python:ScipyのFFT(scipy.fftpack)をやってみる。 - がれすたさんのDIY日記

デシベルとは?

電圧や電力の『デシベル(dB)』とは?計算方法や変換方法について - Electrical Information

Pythonで音圧のデシベル(dB)変換式と逆変換式! | WATLAB -Python, 信号処理, AI-

numpy【loadtxtで日本語ファイルを読む】

日本語交じりのファイルをnp.loadtxtで読み込みます。

data = np.loadtxt('data.CSV',delimiter=',',skiprows=1, encoding="utf-8_sig")

エラーが発生

UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence

エンコード指定で解消します。"utf-8_sig"が必要なようです。

data = np.loadtxt('data.CSV',delimiter=',',skiprows=1, encoding="utf-8_sig")

詳しくは、こちらに記載ありました。

qiita.com