end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

FreeCAD Assembly 4 workbench documentの deepl翻訳

先日のa2plusのdocumentを翻訳し、使用してみましたが、 a2plusでは角柱の中心線を基準としたアセンブルができないようです。

なので、今回、Assembly4のdocumentを翻訳。

参考url

はじめに

Assembly4は、1つのファイルまたは複数ドキュメントにある異なるボディの アセンブルの為に使用される外部ワークベンチです。 これは、Assembly3の新機能(App Linkオブジェクトや新しい式エンジンなど)を利用するため、 v0.19の開発サイクルで作成されました。

真の制約ソルバーは必要なく、 「ボディに付属する異なるローカル座標系間の関係確立にはエクスプレッション・エンジンで十分」 という考えで開発されました。 そのため、プロトタイプ名は「Assembly without solver(ソルバーなしのアセンブリ)」 つまりAWSとなりました。

インストール

Assembly4はアドオンマネージャーからインストールできます。

互換性

Assembly4はAssembly3で作られた新しいツール、特にApp Linkオブジェクトと 改良されたエクスプレッションエンジンから開発されました。

Assembly4はA2plusとAssembly3にインスパイアされたものですが、互換性はありません。 これら2つのワークベンチで作られた古いモデルをお持ちの場合、 それらのワークベンチを使ってモデルを開くようにしてください。

リンク

チュートリアル

FreeCAD A2PLUSのPlane on Plane拘束におけるoffset

2つの面を選択した状態で 「PlainCoincident制約」ボタンのクリックにより 表示されるダイアログでオフセット量を指定できますが、 FreeCADの再描画機能の影響でしょうか、 画面上ではオフセットされていることが分かりづらい印象

一度、Plane on Plane制約を設定した後でも、 以下のように「制約編集」ボタンからオフセット量を変更できます。

FreeCAD + python による 部品形状の同一性判定

https://wiki.freecad.org/TopoShape_API

上記にあるfreecadのdocumentによれば、 部品形状の同一性判定には、isSame()、isEqual()、isPartner()の メソッドがあるようですが、 私の環境?ではなぜか False ばかりになってしまいます。

なので、以下のように自作

#!/usr/bin/python
# -*- coding: utf-8 -*-
import FreeCAD

tolerance = 0.0005 # 許容差

def main():
    doc  = FreeCAD.ActiveDocument
    objs = doc.findObjects('Part::FeaturePython')
    chk_result = is_same_shape(objs[0], objs[1] )
    print( "is_same_shape()=",chk_result )

def is_same_shape(obj_1,obj_2):
    # 元のobjectを壊さない様、copy
    shp_1 = obj_1.Shape.copy()
    shp_2 = obj_2.Shape.copy()
     
    # 体積と表面積を比較
    for (val_1,val_2) in [(shp_1.Volume,shp_2.Volume),
                          (shp_1.Area,  shp_2.Area  )]:
         if abs(val_1 - val_2) > tolerance:
              return False
         
    # boundary boxの中心を原点へ移動
    move_to_origin(shp_1)
    move_to_origin(shp_2)

    # 同じ向きに回転
    rot_same_dir(shp_1, shp_2)

    # 互いをboolean減算し、差がなければ、同一形状と判定
    ret_obj = shp_1.cut(shp_2 )
    if ret_obj.Volume < tolerance:
         return True
    return False

def rot_same_dir(shp_1, shp_2):

    x_1 = shp_1.CenterOfMass.x
    y_1 = shp_1.CenterOfMass.y
    z_1 = shp_1.CenterOfMass.z
    x_2 = shp_2.CenterOfMass.x
    y_2 = shp_2.CenterOfMass.y
    z_2 = shp_2.CenterOfMass.z
    # 回転角算出。が、判定式は怪しい。TODO
    pitch = 0
    if abs(z_1 - z_2) < tolerance:
        pitch = 0
    elif abs(z_1 + z_2) < tolerance:
        pitch = 180
    elif abs(z_1 + x_2) < tolerance:
        pitch = 90
    elif abs(z_1 - x_2) < tolerance:
        pitch = -90
    yaw = 0
    if abs(x_1 - x_2) < tolerance:
        yaw = 0
    elif abs(x_1 + x_2) < tolerance:
        yaw = 180
    elif abs(x_1 + y_2) < tolerance:
        yaw = 180
    elif abs(x_1 - y_2) < tolerance:
        yaw = 180

    # https://blog.freecad.org/2023/01/16/the-rotation-api-in-freecad/
    shp_2.Placement = App.Placement(shp_2.Placement.Base,
                                    App.Rotation(yaw, pitch, 0),
                                    shp_2.Placement.Base.negative())

def move_to_origin(shp):
    shp.Placement = App.Placement(App.Vector(0,0,0),
                                  App.Rotation(App.Vector(1,0,0),0))
    shp.Placement = App.Placement(shp.BoundBox.Center.negative(),
                                  App.Rotation(App.Vector(1,0,0),0))
    return shp

if __name__ == '__main__':
    main()

↑こう書くと、以下のようにA2PLUSでアセンブルしたパーツに対し、True が返ります

FreeCAD Documentation - A2plus Workbench の deepl和訳

FreeCADでのパーツ組立(アセンブリ)には A2plus や Assembly4 のアドオンがあります。

インターネットで検索すると、 座標指定で組み立てる Assembly4 の情報の方が多いようですが、 A2plusの方が初心者には操作が簡単なようですので、今回はA2plus。

しかし、私にも理解できるレベルのA2plusに関する情報がなく 公式?の A2plus Workbench - FreeCAD Documentation も 日本語の情報はありません。

なので、deeplの助けを借り、公式ドキュメントである A2plus Workbench - FreeCAD Documentation を以下に和訳してみました。

目次

参考url

wiki.freecad.org

はじめに

A2plusは、FreeCADでさまざまなパーツを組み立てるための外部ワークベンチです。

このドキュメントは、A2plusバージョン0.4.56以降について説明しています。

インストール

A2plusワークベンチはFreeCADのアドオンです。 メニューにあるツール → Addon managerからアドオン・マネージャーで 簡単にインストールできます。 A2plusは活発に開発されており、頻繁に新機能が追加されます。 そのため、アドオン・マネージャーを使用し、定期的に更新する必要があります。 A2plusのコードはGitHubで管理・開発されていますので、 FreeCADのModディレクトリにコピーし手動インストールもできます。

スタート

まず、FreeCADのA2plusツールバーに切り替ます。 アセンブリ作成は最初にFreeCADで新規ファイルを作成し、保存する必要があります。 この際、アセンブリしたい部品と同じフォルダへの保存をお勧めします。

ツールバー ボタンまたは ボタンで 部品をアセンブリに追加できます。 ボタンは、 選択したファイル内のすべてのボディを1つの部品として追加します。 ボタンは、ファイルからどのパーツをインポートするかを選択できます。 こうすることで、例えばスケッチだけをインポートして、 そのスケッチを使ってパーツの位置を決定し、さらにパーツを組み立てることができます。

最初に追加されるパーツは、デフォルトで固定位置になります。 (後からパーツプロパティDatafixed Positionで変更もできます)。

