Dirichletおよび接触境界条件に対するNitsche法

GetFEM はDirichletタイプまたは摩擦境界条件との接触を,Lagrange乗数を使用せずに弱形式で考慮に入れることができるNitche法の汎用的な実装を与えます.この方法は,Dirichlet境界条件をNeumann境界条件と同様に弱定式項に変換するため,非常に魅力的です.しかしながら,この利点は,対応するNeumann項の近似を必要とするため,Nitsche法の実施がモデル依存であることがコストです.Nitsche法で境界条件をモデルの変数に追加するには,対応するブリック要素が,この変数に適用されるすべての偏微分項のNeumann項の近似にアクセスする必要があります.以下では,変数 \(u\) を考慮して,

\[G\]

この変数上のすべてのNeumann項の和.Neumann項 \(G\) は変数 \(u\) に依存することが多いことに注意してください.しかしモデルの他の変数にも依存します.これは,例えば,非圧縮弾性の混合式の場合です.Neumann項は,モデルのいくつかのパラメータ(弾力係数...)にも頻繁に依存しますが,これはその式に含まれると仮定されます.

例えば,Laplace項 ( \(\Delta u\) )が変数 \(u\) に適用される場合,Neumann項は \(G = \dfrac{\partial u}{\partial n}\) のようになります.ここで, \(n\) は考慮されている境界上の外側の単位法線です.もし \(u\) が変形可能な物体の変位を表すなら, Neumann項は \(G = \sigma(u)n\) のようになります.ここで, \(\sigma(u)\) は構成則に依存する応力テンソルです.もちろん,その場合 \(G\) はいくつかの物性値に依存します.さらに,圧力を表す変数 \(p\) を混合した非圧縮ブリック要素に加えると, \(u\) 上のNeumann項は次のように \(p\) に依存します. \(G = \sigma(u)n - pn\)

Nitsche法を課しているブリック要素が,関連する変数に適用されるすべての偏微分項に対して機能する汎用的な実装を可能にするために,モデルに部分微分項を追加する各ブリック要素は,GWFL(汎用弱形式言語)表現が必要です.

これらの式は,modelオブジェクトの特別なメソッド:

expr = md.Neumann_term(variable, region)

すべての部分微分項要素が与える式を走査し,適切な操作を実行することによって,すべてのNeumann項の和に対する式を自動的に導出することを可能にします.もちろん,このメソッドを呼び出す前に,すべてのボリューム要素をモデルに追加する必要があります.Neumann項の導出は,2次偏微分方程式に対してのみ働く.高次pdeの汎用的な実装はより複雑になります.

Dirichlet条件のための汎用的なNitsche法

変数 \(u\) が考慮され,条件を規定したいとします.

\[Hu = g\]

部分 \(\Gamma_D\) は考慮する領域の境界です.ここで, \(H\) は,スカラーの場合,1と等しいと見なされるか,ベクトルの場合の恒等行列か,固有値として1または0のみを持つ特異行列のいずれかです.これにより,ここでは, \(u\) の接線または接線成分のみを処理することができます.たとえば,正規成分のみを処理したい場合, \(H\) は:math:nn^T と等しくなるように選択されます.ここで, \(n\)\(\Gamma_D\) 上の外向きの単位法線です.

このDirichlet条件を処理するためのNitsche法では,問題の弱形式に次の項を加えます.

\[\int_{\Gamma_D} \dfrac{1}{\gamma}(Hu-g-\gamma HG).(Hv) - \theta(Hu-g).(HD_uG[v])d\Gamma,\]

\(\gamma\)\(\theta\) はNitsche法の2つのパラメータです. \(v\)\(u\) に対応する試験関数です.パラメータ \(\theta\) は正または負が選択できます. \(\theta = 1\) は標準的な状況で対称的な接線項につながるより標準的な方法に対応します. \(\theta = 0\) は数が減少するという利点を持つ非対称的な方法に対応します.非線形の場合には \(G\) の2次導関数を必要とせず,\(\theta = -1\) は少なくとも標準的な状況では非平衡保磁力を保証する一種のSkew対称法である(これは, \(\gamma\) ).パラメータ \(\gamma\) は一種のペナルティ・パラメタですが(手法は一貫していますが),次のようになります \(\gamma = \gamma_0 h_T\) ,ここで, \(\gamma_0\) はメッシュで \(h_T\) は要素 \(T\) の直径です. \(\theta = -1\) を除く標準的な状況では,パラメータ \(\gamma_0\) はNitsche法の収束を確実にするために十分小さくする必要があることに注意してください.

