【Win10】FreeCAD0.19環境を構築してFEMとCFDを実行してみる

FreeCADのWindws10環境でのセットアップ、および非常に簡単なFEMとCFDの利用方法を記録しておきます。

#どうしてFreeCADが必要ですか？

- かつてオープンソースCAD/CFDを触ったが、セットアップすらできなかった
- Fusion360のFEMが有料プランのみになって悩んでいる
- CFDに触れてみたい/試してみたい
- OpenFOAMを利用したい
- モデリング/FEM/CFDを一つのソフトウェアでまとめたい

のどれかに当てはまる方には、FreeCADを触ってみる価値があると思います。
かくいう私も、10年ほど前にフリーのCAD/FEM/CFDを触り、セットアップすら困難、なんとか動かすも数日かけて出た結果は参照できずという経験をして以来避けていました。近年ではFusion360をはじめとした高品質低価格な3D-CADがあり、わざわざあのような苦労をするのはよりいっそう無駄なように思えます。
しかし今回、ふとしたきっかけでFreeCAD触れてみたところ、構築・安定性・UI・拡張性ともに圧倒的な進化を遂げており、Linux環境だけでなくWindowsでも十分に動作するようになっていることを知って認識を改めました。さらに、１つのソフトウェアでモデリングからFEM、CFDまで実行可能という、有償ソフトウェアであれば数百万円かかるような環境さえも、数十分で無料で手に入れることができるのです。

#FreeCADは何ができますか？

FreeCADは開発途上でありながら、すでに基本的な3D-CAD機能を備えています

- ３次元モデリング
- ２次元図面への変換
- メッシング
- FEM
- レンダリング
- アドオンによる強化とアドオンマネージャ
- (アドオン)アセンブリ
- (アドオン)CFD
- Pythonによる自動化

FreeCADは機能ごとにワークベンチという区切りを持っています。たとえば、Sketchワークベンチで2次元的なパスを描くことができ、PartDesignワークベンチでそれを"押し出し"て立体にしたり結合したりし、さらにFEMワークベンチでそれを強度解析する、といったことが可能です。ワークベンチはアドオンで追加可能のため、ほぼ無限の可能性を持ちます。たとえば、Rocket Workbenchというロケットの設計に特化したワークベンチなどもあります。

#FreeCAD0.19セットアップ

https://www.freecadweb.org/?lang=ja

早速FreeCADをインストールします。古代オープンソースソフトウェアのようによくわからないパッケージを事前にインストールするようなことは一切ありません。公式サイトからexeをダウンロードしインストールすれば完了します。
ただし、FreeCAD0.19においても**Windowsのユーザ名やフォルダ名が日本語の場合は動作しない**という点に注意してください。（ユーザ名が日本語のPCで、スプラッシュ画面のあとにウィンドウごと消えて起動しないことを確認しました）

#CfdOFセットアップ

CfdOFはFreeCAD上にCFDワークベンチを追加するアドオンです。CFDはOpenFOAMを利用しますが、OpenFOAM自体が様々なパッケージを必要とするため、その環境構築はそこそこ困難でした。しかしCFDoFはアドオンを介してこれらのパッケージをインストールすることができ、CFD環境の構築すらも容易に完了させることができます。

## CfdOFインストール
まずはCfdOFワークベンチを追加します。
![1a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/144064d5-7642-d94f-275d-eb7af6080710.jpeg)

1. [ツール] → [アドオンマネージャ] → [CfdOF]を選択 → [選択をインストール/更新する]