既にアセンブリ内にあるパーツは、ツールバーボタン で複製できます。

アセンブリ内のパーツ編集はモデルツリーでパーツを選択し、 ツールバーボタン でできます。 この操作により、FreeCADの新しいタブで部品が開かれるか、 ファイルがすでに開かれている場合はそのタブに切り替わります。

アセンブリ内で変更された部品の更新にはツールバーボタン をクリックします。 ツールバーボタン は部品をインポートしますが、サブアセンブリ再帰的にインポートします。 FreeCADのツリービューで1つまたはいくつかの部品を選択すると、 A2plusは選択された部品のみを更新するように要求します。

インポートされた部品は外部依存を保持し、編集することができます。 しかし、ネジのように明確に定義された部品の場合、形状を編集できない方が便利です。 これは、選択した部品を元の部品の静的コピーに変換するツールバーボタン で可能です。

アセンブリを保存し、その後閉じるには、ツールバーボタン を使用します。

ツールバーボタン で、複数エッジや面などの選択方法を切り替えできます。 (シングルクリック選択、または、Ctrlキー+クリック選択)

組み立て

パーツの組み立ては、パーツ間に制約を追加することで行われます。 A2plusは、制約を加えると、可能であればその制約に従ってパーツを移動させます。

部品間に拘束を作成するには、 Ctrlキーを押しながら、2つの部品の辺または面をそれぞれ選択します。 次に、希望する拘束のツールバーボタンをクリックします。 Constraintsセクションで説明するダイアログがポップアップします。 制約は、影響を受ける部品に接続されたモデルツリーに追加されます。

部品間の複雑な制約では、A2plusは制約を解決できないかもしれません。 そのような場合の解決策については、「トラブルシューティング」を参照してください。

ラッキング

パーツの数が増えれば増えるほど、パーツを把握することが重要になります。 そこでA2plusでは、パーツを移動したり確認したりするためのツールを用意しています。

アセンブリ内でパーツを移動するには、モデル・ツリーでパーツを選択し、 ツールバー ボタンを使用します。 部品を好きな場所に配置したら、マウスを左クリックします。 移動した部品にすでに制約がある場合、ツールバーボタン を押すと、 アセンブリのすべての制約を解決するトリガーになるので、それに従って配置されます。

〇制約を表示するには、モデル・ツリーでコンストレイントを選択し、 ツールバー ボタンを使用します。 これにより、アセンブリ全体が透明になり、 コンストレイントを介して接続されている2つのオブジェクトがハイライトされます。 通常の表示に戻るには、アセンブリを左クリックします。

アセンブリの特定のパーツだけを表示するには、モデル・ツリーでそれらのパーツを選択し、 ツールバー ボタンを使います。 また、モデル・ツリーで特定のパーツを選択し、Spaceキーを押して表示/非表示を切り替えることもできます。

アセンブリ全体の透明度表示を切り替えるには、ツールバーのボタン

〇すべての部品は、FreeCADの通常の編集を使用して透明にすることができます。 しかし、FreeCADのバグにより、 アセンブリを再度開いたときに部品の透明度設定が失われることがあります。 回避策として、ツールバーボタン を使用して透明度設定を復元することができます。

制約

制約を作成する際、制約ツールバーボタンを押すと、次のダイアログが表示されます。

特定の制約では、制約の方向を変更できます。

Solveボタンで、 新しい制約がA2plusで解けるかを事前チェックできます。 解けない場合、「トラブルシューティング」をご覧ください。

制約は、可視性を変更することで無効にできます。 これは、ツリービューで制約を選択し、Spaceを押すことによって行われます。 これにより、DataSuppressedプロパティが切り替わり、 無効にされた制約は、アセンブリが解かれる際に考慮されません。

A2plusには以下のような制約があります。

Point on Point

各パーツの頂点(点)、円、球のいずれかを選択してください。 この際、円または球が選択された場合、その中心点が拘束に使用されます。 次にツールバー ボタンで、頂点を一致させるpointIdentity拘束を追加できます。

Point on Line

一方のパーツの頂点(点)、円形エッジ(中心点選択)、球面(中心点選択)を選択し、 もう一方のパーツのエッジを選択します。 次にツールバー ボタンで、pointOnLine制約を追加できまう。これで頂点を辺に置けます。

Point on Plane

一方のパーツの頂点(点)、円形エッジ(中心点選択)、球面(中心点選択)を選択し、 もう一方のパーツの平面を選択します。 次にツールバー ボタンで、pointOnPlane制約を追加できます。 拘束ダイアログでは、点と平面間のオフセット指定や、 オフセットの平面の両側での反転もできます。 オフセット=0の場合、頂点を平面に置きます。

Sphere on Sphere

両方のパーツの球面か頂点(点)を選択し、 ツールバー ボタンでsphereCenterIdent制約を追加できます。 これで球の中心、球と頂点の中心、または頂点を一致できます。

Circular Edge on Circular Edge

両方のパーツの円形エッジを選択し、ツールバー ボタンで、circularEdge制約を追加できます。 拘束ダイアログでは、エッジ間のオフセットや、 オフセットの反転、拘束方向、パーツ回転ロックを指定できます。 オフセット=0の場合、辺を同じ平面の同心に配置します。

Axis Coincident

両方のパーツの円筒面または直線エッジのいずれかを選択し、 ツールバー ボタンでaxisCoincident制約を追加できます。 拘束ダイアログでは、軸の方向や、部品の回転ロックを指定できます。 この拘束では軸または線を一致させます。

Axis Parallel

両方のパーツの円筒面または直線エッジのいずれかを選択し、 ツールバー ボタンで、axisParallel制約を追加できます。 拘束ダイアログでは軸の方向を指定できます。 この拘束は軸または線を平行にします。

Axis on Plane parallel

一方のパーツで円筒面または直線エッジを選択し、もう一方のパーツで平面を選択します。 その後、ツールバー ボタンで、axisPlaneParallel制約を追加できます。 この拘束は、軸または線を平面に平行にします。

Axis on Plane normal

一方のパーツの円筒面または直線エッジを選択し、もう一方のパーツの平面を選択します。 次にツールバー ボタンで、axisPlaneNormal制約を追加できます。 この拘束は、軸または線を平面の法線にします。

Axis on Plane angle

一方のパーツの円筒面または直線エッジを選択し、もう一方のパーツの平面を選択します。 次にツールバー ボタンで、axisPlaneAngle拘束を追加できます。 この拘束は最初に軸を平面に平行にし、 その後、現れる拘束設定ダイアログで軸の角度を調整できます。

Plane Parallel

両方のパーツの平面を選択し、ツールバー ボタンで、planesParallel制約を追加できます。 制約ダイアログでは、制約の方向を指定できます。 この拘束により平面を平行にできます。

Plane on Plane

両方のパーツの平面を選択し、ツールバー ボタンで、planeCoincident制約を追加できます。 拘束ダイアログでは、拘束方向と平面間オフセットを指定できます。 このオフセットは反転することもできますし、オフセット=0の場合、平面を一致できます。

Plane Angular

