レベルセット法,拡張有限要素法(Xfem),仮想領域有限要素法,切断有限要素法

v2.0以降, GetFEM は拡張有限要素法(Xfem)と仮想領域有限要素法を切断有限要素法でサポートするために,いくつかの機能を提供しています.これらのツールのほとんどは,当初,Julien Pommier によって [LA-PO-RE-SA2005] に発表された研究をもとにして主に開発されました.

[SU-CH-MO-BE2001] で提案されているように,レベルセット法の使用に基づいて,実装はかなり大きな汎用性を持ち,多数のレベルセット法を同時に使用できます.

基底の離散化のための拡張有限要素法(Xfem)の実装は, [HA-HA2004] の手法に従いますが,実装中にこの作業についての知識はありませんでした.ゆえに,レベルセット法全体の基底を表す自由度がありません.代わりに,自由度は,レベルセット法の各側の変位を表します.これは,1つの要素の中に連続な2つ以上の異なるゾーンが存在する可能性があるため,互いに交差するレベルセット法の存在下ではどのような場合にも不可欠です.

仮想領域法の切断有限要素法は, GetFEM で初めて使用されています.かなり単純な安定化戦略が提案されている [HA-RE2009] に掲載された研究を使用しています.ここでも,話題の E. Burman and P. Hanbo [bu-ha2010] の存在を知る前に実装が行われています.

拡張有限要素法(Xfem)は,J. Larsyの PhD研究(例えば, [LA-RE-SA2010] を参照)とE. Chahine (例えば, [CH-LA-RE2011], [NI-RE-CH2011] を参照)とS. Amdouni (例えば, [AM-MO-RE2014], [AM-MO-RE2014b] を参照)とM. Fabre (例えば, [Fa-Po-Re2015] を参照)によってツールを充実させています.

重要

下記のすべてのツールは,システムに qhull パッケージがインストールされている必要があります.このパッケージは広く入手可能です.このライブラリは,任意の次元の凸包とDelaunay3角形分割を計算します.

プログラム tests/crack.ccinterface/tests/matlab/crack.minterface/tests/python/crack.py はこれらのツールの使用例です.

レベルセット法の表現

いくつかの構造は,メッシュ上の区分的多項式関数によって定義されたレベルセット法関数を操作するために定義されています.ファイル getfem/getfem_levelset.h レベルセット法は,メッシュ上のある次元のLagrange有限要素法に定義された関数で表されます.新しい getfem::level_set を定義するコンストラクタは次の通りです.

getfem::level_set ls(mesh, degree = 1, with_secondary = false);

ここで, mesh は有効な getfem::mesh メッシュ型です, degree は多項式の次数(1はデフォルト値)です, また with_secondary はデフォルト値がfalseのブール値です.次レベルセット法が,降伏を表すために使用されます( \(p(x)\) がプライマリレベルセット法関数であり, \(s(x)\) がセカンダリレベルセット法関数である場合,\(p(x) = 0\)\(s(x) \leq 0\) :2次的役割はクラックを区切ることです.)

各レベルセット法関数は, mesh_fem mf とこれ以上の自由度値はベクトル内にあります.オブジェクト getfem::level_setmesh_fem と対応する関数のための自由度のベクトルを含みます. ls.value(0) メソッドは,プライマリレベルセット法関数の自由度のベクトルを返します.これにより,これらの値を設定することができます. ls.value(1) メソッドは,セカンダリレベルセット法関数の自由度のベクトルを返します.メソッド ls.get_mesh_fem() は, getfem::mesh_fem オブジェクトです.

アプリケーションでは,(例えば,再初期化のため)Hamilton-Jacobi方程式により,レベルセット法関数がしばしば進展することに注意してください. Hamilton-Jacobi方程式の近似に使用できる 純対流法 を参照してください.

レベルセット法によるメッシュ切断

1つまたは複数のレベルセット法にわたって不連続であるフィールドを表現するための適合化された積分法および有限要素法を計算するために,適切な数の事前計算をメッシュレベルで行わなければなりません.getfem/getfem_mesh_level_set.h では,これらの事前計算を処理するオブジェクト getfem::mesh_level_set が定義されています.このオブジェクトのコンストラクタは次のとおりです.

getfem::mesh_level_set mls(mesh);

