Dirichlet条件ブリック要素

Dirichlet条件ブリック要素の目的は,モデル変数のために領域の境界の一部にDirichlet条件を規定することです.これは,この変数の値が境界で規定されていることを意味します.このブリック要素は3つのバージョンがあります( Dirichletおよび接触境界条件に対するNitsche法 の節も参照してください).最初のバージョンはDirichlet乗数を定めます.関連する弱形式の項は次のとおりです.

\[\int_{\Gamma} u \mu d\Gamma = \int_{\Gamma} u_D \mu d\Gamma, \forall \mu \in M.\]

ここで, \(u\) は変数です \(M\) は乗数の空間です, \(u_D\) は変数, \(\Gamma\) はDirichlet境界です.このバージョンでは乗数を表すために追加の変数が必要です.これは,モデルに直接行うことも,以下の関数で行うこともできます.乗数で指定されたDirichlet条件を追加できる3つの関数があります.最初のものは次の通りです.

add_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         multname, region,
                                         dataname = std::string());

メッシュ領域 region (境界でなければならない)上の乗数変数 multname により, varname にDirichlet条件を追加します.その境界上の変数の値は,あらかじめモデル内で定義されていなければならないデータ dataname によって記述されます.データが省略された場合,Dirichlet条件は均質なもの(境界上の消失変数)とみなされます.データは,FEM上で一定または記述することができます.また,変数に応じてスカラー値またはベクトル値にすることもできます.変数 multname はメソッド add_multiplier でモデルに追加する必要があります.この関数は,モデル内のブリック要素のインデックスを返します.2番目の関数は以下の通りです.

add_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         mf_mult, region,
                                         dataname = std::string());

唯一の違いは, multnamemf_mult に置き換えられます.つまり,乗算器が構築される有限要素のみが与えられます.この関数は,乗数変数をモデルに追加します. 3番目の関数は2番目の関数と非常に似ています.

add_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         degree, region,
                                         dataname = std::string());

パラメータ mf_mult は乗数がその次数の古典的な有限要素法に基づいて構築されることを示す整数の degree に置き換えられます.

全ての場合において,変数がmodelオブジェクトの add_multiplier メソッドによって追加されたとき mesh_fem は( partial_mesh_fem_object により)考慮されている境界に寄与していない自由度しか保持しないようにフィルタリングされます.

最後に,乗算器の変数名は以下の関数により得られます.

mult_varname_Dirichlet(md, ind_brick);

ここで ind_brick はモデルのブリック要素のインデックスです.この関数は別の種類のブリック要素に適用された場合,未定義の動作をします.

Dirichlet条件のブリック要素の第2のバージョンは,ペナルティを伴うものです.このブリック要素を追加できる関数は以下の通りです.

add_Dirichlet_condition_with_penalization(md, mim, varname,
                                          penalization_coeff, region,
                                          dataname = std::string(),
                                          *mf_mult = 0);

ペナルティは変数の質量行列を計算し,ペナルティ係数を掛けたものに剛性行列を加算します.パラメータ mf_multgetfem::mesh_fem オブジェクトへのポインタ)はオプションです. ロッキングした場合に,Dirichlet条件を弱めることもできます.この場合,ペナルティ行列は \(B^TB\) のような形式になります.ここで, \(B\) は,変数 varname の試行関数と乗数空間ペナルティ係数はモデルのデータとして追加され,次の関数によって変更することができます.

change_penalization_coeff(md, ind_brick, penalisation_coeff);

Dirichlet条件ブリック要素の第3バージョンは,線形システム(非線形問題のための接線系)の簡略化を使用します.基本的には,規定された自由度に対応する線の対角成分に1を強制し,それに応じていくつかのゼロを有する線を完成させます(対称問題については,いくつかのゼロで列を完成させます).これは,Dirichlet条件を処理するための,単純で効率的な方法です.ただし,Dirichlet条件で規定されている自由度を特定できる場合にのみ適用できます.したがって,簡略化したHermite要素法の使用は慎重に使用しなければならず,ベクトル問題に関する通常の(または一般化された)Dirichlet条件には適用できません.このブリック要素を追加できる関数は次の通りです.