両方のパーツの平面を選択し、ツールバー ボタンで、angledPlanes制約を追加できます。 制約ダイアログでは、平面の間の角度を指定できます。 この拘束は、平面を平行にし、更に角度の指定も可能です。

Coincidence at Center of Mass

両方のパーツの閉じた辺か平面を選択し、 ツールバー ボタンでcenterOfMass制約を追加できます。 拘束ダイアログでは、辺または平面間のオフセットや、 オフセットの反転、拘束の方向、パーツ回転のロックを指定できます。 オフセット=0の場合、拘束は辺または平面を同じ平面に配置します。

サブアセンブリ

アセンブリは他のアセンブリを含むことができます。 ツールバーボタン から、アセンブリを含む「*.FCStd」ファイルを選択することで、 パーツと同様に追加されます。 このサブアセンブリは、ツールバーボタン で部品のように編集もできます。 上位のアセンブリで変更があった際、ツールバー・ボタン でサブアセンブリ再帰的に更新するようにしてください。

制約処理

選択範囲に可能な制約は、対応するボタンを有効にすることで、 ツールバーと制約ツールダイアログに表示されます。 制約ツールダイアログは、ツールバーボタン から開きます。 このダイアログは、アセンブリにいくつかの制約を素早く追加するために 開いておくことを意図しています。

既存の制約を編集するには、モデルツリーで制約を選択し、 ダブルクリックするか、ツールバーボタン を使用します。 これにより、制約プロパティダイアログが開きます。

モデルツリーで制約を選択し、 ツリー要素のプロパティ DataSuppressed を変更することで、 制約を一時的に抑制することができます。

制約を削除するには、モデル・ツリーで制約を選択して Del キーを押すか、 モデル・ツリーで制約のあるパーツを選択してツールバー ボタンを使用します。

すべての制約は、ツールバーボタン でいつでも解決できます。 ツールバーボタン がオンの場合、解決は、制約を編集するたびに自動的に行われます。

ツールバーボタン は、最も最近追加された制約に影響します。 それは、制約の方向を反転させます。

この ツールで、既存の制約を表示したり、検査したりすることができます。 クリックすると、ダイアログがポップアップします。 そして、ツリーで部品を選択して、この部品のすべての制約を得るために、 「Import from part」ボタンをクリックするか、ツリーで1つ以上の制約を選択して、 「Import from Tree」ボタンをクリックします。 その結果、制約に関するすべての情報が得られます。 Suppress列をクリックすると、1つの制約を抑制することができます。 より多くの機能については、他のダイアログ・ボタンのツールチップに従ってください。

パーツリスト

アセンブリのパーツリストを作成するには、 アセンブリのさまざまなパーツがA2plusで読み取れるパーツ情報を取得する必要があります。 これは、ツールバーボタン を使用して部品を編集することによって行われます。 開いたパーツでツールバーボタン を押すと、#PARTINFO#という名前のスプレッドシートが作成されます。

スプレッドシートの構成は以下の通りです。

グレーのフィールドに対し、最終的なパーツリストに必要な情報を入力してください。

アセンブリまたはサブアセンブリツールバーボタン を使用します。 すべてのサブアセンブリ再帰的に反復するかどうか尋ねられます。 Yesをクリックしてください。 これにより、#PARTSLIST#という名前の新しいスプレッドシートが作成されます。

PARTSLIST#という名前の新しいスプレッドシートが作成され、

PARTSINFO#スプレッドシートから取得した部品の情報がこのようなリストで表示されます:

位置(POS)は、モデルツリー内のパーツの外観に応じて自動的に設定されます。 最上位のパーツは POS 1 になります。

数量(QTY)はアセンブリから自動的に計算されます。 部品がアセンブリ内に2つある場合は、QTY 2になります。

部品情報を更新した場合、ツールバーボタン をもう一度押すと、 部品リストを更新することができます。

サブアセンブリの場合、ツールバーボタン を使用して 情報スプレッドシートを作成することもできます。 メイン・アセンブリのパーツ・リストを作成または更新する際、 すべてのサブ・アセンブリ再帰的に反復するかどうかの質問でNoをクリックすると、 この情報が使用されます。 この場合、異なるパーツはパーツリストには表示されず、サブアセンブリのみに表示されます。

特別な機能

組立構造

ツールバーボタン は、アセンブリの構造を持つ HTML ファイルを作成します。 次のような構造のファイルがデフォルトでアセンブリファイルのフォルダに作成されます。

自由度

このボタン は、アセンブリのすべてのパーツにその自由度を表示します。 さらに、すべての部品とその依存関係のリストを出力します。 リストはFreeCADのウィジェットReportビューに出力されます。 このウィジェットが表示されていない場合は、 FreeCADのツールバーエリアの何もないところで右クリックし、 表示されるコンテキストメニューから選択するか、 表示→パネル→レポートビューメニューで表示できます。

自由度ラベルは ボタンをもう一度クリックすることで削除できます。

パーツラベル

このボタン は、3Dビューのアセンブリのすべてのパーツにその名前をラベル付けします。 再度ボタン をクリックすると、パーツラベルを削除できます。

アセンブリ全体の形状

アセンブリ全体を1つの結合された形状にする必要がある場合があります。 この結合形状は、例えばメッシュワークベンチでの3Dプリントや TechDrawワークベンチでの図面に使用できます。 この結合形状は、ツールバー で作成できますが、デフォルトで形状は表示されません。 アセンブリに変更があった場合、同じボタンで形状を更新してください。

絶対パス相対パスに変換

メニューバーの「A2plus」→「Misc」→ 絶対パス相対パスへ変換」で、 インポートした部品の絶対パス相対パスに変換できます。

設定

a2plusの環境設定は、 FreeCADのメニュー編集→環境設定からA2plusのセクションにアクセスできます。 以下のオプションを設定できます。

デフォルトの解法

Use solving of partial systems

ソルバーは、プロパティDatafixed Positionがtrueに設定されたパートと、 それに拘束されたパートから始まります。他のすべてのパーツは計算されない。 解が見つかれば、次の拘束されたパートが計算に追加され、以下同様である。

「マグネット」ソルバーで、全パーツを一度に解く

ソルバーは、プロパティDatafixed Positionがtrueに設定されているパーツに対して、 すべてのパーツを一度に移動させようとする。 ほとんどの場合、解の計算に時間がかかることに注意してください。

強制固定位置

これは、アセンブリ内のすべてのパーツに対して、 プロパティDatafixed Positionをtrueに設定します。 すべてのパーツは常に作成された位置に固定されるため、実際には計算は行われません。

ソルバーのデフォルト動作

制約プロパティが変更された場合に自動的に解決する

ソルバーが自動的に起動します。 ツールバーボタン のオンと同じです。

インポートした部品を更新する際の動作

インポートした部品を更新する前に再計算する

サブアセンブリを含むアセンブリのすべての部品は、 スプレッドシートからの値を使用して再構築するためにFreeCADで開かれます。 この機能は完全にパラメトリックに構築するように設計されています。

注意:この機能は非常に実験的で、重要プロジェクトにはお勧めできません。

既知の問題

〇部品のトポロジー名参照が間違っていて、アセンブリが破壊されることがある。