構築で唯一の壁として、私の環境では「Gitpython is not found」warningが発生し、アドオンマネージャからはCFDoFのインストールができず、マニュアルでインストールしました。といっても、[CfdOFのGithub](https://github.com/jaheyns/CfdOF)からZipでダウンロードして解凍して設置するだけです。

1. (右上)[Code] → [Download ZIP]
1. 解凍したCfdOF-masterフォルダを C:\Users\ユーザ名\Appdata\Roaming\FreeCAD\Macro\Mod\ に配置
2. ※[Macro]フォルダ内部に[Mod]フォルダがまだない場合は[Mod]フォルダを作成する

フォルダ構造がよくわからなければ、他のアドオンをインストールしてみて参考にしてもよいでしょう。

## OpenFOAM等インストール
CfdOFに必要な他のソフトウェアをインストールしていきます。クリックしているだけで完了します。

![1b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/ec8be81b-2164-c7e2-4c00-7f6e591ac758.jpeg)

1. FreeCADを**管理者権限で起動**する（管理者権限ではない場合は後のインストール時に警告が出ます）
1. ワークベンチからCfdOFを選択できるようになっていることを確認する
1. [編集] → [設定] → [CfdOF]
1. [InstallOpenFOAM]でOpenFOAMをインストール
1. [Install Paraview]でParaviewをインストール
1. [Install cfMesh]でchMeshをインストール
1. [Install HiSA]でHiSAをインストール
1. [OpenFOAM install directory]でOpenFOAMをインストールしたフォルダを設定
1. [ParaView executable path]でParaviewのexeを設定
1. [Default output directory]で好きなフォルダを設定
1. [Run dependency checker]でそれぞれが動作するか確認

これで環境が整いました。恐ろしいほどユーザーフレンドリーです。

---

#FreeCADの基本
無事に動いていることを確認するため、とても簡単なモデリング、FEM、CFDを行ってみましょう。
必要であれば[編集]→[設定]からマウスの操作の設定を変更したり、ワークベンチアイコン類の表示行などを調整したり、Pythonコンソールを表示しておくとよいでしょう。

#モデリング
まずは長細い棒を作成してみます。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/80f60529-4691-f4d9-9a60-815fa9bfd8ea.jpeg)

1. ワークベンチ選択から[PartDesign]を選択
2. タスクビューの[ボディーを作成]
3. タスクビューの[新しいスケッチを作成]
4. タスクビューの[XY_Plane(ベース平面)]を選択
5. タスクビューの[OK]

するとSketchモードになります。

##Sketch
まずは長方形を描きます。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/b8d20b57-a9e5-a07c-2bd3-8bdfedc6a274.jpeg)

1. タスクウィンドウの[グリッドを表示]および[グリッドにスナップ]をチェックする（と楽です）
2. 上部ナビゲーションの[四角]アイコンをクリック
3. 座標中心と、好きな点をクリックして四角を作成（ここで長さを気にする必要はありません）

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/f49903b9-7c52-5c3e-6e99-2b0cc22e7730.jpeg)

4. 上部ナビゲーションの[長さの拘束]をクリック
5. 作成した四角の１辺をクリックし、ポップアップ画面に長さ 20mm を入力
6. 作成した四角のもう１辺をクリックし、ポップアップ画面に長さ 500mm を入力
7. [Esc]キーで拘束モードを抜ける
8. タスクビュー最上部の[閉じる]

これで長さが定義された長方形を作成することができました。今回はとりあえず20 x 500mmとしてみました。
モデルビューのツリーで、編集したい[Sketch]をダブルクリックするとSketchモードになり、タスクビューの[閉じる]を押せばPartDesignモードに戻れることに慣れるとよさそうです。

##PartDesign

長方形を立体にしていきます。
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/eb0f7056-185a-aa61-2dbb-d578b4137ff4.jpeg)

1. 上部ナビゲーションバーの[押し出し]をクリック
2. タスクビューの[長さ]に 30mm を入力
3. タスクビューの[OK]

非常に簡単ですが、これで20x30x500mmの棒ができました。
この後FEMおよびCFDを実行するため、この状態で１回ファイルに保存しておきましょう。

#FEM
作成した長細い棒を、集中荷重がかかった１点支持はりとして計算してみます。

###材料を設定します
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/d5731a25-6d7a-1f1b-79f0-036e109f3104.jpeg)

1. ワークベンチ選択から[FEM]ワークベンチに移動する
1. モデルのどこかをダブルクリックして全体を選択状態にする（画像のように黄緑色になります）
1. 上部ナビゲーションバー[A:標準ソルバーのCaululiXを使用して解析のコンテナを作成]をクリック
1. 上部ナビゲーションバー[〇:Create a FEM material for solid]をクリック
1. タスクビューで材料を選ぶ（なんでもよいので今回は6061アルミにしてみました）
1. タスクビューの[OK]

