DEXCSアドバンス版でCalculiXの並列計算

DEXCSアドバンス版を作成した当初においては、CalculiXの並列計算までは考慮していなかったというのが実態です。同梱したAllrun-parallelにおいても、OpenFOAMの並列計算を考慮した内容でしかありません。

その後、Allrunスクリプト中に、CalculiX(実体はccx_preCICE) を起動する際に、

    export OMP_NUM_THREADS=1
    export CCX_NPROC_EQUATION_SOLVER=1

という環境変数がある事に気付き、どうやらこの数字で並列度を変えられそうだとなりました。しかしながら、この数字を大きくすると、確かに速くはなるんですが、その効果は僅かなものでしかなかったというのが実状でした。

最近、比較的規模が大きく、なおかつCalculiXの計算時間が、OpenFOAMの計算時間より長くなってしまうような事例に遭遇する事となり、改めてなんとかならないものかと調べ直しました。そこで、よくよく計算ログ(Solve.log)を見直すと・・・

 iteration 1

 Using up to 4 cpu(s) for the stress calculation.

 Using up to 4 cpu(s) for the symmetric stiffness/mass contributions.

 Factoring the system of equations using the symmetric spooles solver
 Using 1 cpu for spooles.

 Using up to 4 cpu(s) for the stress calculation.

スレッド数を4にして計算しているので、確かに 4 cpu(s) というログになっているのですが、もっとよく見ると、spooles solver の部分では、1 cpu にしかなっていないという点に、今更ながら気付いたという事です。つまり、一番肝心な逆行列を計算するところで、マルチスレッド計算出来ていなかったという事です。

CalculiX(ccx本体)については、マルチスレッド計算用に、spoolesをマルチスレッド対応すれば良い・・・的な情報はたくさん存在するので、色々調べたのですがピンと来るものがありません。よくよく考えたら、ccx本体は関係なくて、ccx_preCICEをマルチスレッド対応させる必要があるんだということでした。そこで、調べ直すと、ようやくズバリの記事が見つかりました!

https://precice.discourse.group/t/calculix-parallelization/167

これはpreCICEのディスカッションボードの記事で、しかも時期的には2020年3月ということで、DEXCSアドバンス版に仕掛かっていた当時には既にわかっていた情報でした。これが当時のインストール情報ページには反映されていなかったという事です。ちなみに、このインストール情報ページも現在では、当時のものとは全く別物になってしまっています。これがpreCICEワールド!

何はともあれ、当時の calculix-adapter(ccx_preCICE)のビルド方法をベースに考えると、以下の2点につき、ビルド追加・変更すればよいということです。

SPOOLES

$ cd $HOME/CalculiX
$ cd SPOOLES.2.2/MT
$ make

これにて、MT/src/spoolesMT.a が生成される。

calculix-adapter

$HOME/preCICE/calculix-adapter-2.15_preCICE2.x/Makefileを、以下変更(朱字部分を追記)して

LIBS = \
        \$(SPOOLES)/MT/src/spoolesMT.a \
        \$(SPOOLES)/spooles.a \
        \$(PKGCONF_LIBS) \
        -lstdc++ \
        -L$(YAML)/build -lyaml-cpp \

CFLAGS = -Wall -O3 -fopenmp $(INCLUDES) -DARCH="Linux" -DSPOOLES -DARPACK -DMATRIXSTORAGE -DUSE_MT

コンパイルし、バイナリをコピーし直せば良いということです。

$ cd $HOME/preCICE/calculix-adapter-2.15_preCICE2.x
$ make clean
$ make
$ sudo cp bin/ccx_preCICE /usr/bin

つまり、当初のビルド方法では、spoolesMT(マルチスレッド)が組み込まれていなかったということです。

計算速度について

計算対象と計算内容について、現時点では公開できませんが、メッシュ規模と計算時間について比較した数値は公表しても問題無さそうなので以下に示しておきます。

計算規模は表中に記したNp(節点数)Nc(要素数)の通りで、計算の時間送りステップ数は850、陰解法による繰り返し計算があって総ステップ数としては3730回の計算をしている。また、計算機のスペックは、Core i9-11900K @ 3.50GHz(Cores: 8)でメモリーは十分に余裕のある状態での結果です。