〇参照部品ファイルが閉じられている状態で編集すると、 マスタースプレッドシートが壊れることがある。 これは FreeCAD をクラッシュさせる可能性があります。

インポートされた部品の再帰的更新を有効にする

すべてのサブアセンブリ再帰的に開いて更新する。

実験的なトポロジカル・ネーミングを使用

パーツをアセンブリにインポートする際、 アルゴリズムはインポートされた形状の各サブエレメントのトポロジカル名を生成します。 トポロジカル名はDatamux Infoに書き込まれます。 インポートされた部品を更新する必要がある場合、 これらのトポロジカル名は、制約のサブ要素を更新するために使用されます。 そのため、アセンブリはFreeCADの不安定なサブ要素番号に対してより堅牢になります。

注意:

これにより、ファイルサイズが大きくなり、部品のインポート時の計算時間が長くなります。 トポロジカルネーミングを使用する場合は、アセンブリを作成する前に有効にする必要があります。

パーツやサブアセンブリから面ごとの透明性を継承する

インポートしたパーツの色と透明度の設定を使用します。

注:この機能は非常に実験的なもので、重要なプロジェクトにはお勧めできません。

不可視図形をインポートしない

これにより、見えないデータム/コンストラクションシェイプが非表示になります。

注意:上位のサブアセンブリや他のサブアセンブリのデータム/コンストラクション形状に 制約を接続してはいけません。そうしないと、アセンブリが壊れてしまいます。

部品とサブアセンブリのインポートには、ソリッドユニオンを使用します。

インポートされたすべてのパーツは、直接ユニオンとしてまとめられます。 この機能は、FEMシミュレーションや3Dプリントで1つのソリッドしか使用できない場合に便利です。 後でアセンブリ全体の形状を作成することもできます。

ユーザーインターフェースの設定

ツールバーに制約を表示する

このオプションを使用しない場合、ツールバーのスペースを節約するために、 さまざまな制約のツールバーボタンは表示されません。 新しい制約は、制約ツールダイアログを使って設定できます。

OSのネイティブファイルマネージャーを使用する

このオプションを使用すると、アセンブリのファイルを選択するときに、 OSのファイルダイアログが表示されます。

ファイルの保管

インポートされた部品に相対パスを使用する

パートファイルへの相対ファイルパスを使用します。

インポート部品に絶対パスを使用する

パートファイルへの絶対ファイルパスを使用します。

すべてのファイルはこのプロジェクトフォルダにある

すべてのプロジェクトファイルは指定されたフォルダになければなりません。 このフォルダのサブフォルダにあっても問題ありません。

注意:フォルダ内にファイルが複数存在することは許されません(異なるサブフォルダなど)。

このオプションは、プロジェクトフォルダーをコピーするだけでよいので、 異なるマシンで作業する場合に便利です。

トラブルシューティング

A2plusが設定した制約を解くことができないという問題に直面すると思います。 これを解消するために、さまざまな戦略があります:

コンフリクトファインダーツールの使用

このツールは、競合する制約を見つけるまで、次々に制約を解決しようとするので、 複数の制約がある場合、これが最も安全な方法です。 そして、特定された制約を解決するために、他の戦略をとることができます。 このツールは、ツールバーボタンです。

制約の方向のチェック

制約が一貫して定義されているように見えても、解決できないことがあります。

例えば、2つの平面にplanesParallel制約が設定されているとします。 同じ平面にplaneCoincident制約を設定したい場合、A2plusはこれを解くことができません。 その場合、planesParallelとplanesCoincidentの制約方向は異なります。 これを解決するには、両方の制約に同じ方向を使用します。

A2plusは、ツールバーボタン を使用して、 アセンブリのすべての制約の正しい方向を自動的にチェックします。

制約の削除

解けない制約のほとんどのケースは、新しい制約を追加するときに直接発生します。 解決策は、最後に追加した制約を削除することで、A2plusもこれを提案します。

例えば、FreeCADで部品を編集して、制約に接続された面や辺がなくなった場合などです。 その場合、変更された部品に接続されている制約を一度に1つ削除する必要があります。 削除するたびにツールバーのボタン を使って、解ける状態になったかどうかを確認してください。

解けるアセンブリができたら、必要な制約を段階的に追加していきます。

パーツの移動

場合によっては、ソルバーが制約を解くために必要なのは、より良い開始値だけです。 例えば、車軸部品と車輪部品がある場合です。 axisCoincident制約を追加し、ソルバーが失敗したという情報は得られませんが、 部品はそれに応じて移動されず、 FreeCADのレポートビューウィジェットで「REACHED POS-ACCURACY :0.0」と表示されます。 これを解決するには、制約によって得たい位置に部品を近づけることです。

注意: 制約の少なくとも1つの部品は、 プロパティDatafixed Positionがfalseに設定されていることを確認してください。

チッププロパティの設定

A2plusアセンブリにインポートした後、 部品の一部のフィーチャーを見逃した場合は、DataTipプロパティを確認してください。

A2plusは、先端フィーチャーまでのすべてのフィーチャーを持つ部品本体をインポートします。 これは、先端を特定のフィーチャーに設定することは、 先端より後ろのすべてのフィーチャーが最終的な部品に表示されないことを意味するため、 理にかなっています。 したがって、A2plusで部品のフィーチャーを見逃した場合、 ツールバーのボタン で部品を開き、ボディを選択してそのプロパティDataTipを見てください。 ヒントが必要なフィーチャーにない場合は、 ヒントがあるべきフィーチャーを右クリックし、Set tip を選択します。 最後にパーツを保存し、ツールバーボタン を使ってアセンブリをリロードします。

アセンブリツリーの修理

いくつかの制約が解決できない明確な理由がわからない場合は、 ツールバーの ボタン を使ってみてください。 これは、すべての制約を解決し、異なるパーツの下に再びグループ化します。

古いA2plusアセンブリの移行

2019年3月以前のA2plusで作成されたアセンブリは、 インポートされたパーツのアイコンが正しく表示されず、 プロパティが旧式になっています。 これらのアセンブリは、メニュー A2plus → Misc → Migrate proxies of imported parts を使用して、A2plus バージョン 0.4.35 以降に移行できます。 この作業を行った後、アセンブリファイルを保存し、再度開く必要があります。

アクセント記号を避ける

windowsでは、この戦略は必要ありません。

オペレーティング・システムによっては、 部品やアセンブリのファイル名やファイル・パスにアクセント記号付きの文字が含まれていると、 問題が発生することがあります。 そのため、そのような文字や特殊文字全般は避けてください。

位置の固定

A2plus 0.3.11以降で作成されたアセンブリでは、固定位置が見つからない場合に 警告が表示されるようになったため、この方法は必要なくなりました。

2つのパーツ間に拘束を設定したときに、 どのパーツにも Datafixed Position プロパティが true に設定されていないか、 または Datafixed Position が true に設定されているパーツに拘束によって 接続されていない場合、拘束を解くことができません。 制約の両方のパートにDatafixed Positionがtrueに設定されている場合も同様です。