材料選択のプリセットはISO素材なので身近なものがありませんが、自分で物性値を入れても良いでしょう。

###物理的な条件を設定していきます
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/7522bfca-f678-9e85-d7e7-f29c842a6fe7.jpeg)

1. モデルをぐるっとまわして、モデルの端面（固定したいところ）をクリックして選択
1. [Creates a FEM constraint for a fixed geometric entity]をクリックして固定部分を設定
1. モデルをぐるっとまわして、モデルの上辺（力をかけたいところ）をクリック
1. [Creates a FEM constraint for force...]をクリックして荷重の設定をする

###荷重の量と方向の設定をします
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/4d92c38b-a85d-6f77-ad82-798b89f928ff.jpeg)

1. モデルの上面をクリックする
1. タスクビューの[方向]をクリック（矢印が下向きになる）
1. タスクビューの[荷重]に100Nを設定
1. タスクビューの[OK]

力のかけ方の設定では、モデルの面をクリックしてから[方向]を設定することにより、荷重をかける方向をえらぶことができます。動作を理解するまで難しいですが、適当にカチカチしていればすぐにわかると思います。

###メッシュを切っていきます
![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/050d09f9-0d1d-5b2c-a1bf-2a21877f4ee8.jpeg)

1. モデルのどこかをダブルクリックして全体を選択状態にする
1. [Create a FEM mesh...]をクリック（今回はNetganメッシャーを利用しました）
1. とりあえずなのでデフォルト設定で[OK]

メッシュが切れたら茶色い棒になっているはずです

###FEMを実行してみましょう。
![17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/acc562e9-3baa-6d93-06d0-c8f13fd5438f.jpeg)

1. 上部ナビゲーションバー[Solver]をクリック（モデルウィンドウにSolverCcxTools001が作成される）
1. [SolverCcxTools001]をダブルクリック
1. タスクウィンドウの[Static]を選択
1. [Write.inp file]をクリック
1. [Re-run CalculiX]をクリック（数秒で完了）
1. モデルビューのツリーに[CCX Results]が作成される

[static]以外を選択すれば、周波数モード解析や熱応力などの解析も可能なようです。

###結果をみてみましょう
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/aca10517-0779-d23e-1f1e-265cce6d3e19.jpeg)

1. モデルビューツリーの[CCX_Results]をダブルクリック

ラジオボタンによっていろいろな結果をみることができます。また、変位スライダをうごかすことで、ひずみを誇張して表示することができます。最大変位量は1.3mmであり、集中荷重がかかるアルミ材の片持ち梁について手で計算した結果とほぼ一致します。

#CFD
細長い棒を流路と考え、内部に水を流してみましょう。
FEMの結果を捨てて、先ほど作成した棒のモデルのファイルを開き、CFDoFワークベンチに移動します。

###シミュレーションの設定を行います
![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/b3d55e78-82a7-93fb-d26d-5efbc692c425.jpeg)

1. モデルのとこかをダブルクリックして全選択状態にします
1. [A：Create an analysis container...]をクリックします
1. モデルビューの[PhysicsModel]をダブルクリック
1. タスクビューの[Steadly]をチェック（定常流）
1. タスクビューの[Single phase]をチェック（単相流）
1. タスクビューの[Incompressible]をチェック（非圧縮性流体）
1. タスクビューの[Viscous]をチェック（粘性流体）
1. タスクビューの[RANS]でModel[kOmegaSST]を選択（乱流モデルのk-ωモデルを利用します）
1. [OK]

今回はせっかくなので乱流とし、とりあえず非圧縮の粘性流体としてみました。

###流す流体の設定を行います
![24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/83f79d24-8f40-e98d-1397-05c2d3ff4c73.jpeg)

1. モデルビューの[FluidProputies]をダブルクリック
1. タスクビューで[Water]を選択
1. [OK]

空気、水などのプリセットまたは物性値を入力できます。および今回は水にしてみました。

###初期条件の設定を行います
![25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/ada7a5ed-4776-77a7-6f2a-4c4e7e705b0c.jpeg)

