OpenFOAM による開発パターン

2012年4月30日

はじめに

OpenFOAM によるソルバーやライブラリの開発パターンについて。

使用バージョン

OpenFOAM 2.1.0

作業場所

開発のための作業場所は任意でよいが、開発したライブラリを利用するときにそのソースコード (正確にはヘッダーファイル) が必要になることがあるため、開発データを $WM_PROJECT_USER_DIR 以下にまとめておいたほうが便利かもしれない。その場合、$WM_PROJECT_DIR に倣ってつぎのようにする。

  • $WM_PROJECT_USER_DIR/applications/solvers : ソルバー
  • $WM_PROJECT_USER_DIR/src : ライブラリ

ソルバーの開発

OpenFOAM でソルバーを開発する場合、ふつうは既存ソルバーをベースにする。つぎのような手順になる。

  • $FOAM_SOLVERS の中から望みのものに近いソルバーを選び、作業場所にコピーする。
    (例)
    $ cp -r $FOAM_SOLVERS/incompressible/icoFoam .
    
  • ソルバーディレクトリの中の Make/files を編集する。さしあたっては EXE を変更する。たとえば
    EXE = icoFoam
    
    とすれば、icoFoam がソルバーディレクトリ内にできる。あるいは
    EXE = $(FOAM_USER_APPBIN)/icoFoam
    
    とすれば、$WM_PROJECT_USER_DIR 以下に icoFoam が置かれる。パスが通っているのでそのまま利用可能になる。ユーザーディレクトリのパスはオリジナルのパスより優先されるため、同じ名前だと修正版が使われることになる。ややこしいので名前を変更しておくべきかもしれない。
  • とりあえず "wmake" して、問題ないことを確認する。
  • ソースコードを修正する。適宜 Make/files, Make/options を修正する。
    • *.C ファイルを増やした場合は Make/files に追加する。
      (例)
      icoFoam.C
      mycode.C
      
      EXE = icoFoam
      
    • 新しくヘッダーファイルをインクルードする場合、ヘッダーファイルが見えていなければ Make/options で EXE_INC にヘッダーファイルのパスを設定する。"-I(パス)" の形で設定する。改行する場合は行末に "\" (バックスラッシュ) を入れる。
      (例)
      EXE_INC = \
          -I$(LIB_SRC)/finiteVolume/lnInclude \
          -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude
      
    • 新しく利用するライブラリを追加するには、Make/options で EXE_LIBS に利用するライブラリを指定する。たとえば $FOAM_LIBBIN にある libspecie.so を使う場合、"lib" と ".so" を除いて "-Ispecie" とする。改行する場合は行末に "\" (バックスラッシュ) を入れる。ライブラリが見えていない場合はパスを指定する必要がある。その場合は "-L(パス)" の形で設定する。
      (例)
      EXE_LIBS = \
          -lfiniteVolume \
          -lspecie
      

ライブラリの開発

OpenFOAM のライブラリを修正して新しいライブラリを作ることを想定する。つぎのような手順になる。

  • $FOAM_SRC の中から修正したいライブラリのソースコードを探す。
  • 修正したいソースコードを含むライブラリを特定する。Make ディレクトリがあるディレクトリ以下がひとつのライブラリの単位だと思えばよい。たとえば、$FOAM_SRC/thermophysicalModels/specie/transport の中身を修正したい場合は、そこから上に行くと specie の中に Make ディレクトリがあるので、それ以下がライブラリとわかる。Make/files に "LIB = $(FOAM_LIBBIN)/libspecie" とあるので、これ以下が libspecie.so のソースコードだとわかる。
  • Make ディレクトリを含むディレクトリをごっそり作業場所にコピーする。上の例の場合、$FOAM_SRC/thermophysicalModel/specie をコピーすることになる。
  • Make/files の LIB を以下のように修正する。
    LIB = $(FOAM_USER_LIBBIN)/libspecie
    
    これでライブラリが $WM_PROJECT_USER_DIR 以下にできる。パスが通っており、またオリジナルのパスよりも優先されるため、ここでできるライブラリがオリジナルにかぶさり、オリジナルが見えなくなる (オリジナルが消えるわけではない)。既存のソルバーは修正版ライブラリのほうを先に見つけるため、こちらを使うようになる (ということは、ライブラリを作り直してもソルバーの再コンパイルは必要ないということ)。つまり、既存のライブラリ自体を修正したい場合は、オリジナルのソースコードをいじらずとも、同じ名前で修正版ライブラリをユーザーディレクトリにコンパイルすればよい。ややこしければライブラリの名前を変えたほうがよいかもしれない。その場合はそのライブラリを使うようにソルバーをコンパイルする必要がある。
  • "wmake libso" でコンパイルする ("wmake" ではない)。確認のため。
  • ソースコードを修正する。適宜 Make/files, Make/options を修正する。このあたりはソルバーの場合と同じ。
    • 同じ種類のクラスを追加したい場合 (たとえば transport の種類を追加したいなど)、同種のクラスをコピーし、名前をごっそり新しいものに置換してしまうとよい。sed を使うと便利である。
      $ sed -e "s/sutherlandTransport/mySutherlandTransport/g" sutherlandTransport.C > mySutherlandTransport.C
      

必ずしも上のようにしなければならないわけではなく、コードを部分的に取り出しても大丈夫な場合もある。ただ、だいたいはめんどくさいことになるので、上のようにしたほうが早い。