その後、A2plusは失敗したソリューションの情報を出力しますが、 パーツが移動していないことだけが表示され、 FreeCADのレポートビューウィジェットには「REACHED POS-ACCURACY :0.0」と 表示されることがあります。 これは、ソルバーがエラーなしで終了したが、 実際には制約を解けなかったことを意味します。

したがって、アセンブリ内の少なくとも1つの部品がDatafixed Positionを trueに設定していることを確認してください。 そして、固定部品に何らかの形で接続されている部品にのみ 制約を設定することを確認してください。 これらの依存関係を視覚化するには、アセンブリ構造セクションを参照してください。

回転部品

A2plus 0.4.0以降で作成されたアセンブリでは、 ソルバーが十分な開始角度を得るために、 A2plusがバックグラウンドでパーツを自動的に少し回転させるようになったため、 この戦略は必要なくなりました。

選択された2つの平面の角度が0°または180°の場合、 anglePlanes制約でソルバーが失敗することがありました。 (部品はそれに応じて移動されず、FreeCADのレポートビューウィジェットで "REACHED POS-ACCURACY :0.0 "と表示されます)。 これを解決するには、FreeCADの変形機能(モデルツリーで部品を右クリックし、 コンテキストメニューの変形を選択)を使って1つの部品を数度回転させます。

注意: 制約の少なくとも1つの部品は、 プロパティDatafixed Positionがfalseに設定されていることを確認してください。

アニメーション

A2plusでは、ドラッグ操作とPythonスクリプトによるアニメーションが可能です。

ドラッグ操作

ドラッグ・アニメーションは、アセンブリの一部をドラッグすることで発動する インタラクティブなものです。

このようなアニメーションを作成するには

1 移動または回転をアニメーションさせるパーツを完全に拘束する。

2 ツールバーボタン をクリックすると、ドラッグモードが有効になります。

3 アセンブリの目的のパーツをクリックします。

4 これでマウスを動かすことができ、部品は定義された制約の範囲内でマウスの動きに追従します。

5 ドラッグモードの終了には、アセンブリ内で左クリックか、ESCキーを押してください。

ドラッグアニメーションを試すためのアセンブリの例を示します。

スクリプト

ドラッグ・モードは素晴らしいインタラクティブなアニメーションを提供しますが、 スクリーンキャストやビデオには十分な精度が得られないことがあります。 スクリプトアニメーションの利点は、定義された方法で動きや回転を アニメーション化できることです。 例えば、パーツを前後に10°ずつ正確に回転させることができます。 以下の例では、部品を回転させるアセンブリを使用しています。 これをドラッグモードでアニメートしようとすると、例えばプレゼンテーションで 上司に見せるような前後方向の回転を得るのがいかに難しいかがわかるでしょう。 しかし、インタラクティブなサンプルスクリプトを使えば、これは簡単な作業です。

スクリプト・アニメーションは通常このように動作します:

1 アセンブリは完全に拘束されています。

2 スクリプトは、たとえば部品の位置や回転角度などのパラメータを変更します。

3 パラメータの変更後、アセンブリの制約が解決されます。

4 ステップ2.と3.が繰り返され、アニメーションが生成されます。

配置パラメータの代わりに、2つの平面間の距離を変更することも可能です。

簡単なスクリプトの例

アニメーションをスクリプト化する最も簡単な方法は、 定義された動きに従う非インタラクティブなアニメーションです。

以下はその例です:

まず、アセンブリファイルをダウンロード: A2p_animated-example.FCStd

また、Pythonスクリプトをダウンロード: A2p_animation-example-script.py

スクリプト内で「#」で始まる行は、スクリプトの行が何をするかを説明しています:

アニメーションを実行するためにスクリプトを使用するには、次のことが必要です。

1 FreeCAD でアセンブリファイルを開く。

2 FreeCAD でスクリプトファイルを開く。

3 ツールバーのボタンをクリックしてスクリプト(マクロともいう)を実行する。

4 回転を見るためにアセンブリのタブに変更する。

練習のために、スクリプトの何かを変更してから実行する。例えば、ステップを5に増やします。

これがアニメーション結果の例です:

対話型スクリプトの例

最初のスクリプト例では、 ユーザーからのフィードバックなしでアニメーションを作成する方法を示しました。 ほとんどのアプリケーションでは、アニメーションと対話する必要があります。 例えば、この例で興味深いのは、 駆動ピンがホイールの中央の溝をどのように横切るかを見ることです。 より詳しく見るために、この詳細を同僚や上司に見せるかもしれません。 そのため、インタラクティブなソリューションが必要です。

これには、スライダー付きのカスタムアニメーションダイアログを使用します。 スライダーを動かすことによって回転角度を設定することができ、 興味深い位置で前後に回転することができます。

同じアセンブリファイルを使います: A2p_animated-example.FCStd

またこのPythonスクリプトも使います: A2p_animation-example-script.py。

これは、インタラクティブなアニメーションダイアログを得るのスクリプトです:

スクリプトで定義されたダイアログは次のようになります:

スクリプトコマンド

スクリプトの構文をよりよく理解するために、コマンドの情報をいくつか紹介します:

starWheel.Placement.Rotation.Angle = math.radians(angle)

ここでは、以前にstarWheelとして取得したパーツの配置プロパティ Rotation.Angleを変更します。 このプロパティは角度をラジアンとして取得します。 ライブラリ math の関数 radians() は、角度を度からラジアンに変換します。

Rotation.Angleプロパティは、パーツの現在の配置軸(この例ではX軸)を使用します。 部品をZ軸の周りに回転させるには、(回転コマンドを呼び出す前に) コマンドを使用して回転軸を設定します:

starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)

回転の代わりに、パーツを動かすこともできます。 例えば、車輪のY方向の配置を変更するには、次のようにコマンドを実行します:

starWheel.Placement.Base.y = PositionShift

この場合、可変角度を定義するのではなく、 ループの実行ごとに変更するPositionShiftを定義することになります。

パーツ配置の設定にはさまざまな方法があります。 いくつかはここで文書化されていますが、残念ながら、 可能なすべての配置コマンドのリストは(まだ)ありません。

a2p_solver.solveConstraints(document, useTransaction=False/True)

これはA2plus固有のコマンドです。 以前にドキュメントとして取得したアセンブリアセンブリ制約を解決します。 useTransactionオプションは、 FreeCADがすべての変更を取り消し/やり直しスタックに保存するかどうかを指定します。 大きなアニメーションの場合、falseに設定するとよいです。

FreeCAD Draftにおける Up Grade / Down Grade

にあるアップグレード/ダウングレードとは

によれば

選択object Down Grade後
複数object 2番目以降のobjectの減算結果
boolean object not boolean object
立体 立体を構成する各面
wire (poly line)
wire edge (single line)

らしい

パラメトリック・モデリング or ダイナミック・モデリング とは

FreeCADは「パラメトリックモデリングCAD」らしいが、 そもそも「パラメトリック」「ダイナミック」の定義を知らないのでメモ

Modeling Type 内容
Parametric 拘束条件の積み重ねで形状作成 FreeCAD
Dynamic 立体から引張りや押出し等で形状作成 Blender

らしい

FreeCAD Draft画面のGrid設定

