Capytaine: a Python-based distribution of Nemoh https://ancell.in/capytaine/latest/ 訳 今井康貴(imaiy@cc.saga-u.ac.jp) 1. インストール CapytaineはWindows、MacOS [1]、Linuxで利用可能です。 [1] arm64アーキテクチャ(Apple M1)の最新情報については、https://github.com/capytaine/capytaine/issues/190 を参照してください。 CapytaineはPython 3.6以降を必要とします。したがって、現在サポートされているすべてのバージョンのPythonと互換性があります。 1.1 Condaを用いる場合 Capytaineをインストールする最も簡単な方法は、Condaで利用できるプリコンパイルパッケージを用いることです。 1) Anacondaディストリビューション、またはその軽量版であるMinicondaとMiniforgeをダウンロードし、インストールしてください。 2) Condaがインストールされたら、専用の環境を作りたいと思うかもしれません。Capytaineのパッケージはconda-forgeチャンネルで公開されており、以下のコマンドでインストールできます。 conda install -c conda-forge capytaine 必要な依存関係が自動的にインストールさます。 オプションの依存関係 オプションの依存関係は、手動でインストールします。これらはあると便利ですが、Capytaine の主な機能には必要ありません。 名前 インストールコマンドの例 使用方法 matplotlib conda install matplotlib ドキュメントとクックブックのいくつかの例で使用されています。 vtk conda install -c conda-forge vtk 3Dビジュアライゼーションに使用します。 joblib conda install joblib 並列処理に使用します。 quadpy pip install quadpy 高次求積用(実験的) 1.2 Pipを用いたインストール このパッケージはPyPIで入手可能ですが、ソース配布のみです。つまり、パッケージをインストールするためには、Fortranコンパイラ[2]が必要です。もしそうなら、Capytaineを以下のようにインストールできます。 pip install capytaine もし、コンパイラをインストールできない場合は、代わりにCondaを使うことをお勧めします。 [2] 例えば、UbuntuやDebianの場合: sudo apt install gfortran. macOSの場合、例えばこの手順を参照してください。 https://github.com/capytaine/capytaine/issues/115#issuecomment-1143987636 2. チュートリアル 2.1 主なコンセプト メッシュ 平均的な位置にある浮体のメッシュ。Meshクラスのインスタンスとして格納される。 メッシュは、頂点のリスト(頂点は実数値座標の三つ組)と面のリスト(面は頂点のインデックスの四つ組)として定義されます。デフォルトでは、面は四角形であると仮定される。三角形の面は、2つの同じ頂点を持つ四角形としてサポートされます。 Mesh クラスは、頂点と面から計算されたデータ(面の法線、面の中心、面の面積など)も保存します。 DOF 自由度(Dof)は、浮体の平均位置を中心とした小さな動きや変形を定義する。メッシュの各面の中心にベクトルとして格納されます。 radiating_dof はボディの実際の動きを表し、influcted_dof は(一般化された)力の成分を表します。 注 Galerkin境界要素法の分野の数学者にとっては、自由度の概念は異なる意味を持つかもしれない(Galerkin分解の基底関数)。ここでは、自由度は浮体の物理的な自由度であり、典型的には剛体の並進と回転である。 浮体(FloatingBody) FloatingBodyは、主にMeshといくつかの自由度の再集合である。 ボディの自由度は名前(例:Heave)で参照される。これらは定義された順番に並んでいるはずですが、コード上は厳密に保証されていません。インデックスでアクセスするよりも、名前でアクセスする方が好ましいでしょう。 メッシュとDOF以外に、質量や重心位置などの物理情報をFloatingBodyインスタンスに格納できる。この情報は、いくつかの特定の動作にのみ必要であり(静水圧を参照)、多くの場合、指定しないままにしておくことができます。 LinearPotentialFlowProblem(リニアポテンシャルフロー問題) 問題は、いくつかのパラメタの集まりです:FloatingBody、波の角周波数,水深, 水密度, 重力加速度. クラス LinearPotentialFlowProblem は,2つの子クラスを持つ. RadiationProblem (放射している物体名も必要) DiffractionProblem (入射波面の角度も必要) ほとんどのパラメタはオプションです。それらが提供されない場合、デフォルト値が使用されます(問題の設定ページを参照してください)。 ソルバ コードの核となる部分です。LinearPotentialFlowProblemを入力として受け取り、LinearPotentialFlowResultを返すsolve()メソッドを持っています。 グリーン関数を計算するクラスと行列を構築するクラスを呼び出します。詳しくは,「Resolution」を参照してください. LinearPotentialFlowResult(リニアポテンシャルフローリザルト) 結果を格納するクラスは,問題を格納するクラスと似ていますが, radiation問題ではresult.added_massesやresult.radiation_dampings, diffraction問題ではresult.forceなどの補足データがあります. 力は、自由度の名前と値を関連付けた辞書として格納されています。 値は、この自由度に沿った力の積分値です。 例えば、直交座標の剛体にかかる力ベクトルの成分を取り出すには、Surge、Sway、Heaveに関する力の値を確認します。 2.2 ステップバイステップの例 ipythonのような対話型Pythonコンソールを起動します。Capytaineの主要な機能は全て読み込むことができます。 from capytaine import *. CapytaineはPythonのloggingモジュールを使っていることに注意してください。次に、オプションとして、以下のコマンドでloggingモジュールを初期化することで、コードからフィードバックを得ることができます。 import logging logging.basicConfig(level=logging.INFO) INFOをDEBUGに置き換えて、ソルバ内部で起こっているすべての情報を得ることができます。一方、レベルをWARNINGに設定すると、重要な警告だけがソルバから出力されます(これはloggingモジュールが設定されていない場合のデフォルトの動作です)。 メッシュのロード このチュートリアルでは、Capytaineに含まれるメッシュジェネレータの1つを使い、簡単な幾何学的形状を作成します。 sphere = Sphere(radius=1.0, center=(0, 0, -2), name="my buoy") また、ドキュメントの「メッシュと浮体」のセクションにあるように、ユーザーは様々なファイルフォーマットからメッシュをインポートできる。メッシュは、Meshオブジェクトとして保存されます。例えば、次のような構文で頂点の座標、面の中心、面の法線ベクトルにアクセスできる。 sphere.mesh.vertices[:10] # 最初の10個の頂点。 sphere.mesh.faces_centers[5] # 6番目の面の中心(Pythonの配列は0から始まります). sphere.mesh.faces_normals[5] # 6番目の面の法線ベクトル. vtkがインストールされている場合、以下のようにしてメッシュを3D表示できる。 sphere.show() DOFの定義 diffractionやradiationの問題を解く前に、物体の自由度(dofs)を定義する必要があります。これは、いくつかの方法で行うことができます。 手動で行う方法: ベクトルのリストを定義し、各ベクトルが面の中心でのボディの変位となるようにします。以下の例は、x方向の剛体運動の最も単純な例です。 sphere.dofs['Surge'] = [(1, 0, 0) for face in sphere.mesh.faces]. 剛体の並進と回転を定義するためにヘルパー関数が用意されています。例えば z方向の動きには、FloatingBody.add_translation_dofを使うことができます。 これは、"Surge"、"Sway"、"Heave "などのいくつかのdof名を認識できる。 sphere.add_translation_dof(name="Heave")。 FloatingBody.add_rotation_dof と FloatingBody.add_all_rigid_body_dofs のドキュメントを参照してください。 自由度は、dofs辞書に格納されています。あるボディの dofs の名前にアクセスするには、たとえば次のようにします。 print(sphere.dofs.keys()) # dict_keys(['Surge', 'Heave']) 静水力学 Capytaineは与えられたメッシュに対して静水圧の計算を直接行うことができます。与えられたFloatingBodyの体積、没水面積、水面面積、浮力中心、メタセンター半径、高さ、静水力学、内部質量などのパラメタを得ることができます。 コードにボディに関する情報を与えてみましょう。 sphere.center_of_mass = (0, 0, -2) sphere.rotation_center = (0, 0, -2) 回転中心は回転DOFを定義するために使用される点である。 (静水圧法の現在の制限により、剛体のDOF(ここではサージとヒーブ)があるとすぐに、それが回転DOFでなくても回転中心の定義が必要です)。 各静水圧パラメタは専用のメソッドで計算できる: print(sphere.volume) # 3.82267415555807 print(sphere.center_of_buoyancy) # [-3.58784373e-17 -2.59455034e-17 -2.00000000e+00] print(sphere.compute_hydrostatic_stiffness()) # # array([[0.00000000e+00, 0.00000000e+00], #[0.00000000e+00, 2.38246922e-13]]) # Coordinates: # * influenced_dof (influenced_dof) # array([[3822.67415556,0.], #[ 0., 3822.67415556]]) # Coordinates: # * influenced_dof (influenced_dof)