いわて駐在研究日誌

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

新年度です。

結局、動的ライブラリが放置状態なので今年度こそはと思う。

 

今年度の目標は、

校務

  • 授業は確実に準備をすすめること(前倒しでやること)
  • 卒研・特研は学生との作業時間を増やすこと
  • 地域連携を進め、共同研究3件を目指す(1件決定済み)

研究

  • マイクロORCのコア部分(タービン+ポンプ)を中心に開発をすすめる
  • マイクロ水平軸風車システム開発に区切りをつける(製品化の手前まで)
  • 最適化関係+OpenCAE(OpenFOAM/Salome_meca)のアウトプットを増やす
  • 生物規範工学の勉強をする
  • MAVなどの制御システムやIoT技術について勉強する
  • 論文書く

家庭&自己研鑽

  • 夏ごろに子供が2名体制になるので、子育ても頑張る
  • 英語でアウトプットできるようにTOEICの勉強を再開する+英語論文を書く

といったところでしょうか。

 

動的なsolidBodyMotionFvMeshのライブラリ作成(その2)

基礎にもどって、dynamicMeshの調査。

 

OF4.xでのdynamicメッシュは大きく分けると、

  • dynamicFvMesh ・・・Automatic mesh motion
  • topoChangerFvMesh・・・Topological mesh changes
に大別される(Ref.: A.O.Gonzalez,Mesh motion alternatives in OpenFOAM,2009)。
参考文献はちょっと古いが、現状の4.xでも、以下の通り。
< dynamicFvMesh >
  • dynamicInkJetFvMesh   relatively small mesh motion like ink-jet pumping
  • dynamicMotionSolverFvMesh  relatively small mesh motion
  • dynamicRefineFvMesh    refinement and corcening mesh
  • solidBodyMotionFvMesh    solid body motion
  • staticFvMesh    no motion (static)
  • (dynamicFvMesh)  just Abstract base class
< topoChangerFvMesh >
  • linearValveFvMesh  sliding meshes of rlative linear motions
  • linearValveLayersFvMesh   linearValveFvMesh+layer addtion/removal functions
  • mixerFvMesh   rotating slider mesh
  • movingConeTopoFvMesh  layer addtion/removal depending on cell layer thickness
  • rawTopoChangerFvMesh topoChangerFvMesh without any added functionality
  • (topoChangerFvMesh)  just Abstract base class
 
今回の自分の用途には、やはりsolidBodyMotionFvMesh が一番近い機能を持ってそうなので(topological change機能は不要)、これをベースに開発してみよう。

directDrivenMotionFvMeshの作成(OF 4.x)

参考とするsolidBodyMotionFvMeshは、dynamicFvMeshに継承されているので、solidBodyMotionFvMesht同じレベルでdirectDrivenMotionFvMeshというライブラリを作成してみる(Chen et al.と同じ名前だとまずいかなということで)。Motionを具体的に記述するmotionFunctionも作成してみよう。

 

(1)まずは、solidBodyMotionFvMeshをcopyしてフォルダ名やファイル名をrename

$ cp -r $FOAM_SRC/dynamicFvMesh/solidBodyMotionFvMesh/ .

$ mv solidBodyMotionFvMesh directDrivenMotionFvMesh

 

$ cd  directDrivenMotionFvMesh/

$ mv solidBodyMotionFvMesh.C directDrivenMotionFvMesh.C

$ mv solidBodyMotionFvMesh.H directDrivenMotionFvMesh.H

$ mv multiSolidBodyMotionFvMesh.C multiDirectDrivenMotionFvMesh.C

$ mv multiSolidBodyMotionFvMesh.H multiDirectDrivenMotionFvMesh.H

 

$ mv  solidBodyMotionFunctions directDrivenMotionFunctions

(2)sedコマンド(-iオプション)を利用したファイル中のclass名などのrename

$ sed -i s/solidBodyMotionFvMesh/directDrivenMotionFvMesh/g directDrivenMotionFvMesh.C

$ sed -i s/solidBodyMotionFvMesh/directDrivenMotionFvMesh/g directDrivenMotionFvMesh.H

 