分かりづらいし、忘れると思いますので、メモ

step 1 - 「編集→設定」で設定画面を起動

step 2 - 「喫水」→「グリッドとスナップ」で設定

「Grid」は日本語で「喫水」らしいが、まず、ここで迷います。

また、グリッド表示の各設定項目の内容は以下

グリッド間隔 細線の間隔. 今回 112.5mmに設定
主線の間隔 太線の間隔. 112.5mm x8=900mm毎に太線表示
グリッドサイズ 最大グリッド表示数. 100としてますが、主線倍数の96本を表示

step 3 - 表示確認

グリッドボタンをクリックすることで、グリッドを再表示しますが、 再計算が行われるらしく、少々、固まるっぽい

FreeCADからSTLファイルをexportし、ParaViewで表示

www.youtube.com

上記urlの写経です

step 1 - 中実の部品→面の部品へ ダウングレード

以下のように Draftモードで、中実部品を選択後、 ダウングレードボタンをクリックすると、4つの面部品となります

step 2 - 壁の面部品を結合

再びPartモードへ戻り、2つに分割された面部品を選択し、結合ボタンをクリック。

この際、「非ソリッドが選択されています」ダイアログが表示されますが、 無視して「はい(Y)」をクリック。

step 3 - ファイル→エクスポートでSTLファイル作成

全ての部品を選択した状態で「ファイル→エクスポート」を実行すると、 STLファイルを作成できます

step 4 - ParaViewで表示

作成したSTLファイルを読み込むと、以下のように表示されます

その他、各部品を個別のSTLファイルとし、 別々に読み込むと、以下のように中空のパイプとして表示もできます

FreeCADにおける部品の結合(和集合, Fusion)

以下の赤線で囲んだFusionボタンで行い、 結合された各部品は、左ペインにあるようにFusionの配下に入ります。

「結合」に似たコマンドに青線で囲んだ「接合」もありますが、試していません

FreeCAD ver.0.21.1にある各work benchの役割

使い始めてみたが、各work benchの役割から、さっぱり不明の為、自分なりに整理

参考url

Workbenches/ワークベンチ - FreeCAD Documentation

オレオレ要約

Arch 建築物
Draft 基本的2D
FEM 有限要素法
Inspection 寸法や形状測定 寸法比較
MESH Shape→Mesh変換.OpenFOAMのblockMesh同等?
OpenSCAD 多分 OpenSCADとの相互変換
Part 基本形状の組合せで3Dモデル作成
Part Design Sketcherで輪郭線を描き3Dモデル作成
Path CNCや3Dプリンタへのdata作成
Points stl meshからの点抽出
Reverse Engineering 3Dスキャナの点群をインポートし、3Dモデル作成
Robot 産業用6軸ロボットのsimulation
Sketcher 3Dモデルのベースとなる輪郭線や拘束
Spreadsheet 寸法の変数化. パラメトリック化?
Start 起動画面
Surface 曲面作成
TechDraw 投影図 断面図 詳細図 寸法 DXF
Web ブラウザ? 起動しない気がします
BIM 追加installする建築BIM

OpenFOAM tutorials の incompressible/simpleFoam/pitzDaily

先程のentryの続きとして いきなりOprnFOAM (2) | 株式会社ソフトフローを参考に OpenFOAM tutorials にある incompressible/simpleFoam/pitzDaily を実行

config by bashrc

$ source /usr/lib/openfoam/openfoam2312/etc/bashrc
$ which blockMesh
/usr/lib/openfoam/openfoam2312/platforms/linux64GccDPInt32Opt/bin/blockMesh
$ which simpleFoam
/usr/lib/openfoam/openfoam2312/platforms/linux64GccDPInt32Opt/bin/simpleFoam

copy tutorial files

$ cd ~/tmp
$ cp -r /usr/lib/openfoam/openfoam2312/tutorials/incompressible/simpleFoam/pitzDaily .
$ cd pitzDaily
$ tree
.
|-- 0
|   |-- U
|   |-- epsilon
|   |-- k
|   |-- nuTilda
|   |-- nut
|   |-- omega
|   `-- p
|-- constant
|   |-- transportProperties
|   `-- turbulenceProperties
`-- system
    |-- blockMeshDict
    |-- controlDict
    |-- fvSchemes
    |-- fvSolution
    `-- streamlines

mesh作成

$ pwd
/home/end0tknr/tmp/pitzDaily