add_Dirichlet_condition_with_simplification(md, varname, region,
                                          dataname = std::string());

dataname が省略されている場合は,同種のDirichlet条件が適用されます.dataname が 与えられた場合,Dirichlet条件が適用される変数 varname と同じ有限要素法で定数または記述されなければならないという制約があります.加えて, dataname が定数の場合,Lagrange有限要素法にしか適用できません.

一般化Dirichlet状態ブリック要素

一般化されたDirichlet条件は,タイプのベクトル場uの境界条件です.

\[H u = r\]

ここで, \(H\) は行列フィールドです.対応するブリック要素を追加する関数は,標準的なDirichlet条件のものと似ていますが,補足パラメータ Hname を必要とします.これは, \(H\) に対応するデータの名前を与えます.このデータは,スカラーの有限要素法または定数行列に記述された行列フィールドにすることができます.

add_generalized_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         multname, region,
                                         dataname, Hname);


add_generalized_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         mf_mult, region,
                                         dataname, Hname);

add_generalized_Dirichlet_condition_with_multipliers(md, mim, varname,
                                         degree, region,
                                         dataname, Hname);


add_generalized_Dirichlet_condition_with_penalization(md, mim, varname,
                                          penalization_coeff, region,
                                          dataname, Hname);

点列制約ブリック要素

点列制約ブリック要素は,ブリック要素のようなDirichlet条件であり,領域の所与の点に未知の値を処方することを可能にします.これらの点は,必ずしもメッシュの頂点である必要はなく,未知数が記述されている有限要素法の自由度に対応する点列である必要もありません.

スカラー場変数については, \(N_p\)\(x_i, i = 1\cdots N_p\) の集合が与えられ,ブリック要素にこれらの点で変数の値を指定すると,次のようになります.

\[u(x_i) = l_i, ~~~ i = 1\cdots N_p,\]

ここで, \(u\) はスカラーフィールドで, \(l_i\) は点 \(x_i\) に指定する値です.

ベクトルフィールド変数の場合, \(N_p\) 点数 \(x_i, i = 1\cdots N_p\) の集合が与えられた場合,ブリック要素は変数の1つのブリック要素の値をこれらの点で処理することを可能にします,すなわち,条件を強制します.

\[u(x_i)\cdot n_i = l_i, ~~~ i = 1\cdots N_p,\]

ここで, \(n_i\) は次のようなベクトルです.例えば \(u(x_i)\cdot n_i\) は指定する成分を表します.

ブリック要素には2つのバージョンがあります: ペナルティバージョンと乗算機能付きバージョンです.呼び出しは次のとおりです.

add_pointwise_constraints_with_penalization(md, varname, penalisation_coeff,
              dataname_pt, dataname_unitv = std::string(),
              dataname_val = std::string());

add_pointwise_constraints_with_given_multipliers(md, varname, multname,
              dataname_pt, dataname_unitv = std::string(),
              dataname_val = std::string());

add_pointwise_constraints_with_multipliers(md, varname, dataname_pt,
              dataname_unitv = std::string(), dataname_val = std::string());

与えられた乗数固定サイズの変数を持つものと,適切なサイズの乗数変数をモデルに自動的に追加するものとの2種類があります.データ dataname_ptdataname_unitvdataname_val は最初にmodelに追加する必要があります. dataname_pt は,変数 varname の値を規定する点の座標を含むベクトルでなければなりません.したがって,サイズ \(N N_p\) です.ここで, \(N\) はメッシュの次元です. dataname_unitv はスカラフィールド変数では無視されます.ベクトルフィールド変数の場合はベクトル \(n_i\) を含むはずです.その場合,サイズは次のように \(Q N_p\) である必要があります.ここで, \(Q\) はベクトルフィールドの次元です. dataname_val はオプションで右辺を表します.これは, \(l_i\) という成分を含んでいなければなりません. \(l_i\) のデフォルト値は0です.

このブリック要素は主に,純粋なNeumann問題の剛性変位を処理するように設計されています.