$ sed -i s/multiSolidBodyMotionFvMesh/multiDirectDrivenMotionFvMesh/g multiDirectDrivenMotionFvMesh.C

$ sed -i s/multiSolidBodyMotionFvMesh/multiDirectDrivenMotionFvMesh/g multiDirectDrivenMotionFvMesh.H

$ sed -i s/solidBodyMotionFvMesh/directDrivenMotionFvMesh/g multiDirectDrivenMotionFvMesh.C

$ sed -i s/solidBodyMotionFvMesh/directDrivenMotionFvMesh/g multiDirectDrivenMotionFvMesh.H

 

(solidBodyMotionFunction関連)

$ sed -i s/SBMF/DDMF/g directDrivenMotionFvMesh.C

$ sed -i s/SBMF/DDMF/g directDrivenMotionFvMesh.H

$ sed -i s/SBMF/DDMF/g multiDirectDrivenMotionFvMesh.C

$ sed -i s/SBMF/DDMF/g multiDirectDrivenMotionFvMesh.H

 

$ sed -i s/solidBodyMotionFunction/directDrivenMotionFunction/g directDrivenMotionFvMesh.C

$ sed -i s/solidBodyMotionFunction/directDrivenMotionFunction/g directDrivenMotionFvMesh.H

$ sed -i s/solidBodyMotionFunction/directDrivenMotionFunction/g multiDirectDrivenMotionFvMesh.C

$ sed -i s/solidBodyMotionFunction/directDrivenMotionFunction/g multiDirectDrivenMotionFvMesh.H

※ これ以降、multiDirectDorivenMotion.C/Hについては詳述しません。後日、追記予定。

(3)pointPatchFields/derived/solidBodyMotionDisplacement関連のrname

$ pointPatchFields/derived

$ mv solidBodyMotionDisplacement/ directDrivenMotionDisplacement/

$ cd directDrivenMotionDisplacement/

$ mv solidBodyMotionDisplacementPointPatchVectorField.C directDrivenMotionDisplacementPointPatchVectorField.C

$ mv solidBodyMotionDisplacementPointPatchVectorField.H directDrivenMotionDisplacementPointPatchVectorField.H

 

$ sed -i s/solidBodyMotion/directDrivenMotion/g directDrivenMotionDisplacementPointPatchVectorField.C

$ sed -i s/solidBodyMotion/directDorivenMotion/g directDrivenMotionDisplacementPointPatchVectorField.H

$ sed -i s/SBMF/DDMF/g directDrivenMotionDisplacementPointPatchVectorField.C

$ sed -i s/SBMF/DDMF/g directDrivenMotionDisplacementPointPatchVectorField.H

(4)Makeフォルダの作成および修正

$ cp -r  $FOAM_SRC/dynamicFvMesh/Make .

Edit Make/files as:

directDrivenMotionFvMesh.C
multiDirectDrivenMotionFvMesh.C

directDrivenMotionFunctions/solidBodyMotionFunction/solidBodyMotionFunction.C
directDrivenMotionFunctions/solidBodyMotionFunction/solidBodyMotionFunctionNew.C

directDrivenMotionFunctions/directDrivenMotionFunction/directDrivenMotionFunction.C
directDrivenMotionFunctions/directDrivenMotionFunction/directDrivenMotionFunctionNew.C
directDrivenMotionFunctions/rotatingMotion/rotatingMotion.C

directDrivenMotionFunctions/axisRotationMotion/axisRotationMotion.C
directDrivenMotionFunctions/oscillatingRotatingMotion/oscillatingRotatingMotion.C

pointPatchFields/derived/directDrivenMotionDisplacement/directDrivenMotionDisplacementPointPatchVectorField.C

LIB = $(FOAM_USER_LIBBIN)/libdirectDrivenMotionFvMesh

(※ motionFunction関係は現時点で手つかずです。)

Edit Make/option as:

 EXE_INC = \
    -I$(LIB_SRC)/triSurface/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/dynamicMesh/lnInclude \
    -I$(LIB_SRC)/dynamicFvMesh/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude

LIB_LIBS = \
    -ltriSurface \
    -lmeshTools \
    -ldynamicMesh \
    -ldynamicFvMesh \
    -lfiniteVolume

 (5)directDrivenMotionFunctionの作成および修正

$ cd directDrivenMotionFunctions

(使わなそうなmotionFunctionをいくつか削除)

$ rm -rf SDA  linearMotion  multiMotion  oscillatingLinearMotion tabulated6DoFMotion

$ ls
axisRotationMotion  oscillatingRotatingMotion  rotatingMotion  solidBodyMotionFunction(solidBodyMotionFunctionをコピー&リネーム)

$ cp -r solidBodyMotionFunction directDrivenMotionFunction

$ cd directDrivenMotionFunction

$ mv solidBodyMotionFunction.C directDrivenMotionFunction.C

$ mv solidBodyMotionFunction.H directDrivenMotionFunction.H

$ mv solidBodyMotionFunctionNew.C directDrivenMotionFunctionNew.C

(directDrivenMotionFunction.Cなどの修正)

$ sed -i s/solidBodyMotion/directDrivenMotion/g directDrivenMotionFunction.C

$ sed -i s/solidBodyMotion/directDrivenMotion/g directDrivenMotionFunction.H

$ sed -i s/solidBodyMotion/directDrivenMotion/g directDrivenMotionFunctionNew.C

$ sed -i s/SBMF/DDMF/g directDrivenMotionFunction.C

$ sed -i s/SBMF/DDMF/g directDrivenMotionFunction.H

$ sed -i s/SBMF/DDMF/g directDrivenMotionFunctionNew.C

 (6)wmake libso

とりあえず、ここまでの変更を反映してライブラリが作れるかwmake libsoしてみる。

$ cd ../../   (ライブラリフォルダのトップに戻って)

$ wclean

$ wmake libso

[snip]

'/home/waku/OpenFOAM/waku-4.x/platforms/linux64GccDPInt32Opt/lib/libdirectDrivenMotionFvMesh.so' is up to date.

 以上の変更は、ライブラリやクラス名称を変更しただけなので、中身はオリジナルのもののまま。これをいろいろ変更していく。ちなみにライブラリのビルドは通るが、motionFunctionは多重定義となっているので、実行時にエラーになるので、こちらも名前を変える必要あり。

動的なsolidBodyMotionFvMeshのライブラリ作成

OF、あるいは、動的メッシュ機能をもつたいていのCFDソフトは、メッシュの移動・回転速度を指定して計算するのが一般的だろう。

 

風車の研究をしているので、ブレードトルク→回転の運動方程式→角速度→回転角のような動的なメッシュ移動ができないか試行錯誤しているが、自分のC++の知識ではOFのC++の高レベルの利用に追いついていけず、遅々として進んでいない(一応それらしい動きができるようにしてみたが、回転の運動方程式をfunctionObject機能を利用して外部で解いているので、次のステップとして、できれば全部OFの中でクローズしたいと考えている)。

 

もっと時間をかけてC++勉強しないとだめだなぁと思いつつ、いろいろ調べてたらそのようなライブラリを使用している論文を発見(Goong Chen et al, "OpenFOAM computation of interacting wind turbine flows and control(I): free rotating case", WPのpreprint?)。2014年かということで、自分がアイデア考えだしたころに論文になってたということになる。ちょっと残念。Chen先生は結構OF関連では、論文を出してるみたいだ。

 

彼らの論文によると、OF-extendを利用して(???明確な記述なし)、solidBodyMotionFvMeshからforceDrivenFvMeshというライブラリを作成し、その中で、forceDrivenMotionFunction( FDRotatingMoton, codedFDRotatingMotion)の回転計算functionを定義して利用しているようである。

 

ライブラリ自体のあまり詳しい情報は小論文にのっておらず、ネットでも検索でヒットしないので、情報を得るには直接コンタクトするか、CFDonlineに聞くしかないようだ。もう少し調査しつつ、正規版4.xでも作れないか作業してみたい。

 

 

 

SL6にdevtoolを入れる

SL6やCentOS6系はコンパイラのバージョンが古いため、OF4.xのビルドなどのためには、いろいろ支障が出てきている。そこで、devtoolと呼ばれるコンパイラ関係の更新パッケージをいれてみる(SL6.8)。

 