$ blockMesh
/*---------------------------------------------------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2312                                  |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
Build  : _c39a0f64-20231220 OPENFOAM=2312 version=2312
Arch   : "LSB;label=32;scalar=64"
Exec   : blockMesh
Date   : Jan 02 2024
Time   : 21:22:28
Host   : a64
PID    : 548
I/O    : uncollated
Case   : /home/end0tknr/tmp/pitzDaily
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster
(fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
Creating block mesh from "system/blockMeshDict"
Creating block edges
No non-planar block faces defined
Creating topology blocks
Creating topology patches - from boundary section
Creating block mesh topology - scaling/transform applied later
Check topology
    Basic statistics
        Number of internal faces : 5
        Number of boundary faces : 20
        Number of defined boundary faces : 20
        Number of undefined boundary faces : 0
    Checking patch -> block consistency
Creating block offsets
Creating merge list (topological search)...

Creating polyMesh from blockMesh
Creating patches
Creating cells
Creating points with scale (0.001 0.001 0.001)
    Block 0 cell size :
        i : 0.00158284 .. 0.000791418
        j : 0.000318841 .. 0.000420268
        k : 0.001 .. 0.001

    Block 1 cell size :
        i : 0.000528387 .. 0.00211355
        j : 0.00112889 .. 0.000360188
        k : 0.001 .. 0.001

    Block 2 cell size :
        i : 0.000528387 .. 0.00211355
        j : 0.000318841 .. 0.000420268
        k : 0.001 .. 0.001

    Block 3 cell size :
        i : 0.0020578 .. 0.00514451
        j : 0.000940741 .. 0.000940741
        k : 0.001 .. 0.001

    Block 4 cell size :
        i : 0.0020466 .. 0.00511651
        j : 0.00112889 .. 0.000257962
        k : 0.001 .. 0.001

No patch pairs to merge

Writing polyMesh with 0 cellZones
----------------
Mesh Information
----------------
  boundingBox: (-0.0206 -0.0254 -0.0005) (0.29 0.0254 0.0005)
  nPoints: 25012
  nCells: 12225
  nFaces: 49180
  nInternalFaces: 24170
----------------
Patches
----------------
  patch 0 (start: 24170 size: 30) name: inlet
  patch 1 (start: 24200 size: 57) name: outlet
  patch 2 (start: 24257 size: 223) name: upperWall
  patch 3 (start: 24480 size: 250) name: lowerWall
  patch 4 (start: 24730 size: 24450) name: frontAndBack

End

simpleFoam ソルバ実行

$ pwd
/home/end0tknr/tmp/pitzDaily

$ simpleFoam
<略>
Time = 281

smoothSolver:  Solving for Ux, Initial residual = 0.000121136, Final residual = 1.17873e-05, No Iterations 5
smoothSolver:  Solving for Uy, Initial residual = 0.000989188, Final residual = 6.88795e-05, No Iterations 6
GAMG:  Solving for p, Initial residual = 0.000787777, Final residual = 6.99625e-05, No Iterations 5
time step continuity errors : sum local = 0.0033408, global = -0.000239685, cumulative = 1.10095
smoothSolver:  Solving for epsilon, Initial residual = 0.000121974, Final residual = 6.91195e-06, No Iterations 3
smoothSolver:  Solving for k, Initial residual = 0.000228394, Final residual = 1.42278e-05, No Iterations 4
ExecutionTime = 3.97 s  ClockTime = 4 s


SIMPLE solution converged in 281 iterations

streamLine streamlines write:
    seeded 10 particles
    Tracks:10
    Total samples:10885
End

ParaViewで表示

$ pwd
/home/end0tknr/tmp/pitzDaily

$ touch pitzDaily.foam

後は先程のentryと同様です

yum install openfoam cfd ver.2312 to OracleLinux8 on WSL2

何度か OpenFOAMを installしたが、 チュートリアル動作までは到達せず。

そんな中、 redhat · Wiki · Development / openfoam · GitLab にて

This information unfortunately no longer applies to CentOS-9/RedHat-9.
The PowerTools repository has been replaced with a CBR repository
with much limited functionality.
In the process, they have removed the metis and scotch
libraries which are essential for domain decomposition!

という記載を見つけましたので、

OracleLinux8 on WSL2 に OpenFOAM CFD版 ver.2312 を yumでinstallすることに

目次

Oracle Linux 関連

install Oracle Linux 8.7

CMD> wsl --install OracleLinux_8_7

Installing, this may take a few minutes...
Please create a default UNIX user account.
The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: end0tknr
Changing password for user end0tknr.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Installation successful!

systemd & sshd の有効化

/etc/wsl.conf を以下の内容で作成後、OracleLinux再起動

$ sudo vi /etc/wsl.conf

[boot]
systemd=true
CMD> wsl --terminate OracleLinux_8_7
CMD> wsl -d OracleLinux_8_7

$ ps -ef
UID   PID  PPID  C STIME TTY  TIME CMD
root    1     0  0 07:16 ?    00:00:00 /sbin/init
root    2     1  0 07:16 ?    00:00:00 /init
<略>
root   30     1  0 07:18 ?    00:00:00 /usr/lib/systemd/systemd-journald
<略>

最後にsystemctlでsshdを有効化

$ sudo systemctl enable sshd
$ sudo systemctl start  sshd

IPアドレスの固定

wsl上のoracle linuxはdefaultでは起動する度にipアドレスが変更され、 sshやsmbでの接続が手間ですので、固定します。

まず、oracle linux側で割当てられているipを確認

$ ip a
<略>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
   mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:f4:52:da brd ff:ff:ff:ff:ff:ff
    inet 172.18.129.236/20 brd 172.18.143.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fef4:52da/64 scope link
       valid_lft forever preferred_lft forever

次に、power shellを管理者モードで起動し、 vEthernet (WSL)の ifIndex を確認した上で、固定ipを設定。

参考url

PS> Get-NetAdapter -IncludeHidden

Name                      InterfaceDescription                    ifIndex <略>
----                      --------------------                    -------   :
ローカル エリア接続* 7    WAN Miniport (PPPOE)                         22 <略>
vEthernet (WSL (Hyper-... Hyper-V Virtual Ethernet Adapter             24 
<略>
vSwitch (WSL (Hyper-V ... Hyper-V Virtual Switch Extension Ada...      10 <略> 
<略>
PS> New-NetIPAddress -IPAddress 172.18.129.236 -PrefixLength 24 -InterfaceIndex 24

IPAddress         : 172.18.129.236
InterfaceIndex    : 24
InterfaceAlias    : vEthernet (WSL (Hyper-V firewall))
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     :
PreferredLifetime :
SkipAsSource      : False
PolicyStore       : ActiveStore

IPアドレス固定の自動化

先程、固定したipはpcの停止時に無効化されますので、 ps1ファイルとタスクスケジューラでip固定の自動化を行います

CMD> vi c:/Users/end0t/local/AddIPAddress.ps1

New-NetIPAddress -IPAddress 172.18.129.236 -PrefixLength 24 -InterfaceIndex 24

プログラムスクリプト powershell.exe
引数の追加 -ExecutionPolicy Bypass c:\Users\end0t\local\AddIPAddress.ps1
開始 空欄

install samba

$ sudo yum install samba
$ sudo systemctl enable smb
$ sudo systemctl start  smb

$ sudo pdbedit -a end0tknr
new password:
retype new password:
Unix username:        end0tknr
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3605739558-1094150744-591740496-1000
Primary Group SID:    S-1-5-21-3605739558-1094150744-591740496-513
Full Name:
Home Directory:       \\A64-WSL\end0tknr
HomeDir Drive:
Logon Script:
Profile Path:         \\A64-WSL\end0tknr\profile
Domain:               A64-WSL
<略>

OracleLinuxの停止

CMD> wsl --terminate OracleLinux_8_7

CMD> wsl --list --verbose
  NAME               STATE           VERSION
* OracleLinux_8_7    Stopped         2

OpenFOAM関連のインストール

参考url

yum install

$ sudo yum install dnf-plugins-core
$ sudo yum config-manager --set-enabled ol8_codeready_builder
$ sudo yum install epel-release

$ sudo dnf copr enable openfoam/openfoam

$ sudo yum install openfoam-selector
$ sudo yum install openfoam2312-default

OpenFOAM付属のcavity(空洞)チュートリアル実行

config by bashrc

$ source /usr/lib/openfoam/openfoam2312/etc/bashrc
$ which blockMesh
/usr/lib/openfoam/openfoam2312/platforms/linux64GccDPInt32Opt/bin/blockMesh

copy tutorial files

$ cd ~/tmp
$ cp -r /usr/lib/openfoam/openfoam2312/tutorials/incompressible/icoFoam/cavity/cavity .
$ cd cavity
$ tree
.
|-- 0
|   |-- U
|   `-- p
|-- constant
|   `-- transportProperties
`-- system
    |-- PDRblockMeshDict
    |-- blockMeshDict
    |-- controlDict
    |-- decomposeParDict
    |-- fvSchemes
    `-- fvSolution

メッシュ作成

$ pwd
/home/end0tknr/tmp/cavity

$ blockMesh
/*---------------------------------------------------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2312                                  |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
Build  : _c39a0f64-20231220 OPENFOAM=2312 version=2312
Arch   : "LSB;label=32;scalar=64"
Exec   : blockMesh
Date   : Jan 02 2024
Time   : 16:15:07
Host   : a64
PID    : 796
I/O    : uncollated
Case   : /home/end0tknr/tmp/cavity
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster
                           (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time

Creating block mesh from "system/blockMeshDict"
Creating block edges
No non-planar block faces defined
Creating topology blocks
Creating topology patches - from boundary section
Creating block mesh topology - scaling/transform applied later

Check topology
    Basic statistics
        Number of internal faces : 0
        Number of boundary faces : 6
        Number of defined boundary faces : 6
        Number of undefined boundary faces : 0
    Checking patch -> block consistency
Creating block offsets
Creating merge list (topological search)...
Creating polyMesh from blockMesh
Creating patches
Creating cells
Creating points with scale (0.1 0.1 0.1)
    Block 0 cell size :
        i : 0.005 .. 0.005
        j : 0.005 .. 0.005
        k : 0.01 .. 0.01
No patch pairs to merge
Writing polyMesh with 0 cellZones
----------------
Mesh Information
----------------
  boundingBox: (0 0 0) (0.1 0.1 0.01)
  nPoints: 882
  nCells: 400
  nFaces: 1640
  nInternalFaces: 760
----------------
Patches
----------------
  patch 0 (start: 760 size: 20) name: movingWall
  patch 1 (start: 780 size: 60) name: fixedWalls
  patch 2 (start: 840 size: 800) name: frontAndBack
End

ソルバ実行

$ pwd
/home/end0tknr/tmp/cavity

$ icoFoam
/*---------------------------------------------------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2312                                  |
|   \\  /    A nd           | Website:  www.openfoam.com                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
Build  : _c39a0f64-20231220 OPENFOAM=2312 version=2312
Arch   : "LSB;label=32;scalar=64"
Exec   : icoFoam
Date   : Jan 02 2024
Time   : 16:17:33
Host   : a64
PID    : 797
I/O    : uncollated
Case   : /home/end0tknr/tmp/cavity
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster
                           (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Create time
Create mesh for time = 0

PISO: Operating solver in PISO mode
Reading transportProperties
Reading field p
Reading field U
Reading/calculating face flux field phi

Starting time loop
Time = 0.005
Courant Number mean: 0 max: 0
smoothSolver:  Solving for Ux, Initial residual = 1, Final residual = 8.90511e-06, No Iterations 19
smoothSolver:  Solving for Uy, Initial residual = 0, Final residual = 0, No Iterations 0
DICPCG:  Solving for p, Initial residual = 1, Final residual = 0.0492854, No Iterations 12
time step continuity errors : sum local = 0.000466513, global = -1.79995e-19, cumulative = -1.79995e-19
DICPCG:  Solving for p, Initial residual = 0.590864, Final residual = 2.65225e-07, No Iterations 35
time step continuity errors : sum local = 2.74685e-09, global = -2.6445e-19, cumulative = -4.44444e-19
ExecutionTime = 0.01 s  ClockTime = 0 s

Time = 0.01
Courant Number mean: 0.0976825 max: 0.585607
smoothSolver:  Solving for Ux, Initial residual = 0.160686, Final residual = 6.83031e-06, No Iterations 19
smoothSolver:  Solving for Uy, Initial residual = 0.260828, Final residual = 9.65939e-06, No Iterations 18
DICPCG:  Solving for p, Initial residual = 0.428925, Final residual = 0.0103739, No Iterations 22
time step continuity errors : sum local = 0.000110788, global = 3.77194e-19, cumulative = -6.72498e-20
DICPCG:  Solving for p, Initial residual = 0.30209, Final residual = 5.26569e-07, No Iterations 33
time step continuity errors : sum local = 6.61987e-09, global = -2.74872e-19, cumulative = -3.42122e-19
ExecutionTime = 0.01 s  ClockTime = 0 s

<略>

Time = 0.495
Courant Number mean: 0.222158 max: 0.852134
smoothSolver:  Solving for Ux, Initial residual = 2.43518e-07, Final residual = 2.43518e-07, No Iterations 0
smoothSolver:  Solving for Uy, Initial residual = 5.33314e-07, Final residual = 5.33314e-07, No Iterations 0
DICPCG:  Solving for p, Initial residual = 5.25763e-07, Final residual = 5.25763e-07, No Iterations 0
time step continuity errors : sum local = 6.11228e-09, global = 1.51821e-18, cumulative = 1.09644e-17
DICPCG:  Solving for p, Initial residual = 7.01015e-07, Final residual = 7.01015e-07, No Iterations 0
time step continuity errors : sum local = 7.5484e-09, global = -4.1723e-19, cumulative = 1.05471e-17
ExecutionTime = 0.06 s  ClockTime = 0 s

Time = 0.5
Courant Number mean: 0.222158 max: 0.852134
smoothSolver:  Solving for Ux, Initial residual = 2.3091e-07, Final residual = 2.3091e-07, No Iterations 0
smoothSolver:  Solving for Uy, Initial residual = 5.0684e-07, Final residual = 5.0684e-07, No Iterations 0
DICPCG:  Solving for p, Initial residual = 8.63844e-07, Final residual = 8.63844e-07, No Iterations 0
time step continuity errors : sum local = 8.8828e-09, global = 4.94571e-19, cumulative = 1.10417e-17
DICPCG:  Solving for p, Initial residual = 9.59103e-07, Final residual = 9.59103e-07, No Iterations 0
time step continuity errors : sum local = 9.66354e-09, global = 1.13175e-18, cumulative = 1.21735e-17
ExecutionTime = 0.06 s  ClockTime = 0 s

End

ParaView表示用file作成

$ pwd
/home/end0tknr/tmp/cavity

$ touch cavity.foam

ParaViewで表示

ParaViewの操作方法は、まだ理解していませんが、 とりあえずの表示は以下のstep

install OpenFOAM CFD to Oracle Linux 9 for wsl2

目次

2種類の OpenFOAM

今回はお試しということもあり、なんとなくCFD版にしています

OpenFOAM URL 説明
Foundation版 https://openfoam.org 本家
CFD版 https://openfoam.com 先進的機能:多

依存ライブラリ

CentOSにOpenFOAM v2006をインストール #C++ - Qiita を参考に以下

$ sudo yum install gcc-c++ bison flex m4 glibc-devel zlib-devel

install OpenFOAM-v2306

installと言っても https://sourceforge.net/projects/openfoam/files/ から ダウンロードし、解凍する程度です

$ mkdir ~/local
$ cd local
$ wget https://sourceforge.net/projects/openfoam/files/v2306/OpenFOAM-v2306.tgz
$ tar -xvf OpenFOAM-v2306.tgz

config OpenFOAM-v2306

$ chmod 755 ~/local/OpenFOAM-v2306/etc/bashrc
$ echo ~/local/OpenFOAM-v2306/etc/bashrc >> ~/.bashrc
$ source ~/.bashrc
Warn: could not determine prefix for system-openmpi

上記のwarningが表示されますので クラウドを利用したCFD環境の構築(OpenFOAMのインストール2 OpenMPI) | doctornovaのブログ を参考に OpenFOAM-v2306/etc/bashrc を変更

$ vi ~/local/OpenFOAM-v2306/etc/bashrc
old #export WM_MPLIB=SYSTEMOPENMPI
new export WM_MPLIB=OPENMPI

$ source ~/.bashrc

install paraview

OpenFOAM の計算結果は、pareviewで表示しますので paraview/README.md を参考に https://www.paraview.org/download/ から インストーラである ParaView-5.9.1-Windows-Python3.8-msvc2017-64bit.exe をダウンロードし、インストール