1. モデルビューの[InitialFluids]をダブルクリック
1. タスクビューのVelocityの[Potential flow]を選択
1. タスクビューのPressureの[Potential flow]を選択

とりあえずなので両方ともにポテンシャル流を設定しておきます。

###入口の境界の設定を行います
![26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/f0abc2e2-31f3-7e4f-5caf-ed0209eca32e.jpeg)

1. 上部ナビゲーションバーの[Creates a CFD fluid boundary...]をクリック
1. タスクビュー[Inlet]を選択
1. タスクビュー[Uniform velocity]を選択
1. モデルの端面（水を入れたいところ）をクリックで選択してタスクビューの[Add]
1. タスクビューのUxで100 mm/sを入力（X方向に100mm/sの流れが入る）
1. [OK]

片方から一様な流速をもった水が100mm/sで入ってくるようにしてみました。

###出口の境界の設定を行います
![28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/d024a959-7087-5fa5-ba5e-11c4f2e2eda7.jpeg)

1. [Creates a CFD fluid boundary...]をクリック
1. タスクビュー[Outlet]を選択
1. タスクビュー[Static pressure]を選択
1. モデルの反対側の端面（水を出したいところ）を選択して[Add]
1. [OK]

出口は流速も気圧も設定されていない面になります。

###壁面の境界の設定を行います
![30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/78212db0-a8ae-73bb-48d8-034defde2d7e.jpeg)

1. [Creates a CFD fluid boundary...]をクリック
1. タスクビュー[Wall]を選択
1. タスクビュー[No slip]を選択
1. 壁面の４面を選択して[Add]
1. [OK]

すべりなしの壁面を設定しました。

###メッシュを切っていきましょう
![31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/7dc4be0a-815f-0b26-e517-6d4a059e6e46.jpeg)

1. モデルのどこかをダブルクリックしてモデル全体を選択
1. 上部ナビゲーションバー[Create a mesh...]をクリック
1. タスクビュー[Base element size]に 2 mmを入力
1. タスクビューMesh untilityで[cfMesh]を選択
1. タスクビュー[Write mesh case]をクリック
1. タスクビュー[Run mesher]をクリック
1. タスクビュー[ParaView]をクリックしてメッシュを確認
1. タスクビュー[閉じる]

完了するとParaviewでプレビューできます。
メッシャーはGmeshなども実行可能ですが、今回は流速分布が見たいと思ったので、等間隔で四角いcfMeshを選択しました。

###いよいよCFDの実行です
![33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/4c015025-02cb-7b49-d823-d1f10c9380b9.jpeg)

1. モデルビューのツリー[CfdSolver]をダブルクリック
1. タスクビュー[Write]をクリック
1. タスクビュー[Run]をクリック（計算が開始されます）
1. タスクビュー[ParaView]をクリック

[CfdSolver]をクリックした段階で、モデルビュー下部から、イテレーション回数や使用するコア数などを設定できます。
[Run]を実行すると、繰り返し計算した結果のグラフが表示され、収束具合を確認することができます。
終了するとParaviewでプレビューできます。今回は第7世代Corei5のノートPCでしたが、5分程度で完了しました。

![36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278953/1e8648c7-8c34-1f53-e119-81ee62c4ab66.jpeg)

境界層の発達や、乱流の速度分布は一致しているように見える結果が得られました。
（Paraviewの利用方法に慣れていないのでうまく表示できませんが･･･）

#おわりに
「環境構築エントリ書くってことは結局めんどくさいってことだろ！」と思われたかもしれませんが、構築も操作も非常に簡単であることがお分かり頂けたのではないでしょうか。
もちろん、現バージョンは0.19と、ver1.0には遠い状態ではあり、まだ改善が必要な部分もありますが、すでに「使える」段階にあるように感じます。
FreeCADはオープンソースソフトウェアゆえ、ユーザ・コミュニティが増えるほどに価値を増します。開発途上であるため、バージョンごとの迅速な情報共有があれば多くの人が助かるでしょう。少しでも興味を持たれた方は、是非利用を検討して頂ければと思います。