GetFEM の高水準汎用構築モジュール

説明

GetFEM の高水準の汎用構築モジュールと汎用弱形式言語 (GWFL) は,偏微分方程式の問題の弱定式化を記述することができるキーモジュールです.ユーザードキュメント 任意の項を計算する - 高水準の汎用的な構築手順 - 弱形式言語 (GWFL) の説明を参照してください.

ファイル

ファイル

説明

getfem_generic_assembly.h

エクスポートされた定義のメインヘッダー.汎用構築を使用するには,このヘッダーをインクルードするだけで十分です.モジュールの他のヘッダーは内部で使用されます.

getfem_generic_assembly_tree.hgetfem_generic_assembly_tree.cc

ツリー構造とその基本操作を定義します.アセンブリ文字列を読み取って構文ツリーに変換し,ツリーを文字列にする逆変換を作成します.

getfem_generic_assembly_function_and_operators.hgetfem_generic_assembly_function_and_operators.cc

再定義関数の定義とGWFLの非線形演算子.

getfem_generic_assembly_semantic.hgetfem_generic_assembly_semantic.cc

構文ツリーの意味解析と強化.変数に対するツリーの導出や,式の勾配に対応するツリーの計算など,いくつかの操作を含みます.

getfem_generic_assembly_workspace.cc

( getfem_generic_assembly.h で定義されている)workspaceオブジェクトのメソッド .

getfem_generic_assembly_compile_and_exec.hgetfem_generic_assembly_compile_and_exec.cc

最適化された命令の定義,コンパイルによる最適化された命令の作成とGauss点/補間点での命令の実行を行います.

getfem_generic_assembly_interpolation.cc

補間演算と補間変換.

いくつかの実装の詳細

アセンブリ文字列は src/getfem_generic_assembly.cc の一連の関数によってアセンブリツリーに変換されます.プロセスには6つのステップがあります.

  • ga_get_token(...) を使用した字句解析.

  • ga_read_string(...) による構文解析と構文木への変換.

  • ga_semantic_analysis(...) による定数式の意味解析, 単純化 (事前計算) とツリーの強化.

  • ga_derivative(...) によるアセンブリツリーの(自動) 微分の表現

  • ga_gradient(...) によるアセンブリツリーの(自動)勾配計算の表現

  • ga_compile(...) による最適化された一連の命令のコンパイル.

  • ga_exec(...) による命令とアセンブリの直列実行.

これらの手順は,アセンブリのはじめに1回だけ実行されます.最終的なツリーは,各要素の各Gauss点で実行される最適化された命令でコンパイルします.コンパイルではいくつかの最適化が実行されます.繰り返しの項は自動的に検出され,1回だけ実行されます.メッシュの簡略化はベクトル有限要素法の要素が均一な型を持っている場合に行われます.

さらに,補間操作 (ga_interpolation(...), ga_interpolation_exec(...), ga_interpolation_Lagrange_fem, ga_interpolation_mti, ga_interpolation_im_data, ...) の具体的な関数を実行します.

アセンブリツリー

アセンブリ文字列は ga_read_string(...) でアセンブリツリーに変換されます.アセンブリツリーは,各ステップ(意味分析,導出,コンパイル) で徐々に強化される構文ツリーです.

オブジェクト ga_tree はアセンブリツリーを表します.これはツリーのルートへのポインターのみを含むコピー可能オブジェクトです.各ツリーのノードは,主に次の情報を含むオブジェクト ga_tree_node です.

  • node_type (関数, 変数値, 勾配値, 操作 ...)

  • 節点操作の操作の種類.

  • アセンブリテンソル: 中間結果を計算するために最適化された命令によって実行時に使用されます.最終的な結果は,実行の終了時にルートノードの(各Gauss点での)アセンブリ文字列で使用されます.

  • 項の種類: 値,1次の項 (i 番目の1次の試験関数),2次の項 (2次の試験関数) または1次と2次の試験関数 (接線項).

  • 1次または2次の項の試験関数の変数名.

  • 親ノードへのポインター.

  • 子ノードへのポインター.

たとえば,Laplacian問題の剛性マトリックスのアセンブリ文字列 "a*Grad_Test2_u.Grad_Test_u" のアセンブリツリーは,各ノードのアセンブリテンソルをもとに次のように表現できます.

../_images/tree_simple_laplace_tan.png

アセンブリテンソル

