いわて駐在研究日誌

OpenCAE、電子工作、R/C等、徒然なるままに

最近の状況

子育て中心で、なかなかブログを更新できておりません。

定時を過ぎたらばたばたと迎えにいって、おむつ替えて、遊びの相手して、風呂入れて、ミルク飲ませて、寝かしつける、で8時過ぎ。

飯を食って風呂入ると、疲れて眠くなり、机で気絶してたりする。少なくとも家ではまとまった研究とか読書の時間がとれないのは、要反省ですな。

しかも、夜中に起きる子供の相手すると2時間はすぐに経つし、朝5時には起きるし、慢性的に寝不足な感じです。どうもいかんなー。

パスフレーズなしのSSHログイン(OpenMPI)と、NFSマウントの設定

パスフレーズなしのSSHログイン設定メモ

 

(1)クライアント(ログインユーザはwaku)でssh2のRSA暗号鍵を生成

$ ssh-keygen -t rsa

パスフレーズを聞いてくるが、なしでよければそのままリターンでOK

 

(2)公開鍵(*.pub)のほうを接続したいサーバにコピーする。

楽をしたければ、以下のコマンド1つでOK。

$ ssh-copy-id -i ~/.ssh/id_rsa.pub waku@SEREVER

もしくは以下のように、クライアントから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の設定・起動

# yum install 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

nfsv4 mounts files as nobody

 

 

OF+外部ライブラリ(物性値ライブラリ)その3

 水・水蒸気のライブラリである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

 

 

VAWT翼型最適化(2)

メッシャーの問題がひと段落したので、いよいよ計算という感じであるが、ここから泥臭い作業が続くのだろうなと覚悟しておく。

 

その前に、Dakotaで計算する場合、特定のCFD計算が発散したりしてエラーになる場合、それを飛ばして次の計算に移る仕組みを調べておく必要がありそう(リスタートとは別物・・・リスタート機能もちゃんと調べないとな)。

 

で、ちょっと調べてみた。

おそらくこのあたりだろうと思うが、以下のキーワードを設定すると良さそう。

Dakota Reference Manual: failure_capture

interface>analysis_drivers>failure_capture

  • abort (the default)
  • retry
  • recover
  • continuation

デフォルトでは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を読み込み、計算を続行する。

 

cfMeshで機能追加を希望するところ

cfMeshをいろいろ使っていて、やっぱり非常に使いやすい。

ちょっと不具合があってtwitterでぼやいていたら、わざわざ中の人が声を掛けてくれて直してくれたし(正確には、自分のSTLデータの造り方が想定外だったようだけど)、非常に好感触である。

 

さらに使い勝手向上のためには、

  • MultiRegionへの対応
  • cellZoneを指定可(patchのrenameはできるので)

してくれると嬉しいかなーと思いました。まぁ、既存のやり方で十分対応できるんですが...。

VAWT翼型最適化(1)

子育てしてると時間の感覚がなくなってしまっていかんな。もう6月半ばになってしまった。7月上旬に岩手大で発表するのに間に合わせるために、ちゃんとやらねば。

 

VAWT用2次元翼型の形状最適化を行いたいのだが、メッシュの自動生成でblockMeshではなかなか狙った形状にならないということで、sHM, cfMeshでやることにした。

流れ的には以下の通り、

(cfMeshの場合)

  • 2次元翼型形状(修正PARSEC)の設計変数をもとに、ribbon状態のSTLデータを作成(自作python
  • cfMeshでrotorZoneのメッシュ作成(cartesian2DMesh)
  • mergeMeshesコマンドでstatorZoneメッシュと結合
  • pimpleDyMFoam

※ cfMeshの難点は、ベースメッシュが対称にならないこと。

(sHMの場合)

 

  • 2次元翼型形状(修正PARSEC)の設計変数をもとに、ribbon状態のSTLデータを作成(自作python
  • blockMeshでベースメッシュ作成
  • sHMでrotorZoneのメッシュ作成(extrudeMeshで2D化)
  • mergeMeshesコマンドでstatorZoneメッシュと結合
  • pimpleDyMFoam

まずはこれらのAllrunスクリプトを作ろう。

 

 

cfMesh v1.0.1 my tutorial

いろいろメモ(cartesian2DMesh関係)

  • fms形式のジオメトリデータをstlに変換

FMSToSurface geom.fms geom.stl

  • stlデータをfms形式に変換(同じファイル名)

surfaceToFMS geom.stl

 

  • 境界条件用に、パッチ毎のstl solidエンティティとする(1つの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

  •  2次元メッシュ(cartesian2DMesh)を作る場合は、x-y平面上(z軸方向に押し出すことを想定して)に、リボン状にSTLをつくること
  • リボンの幅=押し出し厚さ
  • emptyとなるべきパッチは、"bottomEmptyFaces" "topEmptyFaces"と自動的に名前がつくので、boundaryファイルは後から要修正

    f:id:waku2005:20150604131930p:plain

複数STLはmeshDictで指定できる?

→(まだ?)出来ないので、単一STLファイルにsolidエンティティを複数記述する。それぞれのsolidエンティティはpatchとして認識される。

→ facetの法線ベクトルは調整しなくても下記のようにちゃんと認識できる。

→マルチドメインの場合は、今のところ対応してなさそうなので、個別に作ってmergeMeshが良さそう。

f:id:waku2005:20150604141055p:plain

fms形式のほうが形状再現性がよい?

→ surfaceToFMS コマンドを使っただけのstl→fms変換では、あまり差はなさそう。もう少し工夫が必要。

形状再現性を上げるには?

surfaceFeatureEdges all.stl all.fms -angle 0などとしてfmsファイルを作って指定すると、かなり改善(angleは見切り角の閾値)。

f:id:waku2005:20150604145057p:plain

             ↓

f:id:waku2005:20150604150558p:plain

→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してしまうのは何故だろう?仕様??ケース依存???

f:id:waku2005:20150604210639p:plain

(参考)

  1. https://openfoamwiki.net/index.php/Sig_Numerical_Optimization_/_Tips_%26_Tricks
  2. http://www.dicat.unige.it/guerrero/of2015a/3_6meshing_cfMesh.pdf