case2が、従来の方法によるもので、CalculiXのスレッド数を4に指定したものの、ccx_preCICEがMT対応していなかった為、case1 に比べてほんのわずか(10%以下)しかスピードアップしていなかった。case3以降が、MT対応のccx_preCICEで計算をやり直したもので、case5を除いて、スレッド数を増やすことによるスピードアップが得られた(とはいうもの、最大で2倍弱程度だが・・・)。

case5において、悪化しているのは、計算機の総コア数が8であり、OpenFOAMの占有分4を除いた4コアに対して6スレッドの処理には無理があるということのようです。

念の為、別のメニーコアの計算機(Xeon Gold 6130 @ 2.10GHz,16Core×2)にてやり直してみました。

但し、こちらはベースクロックが遅いので、計算の総ステップ数は1601回と少なくして実施したもの。総コア数に余裕があれば、先のような極端な速度低下はなく、基本的にコア数に応じて速度アップするが、6以上でほとんど頭打ち状態になる(2倍弱のスピードアップにしかならない)ことも確認できました。

但し、メッシュ数が変わった場合や、今回はCalculiXのメッシュがテトラの(2次要素でメッシュ作成が困難であった為)1次要素で作成してあるが通常は2次要素で計算したいところであり、このあたりの状況が変わった時の並列速度がどうなるかは、今後改めて調査する予定です。

FreeCAD FEM ワークベンチ


先の記事にて、表題の挙動が怪しいと記しましたが、その後の調査で依然不明点はいくつかあるものの、ある程度使えそうと判断するに至ったので、新たに判明した点と併せて、ここにまとめておきます。

計算例

とりあえず、このくらいの計算は、ちゃちゃっと出来そうです。

範囲を選択_101

同じ題材(パンテオン神殿)を使って、Salome-MecaとAdventureを比較した約4年前の記事がありましたが、あれらに比べて遜色ないというか、GUI操作は格段に楽チンです。いくつか課題もありますけどね・・・

Verの問題

このFEMワークベンチは、まだまだ開発途上のようです。件の書籍では、現時点の正式版(Ver-0.15)をベースの記事でしたが、簡単なモデルならともかく、上記例題のレベルになると、簡単に昇天してしまいます。⇒Pre-release版の使用を強く推奨します。本記事で使用したヴァージョンは以下の通りです。

Windows版、Linux-Mint版ともに 0.16-6420 (2016/2/12)

Mac版については検証していません(出来ません)ので悪しからず。

Linuxにおける問題

Linux版は、拙作のDEXCS2015 for OpenFOAM(R)の仮想マシンにて検証していますが、上記ヴァージョンの問題以前に、Calculixを自前でインストールする必要がある事が判明。当初、先達の経験談を聞いたり、自分でもCalculixのインストールガイドを読んで・・・諦めかけていたのですが、FreeCADのFEM Install というページがあって、Ubuntu系であればパッケージインストールも出来る事が判って即採用⇒OKでした。
コマンド端末にて、

sudo apt-get update

sudo apt-get install ccx

sudo apt-get install freecad

と入力すれば一発OKなんですが、あくまでコマンド入力は駄目!という人向け、GUI(パッケージマネージャ)を使ってやる方法は、こちらを参照。

また、DEXCS2014 (ubuntu 14.04 LTS)をお使いの場合には、

sudo add-apt-repository ppa:freecad-maintainers/freecad-daily

と、レポジトリを追加する必要があります。

 

使い物になる!と思った点

CAE教育を主用途として開発し、拙が共著「はじめてのオープンCAE」に同梱の「DEXCS2010 for Adventure」がありまして、本格的なCAE(弾性解析だけですが・・・)を簡単に使えるという意味で、これまでこれを超えるものは存在しないと自負しておりましたが、本ツールを使えばもっと簡単に出来そうです。特に優れていると感じた箇所は2点。

  1. 境界条件設定が楽チン
  2. 固有値解析も出来る