ここで meshgetfem::mesh 型の有効なメッシュです.メッシュがレベルセット法で切断されていることを示すためには,メソッド mls.add_level_set(ls) を呼び出さなければなりません.ここで, lsgetfem::level_set 型のオブジェクトです.任意の数のレベルセット法を追加することができます.オブジェクトを初期化するか,レベルセット法関数の値が変更されたときにオブジェクトを実現するには, mls.adapt() メソッドを呼び出さなければなりません.

特に,レベルセット法によって切断された各要素の細分化は,単純化によって行われます.切断メッシュ全体は一般に等角ではないことに注意してください.

切断メッシュは例えば後処理のために取得できます,切断メッシュで満たされている m により mls.global_cut_mesh(m) を呼び出します.

統合された積分法

レベル集合にわたる不連続なフィールドの場合,積分法を適合させる必要があります.オブジェクト getfem::mesh_im_level_setgetfem/getfem_mesh_im_level_set.h ファイル内で定義されており,レベルセット法で切り取られた要素の合成積分法が定義されています.このオブジェクトのコンストラクタは次のとおりです.

getfem::mesh_im_level_set mim(mls, where, regular_im = 0, singular_im = 0);

ここで, mlsgetfem::mesh_level_set 型のオブジェクトです, where には以下の値が入力可能です.

  • getfem::mesh_im_level_set::INTEGRATE_INSIDE\(p(x)<0\) 上で積分),

  • getfem::mesh_im_level_set::INTEGRATE_OUTSIDE\(p(x)>0\) 上で積分),

  • getfem::mesh_im_level_set::INTEGRATE_ALL

  • getfem::mesh_im_level_set::INTEGRATE_BOUNDARY\(p(x)=0\)\(s(x)\leq 0\) 上で積分)

引数 regular_im は, pintegration_method 型でなければなりません.また, レベルセット法で切断された要素の複合積分の各サブ単体に適用される積分法になります.オプションの singular_impintegration_method 型でなければならず,クラックの特異関数に使われます.クラックチップとの頂点を共有するサブ単体に適用されます(特定の積分法 IM_QUASI_POLAR(..) がこの目的に適しています).

オブジェクト getfem::mesh_im_level_set は古典的な getfem::mesh_im として使うことができます.オブジェクト(例えば, mim.set_integration_method(...) メソッドは,レベルセット法によって切断されていない要素の積分法を設定することができます).

オブジェクトを初期化するか,レベルセット法関数の値が変更されたときにそれを実現するには, mim.adapt() メソッドを呼び出さなければなりません.

getfem::mesh_level_set で複数のレベルセット法が宣言されている場合,オブジェクトを使用すると,メソッドを使用してより正確に積分領域を設定することができます.

mim.set_level_set_boolean_operations("desc");

"desc" は,積分領域を定義するブール演算の記述を含む文字列です.構文は単純です.たとえば,3つの異なるレベルセット法がある場合,

"a*b*c" は,各レベルセット法で定義された領域の共通部分です(この関数が呼び出されない場合のデフォルト動作です).

"a+b+c" は,その領域の和集合です.

"c-(a+b)" は,他の2つの和集合との第3レベルセット法の差の領域です.

"!a" はaの領域の補集合(すなわち, a(x)>0 の部分の領域)です

第1のレベルセット法は常に "a" と呼ばれ,第2のレベルセット法は "b" などと呼ばます.

切断有限要素法

[bu-ha2010] に記載されているような切断有限要素法,すなわち,より小さな実領域に限定された架空の領域上の有限要素の実施は,これまでのツールおよび主として適応された積分法を使用することによって可能です. GetFEM にいくつかのテストプログラムの例があります.たとえば interface/tests/python/demo_fictitious_domain.py または interface/tests/matlab/demo_fictitious_domain.m を参照してください.

この文脈においては,未知の有限要素フィールドを,対応する形状関数サポートが実領域との交差を有する自由度に制限するのが普通です.これは, partial_mesh_fem オブジェクトを使って行うことができます.たとえば, interface/tests/matlab/demo_structural_optimization.m を参照してください.

Dirichlet状態を適用する場合など,実際の領域との交差が非常に小さい要素による最終的なロック現象を処理するために,しばしば安定化技術を考慮する必要があることに注意してください.たとえば, [bu-ha2010][HA-RE2009][Fa-Po-Re2015] を参照してください.

いくつかのレベルセット法にわたる不連続なフィールド

getfem::mesh_fem_level_set オブジェクトはファイル getfem/getfem_mesh_fem_level_set.h で定義されています.それは getfem::mesh_fem オブジェクトから派生しており,同じ方法で使用できます.これは,レベルセット法全体に(レベルセット法の任意の数を扱うことができる)不連続の有限要素法を定義します.コンストラクタは次のとおりです.

