子育て中心で、なかなかブログを更新できておりません。
定時を過ぎたらばたばたと迎えにいって、おむつ替えて、遊びの相手して、風呂入れて、ミルク飲ませて、寝かしつける、で8時過ぎ。
飯を食って風呂入ると、疲れて眠くなり、机で気絶してたりする。少なくとも家ではまとまった研究とか読書の時間がとれないのは、要反省ですな。
しかも、夜中に起きる子供の相手すると2時間はすぐに経つし、朝5時には起きるし、慢性的に寝不足な感じです。どうもいかんなー。
パスフレーズなしのSSHログイン設定メモ
(1)クライアント(ログインユーザはwaku)でssh2のRSA暗号鍵を生成
※ パスフレーズを聞いてくるが、なしでよければそのままリターンでOK
(2)公開鍵(*.pub)のほうを接続したいサーバにコピーする。
楽をしたければ、以下のコマンド1つでOK。
もしくは以下のように、クライアントからscpなどをつかって公開鍵をコピーし、その後、サーバー側で設定する。
※ サーバ自身も計算ノードに使う場合は、サーバ自身にたいしてもやっておくこと。
※ 同様に、各クライアント→サーバ、各クライアント→他のクライアントもパスフレーズなしで認証できるようにしておく必要がある(重要)。
@クライアント
$ scp ~/.ssh/id_dsa.pub waku@SERVER
@サーバ(コピーした公開鍵をauthoized_keysに追記)
$ cat ~/id_dsa.pub >> authorized_keys server
$ chmod 600 authorized_keys
$ rm ~/id_dsa.pub
(3)パスワードなしでsshログインできるか確認
$ ssh waku@ensis13
Last login: Mon Jul 13 08:55:12 2015 from ensis10
[waku@ensis13 ~]$
NFS設定メモ
※ mpirunには--preload_binaryというオプションがあるので、sshでホスト名を使ったログインができていれば、いちいちNFSマウントしていなくても実行バイナリを配ってくれるらしい。
※ 今回は真面目に、ジョブサーバの特定ディレクトリをNFSで公開し、計算ノードからNFSクライアントとしてマウントすることにする。
(1)使用条件
NFSサーバ(ジョブサーバ、マウントされる側)
ensis10: /home/waku/exports
NFSクライアント(マウントする側)
ensis{12/13/14}: /home/waku/exports
(2)NFSサーバの設定
/etc/exportsに以下を記述
/home/waku/exports 192.168.0.12(rw,no_root_squash) 192.168.0.13(rw,no_root_squash) 192.168.0.14(rw,no_root_squash)
exportsを確認
exportfs -v
/home/waku/exports
192.168.0.12(rw,wdelay,no_root_squash,no_subtree_check)
/home/waku/exports
192.168.0.13(rw,wdelay,no_root_squash,no_subtree_check)
/home/waku/exports
192.168.0.14(rw,wdelay,no_root_squash,no_subtree_check)
nfs, rpcbindの設定・起動
# chkconfig rpcbind on
# chkconfig nfslock on
# chkconfig nfs on
# /etc/init.d/nfs start
(3)NFSクライアントの設定
# /etc/rc.d/init.d/rpcbind start
# chkconfig rpcbind on
# /etc/rc.d/init.d/netfs start
# chkconfig netfs on
$ mkdir /home/waku/exports
手動マウントしてみる
# mount -t nfs 192.168.0.10:/home/waku/exports /home/waku/exports
うまくいけば、
# vi /etc/fstab
192.168.0.10:/home/waku/exports /home/waku/exports nfs _netdev,rw,async,hard,intr 0 0
(注)ここでサーバ、クライアントは同じGID/UIDを持つものとしているので(事前に同じGID/UIDに変更している)、同じユーザwakuで読み書きできるはずである。ただし、NFSv4(SL6/CentOS6)のバグ?のようなものがあり、nobody.nobodyでマッピングされてしまうことがある。対処方法は、以下のようにすれば良い。
# vi /etc/idmapd.conf
Domain = localdomain (記述を追記)
# /etc/rc.d/init.d/rpcimapd restart
# nfsidmap -c (nfsidのキャッシュクリア)
# /etc/rcd./init.d/netfs restart
水・水蒸気のライブラリであるfreesteamとOFの併用テスト
1)まず、freesteamをビルドして(sconsが必要)、.soライブラリ”libfreesteam.so.1”を作成しておく。OFのビルド環境で実行する。
tar xf freesteam-2.1.tar.bz2
cd freesteam-2.1
scons
scons test && ./test. (テスト)
2)続いて、IAPWS-IF97-OFのライブラリ”libIAPWSRangeThermo.so”のビルドを行う。OFのビルド環境で実行する。
git clone https://github.com/romansCode/IAPWS-IF97-OF.git
cd IAPWS-IF97-OF
wclean
wmake libso
メッシャーの問題がひと段落したので、いよいよ計算という感じであるが、ここから泥臭い作業が続くのだろうなと覚悟しておく。
その前に、Dakotaで計算する場合、特定のCFD計算が発散したりしてエラーになる場合、それを飛ばして次の計算に移る仕組みを調べておく必要がありそう(リスタートとは別物・・・リスタート機能もちゃんと調べないとな)。
で、ちょっと調べてみた。
おそらくこのあたりだろうと思うが、以下のキーワードを設定すると良さそう。
Dakota Reference Manual: failure_capture
interface>analysis_drivers>failure_capture
デフォルトではabortになっているので、各設計変数での計算が失敗した場合は、そこでdakotaも終了ということになる。retryはもう一度analysisを実行。recoverは、一緒に指定した”reals for specifying the dummy function values”をダミーで出力して次のanalysisへ進む。cotinuationは良く分からないが、それまでに成功した設計変数から、失敗した設計変数のanalysisに近い設計変数を生成し再トライするような感じである。
ということで、recoverでダミー目的関数値をしておくことで後からそれらを弾けば良さそうである。
続いてリスタートであるが、dakotaは黙っていても、dakota.rstというリスタートファイルを作成してくれる。ファイル名を指定したければ、
dakota -i dakota.in -write_restart my_restart_file
このファイルを読み込む場合は、
dakota -i dakota.in -read_restart my_restart_file
で良いとのこと。-write_restart
と -read_restartで同時にファイルを指定すると、-write_restartの指定にappendする。
さらに、
dakota -i dakota.in -r dakota.rst -s 50 -w dakota_new.rst
とすると、dakota.rstの最初の50個のevaluationを読み込み、計算を続行する。
子育てしてると時間の感覚がなくなってしまっていかんな。もう6月半ばになってしまった。7月上旬に岩手大で発表するのに間に合わせるために、ちゃんとやらねば。
VAWT用2次元翼型の形状最適化を行いたいのだが、メッシュの自動生成でblockMeshではなかなか狙った形状にならないということで、sHM, cfMeshでやることにした。
流れ的には以下の通り、
(cfMeshの場合)
※ cfMeshの難点は、ベースメッシュが対称にならないこと。
(sHMの場合)
まずはこれらのAllrunスクリプトを作ろう。
いろいろメモ(cartesian2DMesh関係)
FMSToSurface geom.fms geom.stl
surfaceToFMS geom.stl
solid left
facet normal 0 -1 0
outer loop
vertex -1 0 0
vertex 1 0 0
vertex 1 0 0.1
endloop
endfacet
facet normal 0 -1 0
outer loop
vertex -1 0 0
vertex 1 0 0.1
vertex -1 0 0.1
endloop
endfacet
endsolid left
solid bottom
facet normal 1 0 0
outer loop
vertex 1 0 0
vertex 1 1 0
vertex 1 1 0.1
endloop
endfacet
facet normal 1 0 0
outer loop
vertex 1 0 0
vertex 1 1 0.1
vertex 1 0 0.1
endloop
endfacet
endsolid bottom
→(まだ?)出来ないので、単一STLファイルにsolidエンティティを複数記述する。それぞれのsolidエンティティはpatchとして認識される。
→ facetの法線ベクトルは調整しなくても下記のようにちゃんと認識できる。
→マルチドメインの場合は、今のところ対応してなさそうなので、個別に作ってmergeMeshが良さそう。
fms形式のほうが形状再現性がよい?
→ surfaceToFMS コマンドを使っただけのstl→fms変換では、あまり差はなさそう。もう少し工夫が必要。
形状再現性を上げるには?
→surfaceFeatureEdges all.stl all.fms -angle 0などとしてfmsファイルを作って指定すると、かなり改善(angleは見切り角の閾値)。
↓
→meshDictを書き換えてみる。
before:
[snip]
maxCellSize 0.01;
//surfaceFile "axis.stl" "AMIr.stl" "wing0.stl" "wing1.stl" "wing2.stl"; N/A
//surfaceFile "all.stl";
surfaceFile "all.fms";
boundaryLayers
{
nLayers 6;
thicknessRatio 1.2;
}[snip]
after: とりあえず全部入り
maxCellSize 0.01;
//boundaryCellSize 0.005;
//boundaryCellSizeRefinementThickness 0.005;
//minCellSize 0.001;
//surfaceFile "axis.stl" "AMIr.stl" "wing0.stl" "wing1.stl" "wing2.stl"; N/A
//surfaceFile "all.stl";
surfaceFile "all.fms";
boundaryLayers
{
// for All patches
//maxFirstLayerThickness 0.005;
//nLayers 10;
//thicknessRatio 1.15;
/// for each patch
patchBoundaryLayers
{
"wing.*"
{
maxFirstLayerThickness 0.01;
nLayers 10;
thicknessRatio 1.15;
allowDiscontinuity 0;
}
"axis"
{
maxFirstLayerThickness 0.01;
nLayers 5;
thicknessRatio 1.15;
allowDiscontinuity 0;
}
}
}
localRefinement
{
"wing.*"
{
cellSize 0.005;
additionalRefinementLevels 3;
refinementThickness 0.005;
}
"axis"
{
cellSize 0.005;
additionalRefinementLevels 3;
refinementThickness 0.005;
}
}
objectRefinements
{
/*
objectName1 // conical object
{
cellSize 3.75;
type cone;
p0 (-100 1873 -320);
radius0 200;
p1 (-560 1400 0);
radius1 200;
}
objectName2 // box object
{
cellSize 3.75;
type box;
centre (500 500 150);
lengthX 100;
lengthY 150;
lengthZ 200;
}
objectName3 // sphere object
{
cellSize 3.75;
type sphere;
centre (0 700 0);
radius 50;
}
objectName4 // line object
{
cellSize 3.75;
type line;
p0 (-750 1000 450);
p1 (-750 1500 450);
}
*/
}
surfaceMeshRefinement
{
/*
surfaceFile "axis.stl";
additionalRefinemntLevels 3;
refinementThickness 0.005;
*/
}
keepCellsIntersectingBoundary 0;
keepCellsIntersectingPatches
{
/*
"wing.*"
{
keepCells 1;
}
*/
}
//removeGluedMesh 0;
checkForGluedMesh 0;
removeCellsIntersectingPatches
{
/*
"wing.*"
{
keepCells 0;
}
*/
}
renameBoundary
{
defaultName frontAndBack;
defaultType empty;
newPatchNames
{
"AMIr"
{
newName AMIr;
type patch;
}
"wing0"
{
newName wing0;
type wall;
}
"wing1"
{
newName wing1;
type wall;
}
"wing2"
{
newName wing2;
type wall;
}
"axis"
{
newName axis;
type wall;
}
".*EmptyFaces"
{
newName frontAndBack;
type empty;
}
}
enforceGeometryConstraints 1;
※ maxCellSizeとminCellSize を両方指定するとabortしてしまうのは何故だろう?仕様??ケース依存???
(参考)