特に拘束面を指定する操作は、CADモデルを直接対象として、Faceレベルで区分けが出来てさえいれば、ほとんどストレスなく操作できます。強いて言えば、さすがに広い範囲の面を指定すると、負荷になる(待ち時間が長くなる)ようなので、複数面指定の際には、広い大きな面は一番最後に指定する事くらいでしょうか。

また、固有値の計算結果例を以下に掲載しておきます。

範囲を選択_102

 

 

ざっくりとした操作手順

まずは形状データ(入手先はこちら)のインポート。

範囲を選択_078

ワークベンチを切り換えます

範囲を選択_079

モデル②を選択して「解析ケース作成」ボタン③Fem Analysis.svgを押します

範囲を選択_080

デフォルトのままでもメッシュ作成は可能ですが、本例の場合は、①2次要素のチェックマークを外し、②をデフォルトの「中程度」から「細かい」レベルに変更しました(理由は後述)。

範囲を選択_081

約5分ほど待って、メッシュ完成です。

範囲を選択_082

問題なければ「OK」ボタンを押します。

範囲を選択_083

次に、「拘束面作成」ボタンFem ConstraintFixed.svgを押して拘束面を設定します。

範囲を選択_084

3D画面上でマウスを移動すると、選択候補面がベージュ色に変わるので、固定したい拘束面が選択できたらクリック。⇒選択済の部分は赤いピンのようなマークが付与されます。場所を変えて、続いてクリックしていくだけで複数箇所を設定できます。

範囲を選択_085

全部選択できたら、「OK」ボタンを押して完了。この場合は、パンテオン神殿の接地面をすべて固定拘束しています。

範囲を選択_086

続いて、「荷重設定ボタン」Fem ConstraintForce.svgを押して、設定メニューを起動します。

範囲を選択_087

拘束の場合の時と同様ですが、複数面に設定したい場合は、その都度「参照を追加」ボタン①を押す必要があります。また荷重方向は、「方向」ボタン③を押してから、3D画面上で方向に相応するエッジを選択します。

設定が終わったら、「OK」ボタン④を押して完了。

範囲を選択_088

最後に、「材質設定」ボタンFem Material.svgを押して、材料定数の設定メニューを起動します。

範囲を選択_089

「素材」のプルダウンメニューにて・・・

範囲を選択_090

下の図はLinux版の場合。Windows版では、こんなに多くない。

範囲を選択_092

下図には直接見えていませんが、縦スクロールバーにて、最下部にヤング率、ポアソン比、材料密度の具体的な値を確認でき、直接変更も可能です。⇒問題なければ「OK」ボタンを押す。

範囲を選択_093

以上で、解析条件が全て整ったので、「計算実行」ボタンFem NewAnalysis.svgを押します。

範囲を選択_094

まずは「Write .inp file」のボタンを押して、Calculix計算用の入力ファイルを作成します。

範囲を選択_095

入力ファイルが出来上がると、「Edit .inp file」「Calcuilx を実行」ボタンが使えるようになります。

範囲を選択_096

「Calcuilx を実行」ボタンを押した後、この問題では約1分後、計算終了で、下記のようなメッセージが出力されます。

範囲を選択_097

「Close」ボタンを押す。

範囲を選択_098

最後に、「結果表示」ボタンFem Result.svgを押して、計算結果を可視化します。

範囲を選択_099

表示したい変数(変位または応力)を選択するだけです。

範囲を選択_100

 

 

FEMツールバー

FreeCADのヴァージョンアップに伴って、FEMツールバーも大きく変わりました。

  • Ver-0.15

範囲を選択_103

  • Ver-0.16

範囲を選択_104

追加されたボタンは、いくつかありますが、

  • Fem ConstraintPressure.png 圧力を設定
  • 範囲を選択_105 強制変位を設定

あたりは、すぐにでも使えそうなボタン。但し、強制変位指定は少し怪しい。

その他、

  • Fem BeamSection.svgビーム要素設定
  • Fem ShellThickness.svgシェル要素設定