Nitsche法でDirichlet条件をモデルに追加した要素は次のとおりです:

getfem::add_Dirichlet_condition_with_Nitsche_method
   (model &md, const mesh_im &mim, const std::string &varname,
    const std::string &Neumannterm,
    const std::string &gamma0name, size_type region,
    scalar_type theta = scalar_type(1),
    const std::string &dataname = std::string());

この関数は変数 varname とメッシュ領域 region にDirichlet条件を追加します.この領域は境界でなければなりません. Neumannterm はGWFLの表現として記述されたNeumann項(Green式によって得られる)の表現です.この項は,すべてのボリューム要素がモデルに追加されると md.Neumann_term(varname, region) で取得できます.Dirichlet条件はNitsche法で規定されています. dataname はDirichlet条件のオプションの右辺です.これは一定か,または有限要素法上に記述することができます;Dirichlet条件が規定されている変数に応じて,スカラー値またはベクトル値を返します. gamma0name はNitsche法のパラメータです. theta は正または負のスカラー値です. theta = 1 は標準的な対称的なメソッドに対応しています.これは, gamma0 が小さい場合に強制的に行われます. theta = -1 は非強制的強制的なSkew対称方法に対応します. theta = 0 はNeumann項の2次導関数が非線形問題であっても必要でない最も単純な方法です.モデル内の要素のインデックスを返します.

getfem::add_normal_Dirichlet_condition_with_Nitsche_method
   (model &md, const mesh_im &mim, const std::string &varname,
    const std::string &Neumannterm,
    const std::string &gamma0name, size_type region,
    scalar_type theta = scalar_type(1),
    const std::string &dataname = std::string());

この関数は,ベクトル(またはテンソル)値変数 varname とメッシュ領域 region の正規成分にDirichlet条件を追加します.この領域は境界でなければなりません. Neumannterm はGWFLの表現として記述されたNeumann項(Green式によって得られる)の表現です.この項は,すべてのボリューム要素がモデルに追加されると ,md.Neumann_term(varname, region) で取得できます.Dirichletの状態はNitsche法で規定されています. dataname はオプションのDirichlet条件の右辺です.これは一定であるか,またはfem上に記述することができます. gamma0name はNitsche法のパラメータです. theta は正または負のスカラー値です. theta = 1 は標準的な対称メソッドに対応しています.これは, gamma0 が小さい場合に強制的に行われます. theta = -1 は非強制的強制的なSkew対称法に対応します. theta = 0 はNeumann項の2次導関数が非線形問題であっても必要でない最も単純な方法です.モデル内の要素のインデックスを返します.(このブリック要素は完全にテストされていません).

getfem::add_generalized_Dirichlet_condition_with_Nitsche_method
   (model &md, const mesh_im &mim, const std::string &varname,
    const std::string &Neumannterm,
    const std::string &gamma0name, size_type region, scalar_type theta,
    const std::string &dataname, const std::string &Hname);

この関数は変数 varname とメッシュ領域 region にDirichlet条件を追加します.このバージョンはベクトルフィールド用です.それは条件 \(Hu = r\) を規定します,ここで \(H\) は行列のフィールドです.領域は境界でなければなりません.この領域は境界でなければなりません. Neumannterm はGWFLの式として記述されたNeumann項(Green式によって得られる)の表現です.この項は,すべてのボリューム要素がモデルに追加されると, md.Neumann_term(varname, region) で取得できます.Dirichlet条件はNitsche法で規定されています.注意:行列Hはすべての固有値が1または0に等しくなければなりません. dataname はDirichlet条件のオプションの右辺です.それは一定であるか,または有限要素法上に記述することができます. gamma0name はNitscheのメソッドパラメータです. theta は正または負のスカラー値です. theta = 1 は標準的な対称的なメソッドに対応しています.これは, gamma0 が小さい場合に強制的に行われます. theta = -1 は非強制的強制的なskew対称方法に対応します. theta = 0 はNeumann項の2次導関数が非線形問題であっても必要でない最も単純な方法です. Hname は行列フィールド H に対応するデータです.それは一定の行列でなければならないか,またはスカラーのfemで記述されなければなりません.モデル内の要素のインデックスを返します. (この要素は完全にテストされていません)

