Dirichlet条件ブリック要素¶
Dirichlet条件ブリック要素の目的は,モデル変数のために領域の境界の一部にDirichlet条件を規定することです.これは,この変数の値が境界で規定されていることを意味します.このブリック要素は3つのバージョンがあります( Dirichletおよび接触境界条件に対するNitsche法 の節も参照してください).最初のバージョンはDirichlet乗数を定めます.関連する弱形式の項は次のとおりです.
ここで, \(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());
唯一の違いは, multname は mf_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_mult ( getfem::mesh_fem オブジェクトへのポインタ)はオプションです. ロッキングした場合に,Dirichlet条件を弱めることもできます.この場合,ペナルティ行列は \(B^TB\) のような形式になります.ここで, \(B\) は,変数 varname の試行関数と乗数空間ペナルティ係数はモデルのデータとして追加され,次の関数によって変更することができます.
change_penalization_coeff(md, ind_brick, penalisation_coeff);
The third version of the Dirichlet condition brick uses a simplification of the linear system (tangent linear system for nonlinear problems). Basically, it enforces a 1 on the diagonal components of the lines corresponding to prescribed degrees of freedom, it completes the lines with some zeros (for symmetric problems, it also completes the columns with some zeros) and it adapts the right-hand side accordingly. This is a rather simple and economic way to prescribe a Dirichlet condition. However, it can only be applied when one can identify the degrees of freedom prescribed by the Dirichlet condition. So, it has to be used with care with reduced finite element methods, Hermite element methods and cannot be applied for a normal (or generalized) Dirichlet condition on vectorial problems. The function allowing to add this brick is:
add_Dirichlet_condition_with_simplification(md, varname, region,
dataname = std::string());
dataname が省略されている場合は,同種のDirichlet条件が適用されます.dataname が 与えられた場合,Dirichlet条件が適用される変数 varname と同じ有限要素法で定数または記述されなければならないという制約があります.加えて, dataname が定数の場合,Lagrange有限要素法にしか適用できません.
一般化Dirichlet状態ブリック要素¶
一般化されたDirichlet条件は,タイプのベクトル場uの境界条件です.
ここで, \(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\) はスカラーフィールドで, \(l_i\) は点 \(x_i\) に指定する値です.
ベクトルフィールド変数の場合, \(N_p\) 点数 \(x_i, i = 1\cdots N_p\) の集合が与えられた場合,ブリック要素は変数の1つのブリック要素の値をこれらの点で処理することを可能にします,すなわち,条件を強制します.
where \(n_i\) is the vector such that \(u(x_i)\cdot n_i\) represents the component to be prescribed.
ブリック要素には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());
respectively for the penalized version, the one with a given multiplier fixed size variable and the one which automatically adds a multiplier variable of the right size to the model. The data dataname_pt, dataname_unitv and dataname_val should be added first to the model. dataname_pt should be a vector containing the coordinates of the points where to prescribe the value of the variable varname. It is thus of size \(N N_p\) where \(N\) is the dimension of the mesh. dataname_unitv is ignored for a scalar field variable. For a vector field variable, it should contain the vector \(n_i\). In that case, its size should be \(Q N_p\) where \(Q\) is the dimension of the vector field. dataname_val is optional and represents the right hand side, it should contain the components \(l_i\). The default value for \(l_i\) is 0.
このブリック要素は主に,純粋なNeumann問題の剛性変位を処理するように設計されています.