や、また、従前からの謎のツールボタン

  • Fem ConstraintBearing.svgベアリング拘束
  • Fem ConstraintGear.svgギア拘束
  • Fem ConstraintPulley.svgプーリー拘束

などあって、どうやって使うのか・・・今後の調査がお楽しみ・・・です。

 

とは言え、

課題もいくつか

ありそうなので、以下に記しておきます。

  • 計算結果の再読み込みは出来るのか?

計算の終わったモデルをファイル保存して、FreeCADを終了。FreeCADを再立ちあげして上記モデルを読み込むと・・・メッシュや拘束条件、結果はモデルツリー上に残っているが、FEMツールバーが有効にならず、結果を表示出来ない?!

範囲を選択_106

MexhanicalAnalysisのタグを選択してマウス右クリックすると・・・

範囲を選択_107

Activate analysis がありました! ⇒ これにて結果表示がOKとなります。

  • メッシュ作成ダイヤログの疑問

メッシュ作成ダイヤログはデフォルトで、

範囲を選択_109

通常は、上部の3項目(最大サイズの指定、2次精度のチェック有無、細かさ指定)で事足りる。ただNetgenを使った経験上、細かさの程度に応じて、見え消しになっている「増加率」や「・・・セグメント数」が変わったという記憶なんだが、これらの数字が、細かさの程度を変更しても変化しない。メッシュそのものは確かに変わっているので、この数字が連動していないということのようだ。

「細かさ」をユーザー定義にすれば、これらの数字を直接変更できるので、問題があるということではないのだが・・・

範囲を選択_110

  • メッシュ作成の成功/不成功問題

ここに取り上げたパンテオンの問題では、メッシュパラメタによっては、メッシュが出来なくて先へ進めない場合もあれば、メッシュは出来たものの、いざ計算実行するとエラーで止まるという状況もあった。問題は後者で、エラーメッセージは以下のようなもの。

*ERROR in e_c3d: nonpositive jacobian determinant in element 132183

これって、メッシュを作成した時点で検出できないのかしらん?・・・と思ってはみたものの、根っ子は深そうで、FreeCADのフォーラムでも何かと話題になっているようです。⇒解決策があるのかないのか?・・・自分の英語力では理解不能でした。

  • 拘束や荷重条件の表示問題

拘束面には赤い画鋲のようなマーク、荷重面には赤い矢印マークが表示されるが、そのサイズが解析モデルの大きさに対して、なんともアンバランス。

解析モデルとして角柱の片持ち梁を想定、角柱のサイズを変えたらどうなるかを比較表示してみた。

範囲を選択_111

範囲を選択_114

範囲を選択_115

角柱の長さとして、上から順に10,100,1000 mmと変えてみた。

拘束や荷重マークのサイズが一定の大きさになっているわけではないようだが・・・お粗末ですね。

もっともこれらは、Ver-0.15の場合。最新版(Ver-0.16)ではもう少し改善されて、

範囲を選択_112

範囲を選択_113範囲を選択_116

という状況。3つのサイズの順番はVer-0.15で比較したのと同じ。

なんとか、許容レベル・・・かな?

 

パッケージマネージャの使い方

Synapticパッケージマネージャを起動します。

範囲を選択_064

①再読み込みしてから、「ccx」にて②クイック検索し、表示されたccxを③選択、マウスボタンを右クリックで、④インストール指定を選択。

範囲を選択_072

関連パッケージも併せて追加

範囲を選択_073

「適用」ボタンを押す

範囲を選択_074

範囲を選択_075

範囲を選択_076

ccxが緑色になってくれれば、めでたくインストール完了。

範囲を選択_077

また、DEXCS2015 for OpenFOAM(R)に搭載したFreeCADもそのままではヴァージョンが古くて使い物になりません。これもパッケージの最新版を再インストールが可能でした。

範囲を選択_067

何故か、「再インストール指定」のメニューは有効になってくれなかったので、まずは「削除指定」です。

範囲を選択_068

削除出来たら、今度は「インストール指定」

範囲を選択_069

範囲を選択_070

範囲を選択_071

FreeCADの起動はこれまで通り

範囲を選択_065

ヴァージョンの確認

範囲を選択_066