摩擦条件との接触のための汎用的なNitsche法

ここでは,微小変形フレームワークでCoulomb摩擦条件との接触を規定するNitsche法の使用について説明します.これは弱積分接触条件に相当し,対応する節でLagrange乗数を使用するものとある程度類似しているので, 弱積分接触条件 を参照してください.

表記法を簡略化するためには, \(P_{n,\mathscr{F}}\) を使用してください.次のマップはいくつかの予測に対応しています:

\[P_{n,\mathscr{F}}(x) = -(x.n)_- n + P_{B(0,\mathscr{F}(x.n)_-)}(x - (x.n)n)\]

このアプリケーションは, \(\rm I\hspace{-0.15em}R_-\) と中心のボールの接線部分 \(0\) と半径 \(\mathscr{F}(x.n)_-\)\(x\) の通常部分の投影を作成します.ここで, \(\mathscr{F}\) は摩擦係数です.

これを使って,すべり速度を \(\alpha(u_{_T} - w_{_T})\) のように近似することを考えてみましょう.ここで,\(\alpha\)\(w_{_T}\) は使用されている時間積分スキーム( 弱積分接触条件 参照)に依存して,Nitscheの摩擦接触の項は以下のようになります.

\[\begin{split}&-\int_{\Gamma_C} \theta \gamma G\cdot D_u G[v] d\Gamma \\ &+\int_{\Gamma_C} \gamma P_{n,\mathscr{F}}(G - \dfrac{Au}{\gamma} + \dfrac{gap}{\gamma}n + \dfrac{\alpha w_{_T}}{\gamma})\cdot(\theta D_u G[v] - \dfrac{v}{\gamma}) d\Gamma.\end{split}\]

ここで, \(\Gamma_C\) は接触境界です. \(G\) はNeumann項でここでは接触境界での応力 \(\sigma n\) を表します.そして \(A\)\(d\times d\) マトリックスです.

\[A = \alpha I_d + (1-\alpha)n n^T\]

\(\theta=0\) の値では,大部分の項は消えることに注意してください.

以下の関数は,変数 varname_u とメッシュ境界 region にCoulomb摩擦の有無にかかわらず接触条件を追加します. Neumannterm はGWFLの表現として記述されたNeumann項(Green式によって得られる)の表現です.この項は,すべてのボリューム要素がモデルに追加されると md.Neumann_term(varname, region) で取得できます.接触条件はNitsche法で規定されています.剛性の障害物はデータ dataname_obstacle が障害物までの符号付き距離である(有限要素法で補間された)データで記述しなければなりません. gamma0name はNitscheのメソッドパラメータです. theta は正または負のスカラー値です. theta = 1 は標準的な対称的なメソッドに対応しています.これは, gamma0 が小さい場合に強制的に行われます. theta = -1 は非強制的強制的なSkew対称方法に対応します. theta = 0 はNeumann項の2次導関数が必要でない最も単純な方法です.オプションのパラメータ dataexpr_friction_coeff はGWFLの任意の表現である摩擦係数です.モデル内の要素のインデックスを返します.

getfem::add_Nitsche_contact_with_rigid_obstacle_brick
(model &md, const mesh_im &mim, const std::string &varname_u,
 const std::string &Neumannterm,
 const std::string &expr_obs, const std::string &dataname_gamma0,
 scalar_type theta_,
 std::string dataexpr_friction_coeff,
 const std::string &dataname_alpha,
 const std::string &dataname_wt,
 size_type region);