アセンブリテンソルは,各ノードで bgeot::tensor<double> オブジェクトによって表されています.ただし,アセンブリテンソルには複数の形式があり, src/getfem_generic_assembly.cc にはアセンブリテンソルのための詳細構造を実装しています.

  • 通常のテンソル.1番目と2番目のインデックスは,ノードが1次または2次の項を表す場合,試験関数のローカルインデックスを表します. GetFEM ではすべてのテンソルは Fortran の次数で保存されます.これは例えば \(N\times P\times Q\) であるテンソルは t(i, j, k) = t[i + j*N + k*N*P] となるということです.

  • コピーされたテンソル.ノードが,既にコンパイルされたものと比較してまったく同じ式を持つ場合,アセンブリテンソルには,既にコンパイル済みのノードのアセンブリテンソルへのポインタが設定されます.結果として,不要なコピーは作成されません.

  • スパースにリストされた疎テンソル.ベクトルフィールドを使用する場合,有限要素法は各成分に適用されます.その結果,ベクトの基底関数が0以外の成分を1つだけ持ち,一部の成分が複製されます.テンソルは,その種の小さな疎テンソル形式で効率化のために複製されるので,完全に表現されます.ただし,一部の操作は,特定のスパース (および複製) の知見を使用して最適化できます.これにより,縮約の複雑さの度合いを変更することができます.効率的な使用を可能にするためにテンソルはいくつかのスパースフォーマットでラベル付けがされています (ベクトルテンソルで適用される操作から来るベクトル化とフォーマット) .これにより,以下に示すようなスパース形式が得られます.

    • 1:ベクトル化ベースのスパース形式:テンソルはベクトル化値を表します. 縮約テンソルの各値は,ベクトル化テンソルの Q 成分に対して繰り返されます.メッシュ寸法は N で示されます.たとえば, \(\varphi_i\) が要素 \(M\) 上のローカル基底関数で評価がGauss点 \(x\) の場合,ベクトル化されていないテンソルは \(\bar{t}(i) = \varphi_i(x)\) であり,ベクトル化されたものは \(t(j,k) = \varphi_{j/Q}(x) \delta_{k, j \mbox{ mod } Q}\) となります.ここで \(j/M\) は整数の除算です. \(M=2\)\(Q=2\)\(N=3\) の場合,2つのテンソルの成分は次の表のように表されます.

      スカラテンソル

      ベクトルテンソル

      \(\bar{t}(i) = \varphi_i(x)\)

      \(t(j,k) = \varphi_{j/Q}(x) \delta_{k, (j \mbox{ mod } Q)}\)

      \([\varphi_0(x), \varphi_1(x)]\)

      \([\varphi_0(x), 0, \varphi_1(x), 0, 0, \varphi_0(x), 0, \varphi_1(x)]\)

    • 2: Grad の縮約形式

      スカラテンソル

      ベクトルテンソル

      \(\bar{t}(i,j) = \partial_j\varphi_i(x)\)

      \(t(k,l,m) = \partial_m\varphi_{k/Q}(x) \delta_{l, (m \mbox{ mod } Q)}\)

      \([\partial_0\varphi_0(x), \partial_0\varphi_1(x),\) \(\partial_1\varphi_0(x), \partial_1\varphi_1(x),\) \(\partial_2\varphi_0(x), \partial_2\varphi_1(x)]\)

    • 3: Hessian 縮約形式

    • 10: ベクトル化された質量: テンソルは2つのベクトル化された基底関数のスカラー積を表します.つまり, \(k \ne l\)\(t(i*Q+k, j*Q+k)\) に対して \(t(i*Q+k, j*Q+l) = 0\) であるテンソル \(t(\cdot,\cdot)\)\(0 \le k < Q\) と等価です.

最適化された命令

変数の評価,操作,ベクトルと行列のアセンブリのための最適化された命令など.説明を準備中.

定義済み関数

GWFLは弱定式化を記述するために(または基本的な代数計算もするため)いくつかの定義済みスカラー関数を使用可能です.これは,1つまたは2つの引数のスカラー関数に限定されます.記述された問題の接線系を計算する際に自動微分が行われるために,各関数は微分可能である必要があります.原理原則は次のとおりです.定義済みの関数でも共通です.
  • (複数の)引数に指定された値を計算する C++ の関数.

  • (可能な限り無限の) 範囲で各第1引数の関数をサポートします (これは表現の簡素化のためです).

  • 既知の関数の導関数に対応する文字列

新しい定義済み関数は簡単に追加できます.ファイル src/getfem_generic_assembly.cc の init_predefined_functions() を参照してください.微分を与える方法についての説明を準備中.

定義済み非線形演算子

説明を準備中.

状態

安定しています.

展望

  • 複雑なデータへの拡張は可能でしょうか?

  • さらなる簡素化: 処理数を減らすために,いくつかの項 (例えばスカラー項) を自動的に因数分解するとよいかもしれません.