getfem::mesh_fem_level_set mfls(mls, mf);

mlsgetfem::mesh_level_set 型の有効なメッシュで, mfgetfem::mesh_fem 型のオブジェクトです.これは,レベルセット法によって切断されない要素に使用される有限要素法を定義します.

オブジェクトを初期化するか,レベルセット法関数の値が変更されたときにオブジェクトを実現するには, mfls.adapt() メソッドを呼び出さなければなりません.

非連続的なフィールドを表現するために,有限要素法は,いくつかのHeaviside関数と, mf で表される有限要素法の形状関数の積である不連続関数で強化されています(詳細については [HA-HA2004] および [Xfem] を参照).

拡張有限要素法(Xfem)

拡張有限要素法(Xfem)([Xfem] を参照)は,いくつかのHeaviside関数(オブジェクト getfem :: mesh_fem_level_set によって行われている)だけでなく,クラック先端での漸近的な変位による豊かさでも構成されています. [Xfem] のような亀裂先端を含む要素のみの高度化, [LA-PO-RE-SA2005] または [Be-Mi-Mo-Bu2005] のような固定されたサイズの領域の高度化は, [CH-LA-RE2008] または [NI-RE-CH2011] のような切断関数を用いた高度化または高度化領域と非高度化領域との間の完全一致条件を漸近変位で高度化させるいくつかの方法が [CH-LA-RE2011] などのようにあります. Getfemは,すべての可能性を簡単に実装するための最大限の柔軟性に欠けていました.主に有限要素法自体の変換であるため,いくつかの豊富な有限要素を生成するための2つのツールが定義されています.

getfem::mesh_fem_product mf_asympt(mf_part_unity, mf_sing)
getfem::mesh_fem_sum mf_sum(mf1, mf2)

getfem::mesh_fem_global_function オブジェクト(src/getfem/getfem_mesh_fem_global_function.h を参照)のために, mf_sing はグローバルな '有限要素法' でなければなりません.実際にグローバル関数の集合(切断関数の有無にかかわらず) と mf_part_unity は基本的なスカラー有限要素法です.結果として得られる getfem::mesh_fem_product は,与えられた2つの有限要素法の形状関数のすべての積の線形結合であり,メソッド mf_asympt.set_enrichment(enriched_dofs) により与えられる有限要素法の自由度の部分集合に制限されます.

漸近的エンリッチが定義されると,オブジェクト getfem::mesh_fem_sum は2つの有限要素法の直和を生成することを可能にします.たとえば,Heaviside関数( getfem::mesh_fem_level_set オブジェクト)は漸近的な高度化によって充実したものの例です.

これらのツールの使用例については, interface/tests/matlab/demo_crack.minterface/tests/python/demo_crack.py または tests/crack.cc を参照してください.

さらに,GWFL,汎用弱形式言語は,レベルセット法全体の任意のフィールドまたは任意のフィールドの基底を考慮に入れることを可能にする2つのコマンド Xfem_plus および Xfem_minus を定義します( Xfem不連続性評価(mesh_fem_level_setを使用) を参照).この先験的な部分は,任意のインタフェース則を容易に書くことを可能にしていることです.

また, src/getfem/getfem_crack_sif.h の中には,2Dの応力拡大係数を計算するためのいくつかの手順があります(均一な等方線形弾性に制限されています).

ポスト処理

レベルセット法の側でのみ解を表現するツールや,(Xfem近似のための)不連続性も考慮した両方のツールがあります.

切断メッシュ mls (すなわち, getfem::mesh_level_set オブジェクト)が使われているとき,コマンドで全てのサブ要素の集合を得ることができます.

mls.global_cut_mesh(mcut);

mcut は,サブ要素で塗りつぶされる空のメッシュでなければなりません.生成されたメッシュは,すべての要素のサブメッシュが要素のエッジ/面で等角でないという意味で,非正規のメッシュであることに注意してください.しかしながら,このメッシュ上のLagrange有限要素法を相互に連結し,不連続なフィールドを正しく表現するために後処理を行うことが可能です.

仮想領域有限要素法が使用されているときに,解の着目部分だけを表す別の手段は,等値レベルセット法( メッシュスライスの生成 参照)で定義されたメッシュスライスを使用することです.

interface/tests/matlab/demo_crack.minterface/tests/python/demo_fictitious_domain.pyinterface/tests/matlab/demo_structural_optimization.m を参照してください.