linux.web.cern.ch

devtoolは現在4まであるみたいだが、あまり新しいコンパイラだとハマる可能性もあるため、devtool-2をいれてみた(gcc4.8.2)。

$ su

# cd /etc/yum.repo.d/

# wget http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo

# yum install devtoolset-2

# exit

$ source /opt/rh/devtoolset-2/enable 

$ gcc --version
gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

SLは、次のバージョンからCentOSベースになるらしいけど、それならCentOSでいいのかな。

chtMulitRegionFoam + DynamicMesh(fluidRegion) + interFoam + Evapolation/Condensation on OF3.0.x (その1)

というのをやりたいので、以下の順番に進める。

OF4.0が出たばっかりだが、ちょっとヘッダファイルが変わったようなので、とりあえず3.0.xで進める。

①chtMulitRegionFoam + DynamicMesh(fluidRegion) = chtMultiReginDyMFoam

 

 

 

 

Immersed boundary method on foam-extend 3.2

(注意) foam-extend 3..2はgcc 4.9.2以上が必要なようです。

OpenFOAMのforkしたバージョンであるfoam-extend 3.2が昨年9月にリリースされ、前から気になっていたImmersed boundary methodが正式にリリースされていたので、知らべてみた。現在は、nextReleaseとして4.0の作業を進めているらしいです。

 

ライブラリ:src/immersedBoundary

ソルバー:applications/solvers/immersedBoundary/ (六つ)

    icoIbFoam    porousSimpleIbFoam  simpleIbFoam
    icoDyMIbFoam     interIbFoam  potentialIbFoam

チュートリアル:tutorials/immersedBoundary/*

 

テスト1(Tutorial・・・cylinderInChannelIcoIbFoam)

2次元チャネル内に、2次元stlファイルでIB(Immersed boundary)が静止している計算。ここで設定として

  • IBはstlないしftrで指定(ベースメッシュで考慮は不要)する。ファイル名がboundary名になる。stlファイルはsurfaceConvertコマンドでftr形式にも変換して、同じフォルダにおいておく。
  • IBのconstant/boundaryには、以下のように記述する。nFacesは0で、それ以外のfaceIDに合わせて適宜startFaceを指定する。

   ibCylinder
    {
        type            immersedBoundary;
        nFaces          0;
        startFace       3650;
        internalFlow    no;
    }

  •  0/U,pファイルは、以下のように記述する。

0/U

    ibCylinder
    {
        type immersedBoundary;
        refValue uniform (0 0 0);
        refGradient  uniform (0 0 0);
        fixesValue yes;

        setDeadCellValue   yes;
        deadCellValue      (0 0 0);
    }

 0/p

    ibCylinder
    {
        type immersedBoundary;
        refValue uniform 0;
        refGradient  uniform 0;
        fixesValue no;

        setDeadCellValue   yes;
        deadCellValue      0;

        value uniform 0;
    }

 

f:id:waku2005:20160627133934p:plain

f:id:waku2005:20160627133939p:plain

f:id:waku2005:20160627133943p:plain

スト2(Tutorial・・・cylinderInChannelIcoIbFoam)

2次元チャネル内に、2次元stlファイルでIB(Immersed boundary)が変動している計算。ソルバーはicoDyMIbFoamになる。

下記のとおり、dynamicMeshDictの中で、往復するsolidBodyMotionを定義している。

- constant/dynamicMeshDict

dynamicFvMesh   immersedBoundarySolidBodyMotionFvMesh;

immersedBoundarySolidBodyMotionFvMeshCoeffs
{
    motionFunctions
    (
        ibCylinder
        {
//             solidBodyMotionFunction     translation;
//             translationCoeffs
//             {
//                 velocity (0.1 0 0);
//             }

            solidBodyMotionFunction     linearOscillation;
            linearOscillationCoeffs
            {
                amplitude    (0.5 0 0);
                period       2.5;
            }
        }
    );
}

 

f:id:waku2005:20160627140854p:plain

f:id:waku2005:20160627140901p:plain