積分法の選択

メッシュ全体に対する積分法の設定は,ファイル getfem/getfem_mesh_im.h で定義されている構造体 getfem::mesh_im により行います.基本的に,この構造はメッシュの各要素に対する積分法を記述します.次のように getfem::mesh_im オブジェクトをインスタンス化できます.

getfem::mesh_im mim(mymesh);

mymesh は既に存在するメッシュです.構造はこのメッシュにリンクされ,メッシュが修正されたときに追随します(たとえば,メッシュが洗練された場合,積分法も洗練されます).

要素ごとに積分法を指定することができますので,たとえ次元が異なっていても混合型の要素を扱うことができます.

特定の要素に対して特定の積分法を選択するには,以下を使用できます.

mim.set_integration_method(i, ppi);

ここで, i は要素のインデックスであり ppi は積分法の記述子です. このメンバ関数の別の表現は次の通りです.

void mesh_im::set_integration_method(const dal::bit_vector &cvs,
                                      getfem::pintegration_method ppi);
void mesh_im::set_integration_method(getfem::pintegration_method ppi);

これは bit_vector cvs にリストされた凸,またはメッシュのすべての凸のいずれかの積分法を設定します.

積分法のすべての利用可能な記述子のリストはファイル getfem/getfem_integration.h にあります. 積分法の記述子は次の関数によって利用可能です.

getfem::pintegration_method ppi = getfem::int_method_descriptor("name of method");

既存の手法の中で "name of method" を選択する場所です. 手法の名前は次のように取り出すことができます.

std::string im_name = getfem::name_of_int_method(ppi);

積分法の部分的なリスト( 付録B.立体求積法のリスト または getfem/getfem_integration.h を参照)を以下に示します.

完全積分法の例:

  • "IM_NONE()" :ダミー積分法(getfem ++-1.7の新機能).

  • "IM_EXACT_SIMPLEX(n)"n 次元の参照の単体上の多項式の完全積分の描述.

  • "IM_PRODUCT(a, b)"ab の凸の直接の積である凸の完全積分の叙述.

  • "IM_EXACT_PARALLELEPIPED(n)" : 次元nの平行6面体の多項式の完全積分の記述です.

  • "IM_EXACT_PRISM(n)": 次元nの参照のプリズム上の多項式の完全積分の記述です.

近似された積分法の例:

  • "IM_GAUSS1D(k)": k の次数分のGauss積分の記述です. 99 以下のすべての奇数値 k に対して利用可能です.

  • "IM_NC(n,k)": (Lagrange補間に基づく)Newton Cotes法を用いて次数 k の多項式の次元 n の単純な積分の記述.

  • "IM_PRODUCT(a,b)": 積分法 a と積分法 b を直積した積分法を構築します.

  • "IM_TRIANGLE(2)": 2次の3角形に3点で積分します.

  • "IM_TRIANGLE(7)": 7次の3角形に13点で積分します.

  • "IM_TRIANGLE(19)": 19次の3角形に73点で積分します.

  • "IM_QUAD(2)": 2次の3角形に3点で積分します.

  • "IM_GAUSS_PARALLELEPIPED(2,3)": 4点で3次の4辺形を積分します( "IM_PRODUCT(IM_GAUSS1D(3),IM_GAUSS1D(3))" のショートカット).

  • "IM_TETRAHEDRON(5)": 15点で5次の4面体を積分します.

注釈

"IM_QUAD(3)" は, "FEM_QK(2,3)" 有限要素の基本関数を正確に積分できないことに注意してください. この場合,基本関数は次数3の1次元多項式のテンソル積であるため, "IM_QUAD(7)" を使用する必要があります(6は使用できません). したがって, "IM_GAUSS_PARALLELEPIPED(2,k)" は,積分点が少ないので,"IM_QUAD(2*k)" より常に優先して使用するべきです.

積分法を得る別の方法:

getfem::pintegration_method ppi =
  getfem::classical_exact_im(bgeot::pgeometric_trans pgt);

getfem::pintegration_method ppi =
  getfem::classical_approx_im(bgeot::pgeometric_trans pgt, dim_type d);

これらの関数は,正確な(すなわち解析的な)積分法を返すか,または指定された幾何学的変換で定義された凸について, (少なくとも) d 以下の次数の多項式を正確に積分することができる近似積分法を選択します.

mesh_im オブジェクトのメソッド

積分法がメッシュに定義されると,以下の方法で情報を取得することができます(リストは網羅的ではありません).

mim.convex_index()

積分法が定義されているインデックスの集合( dal::bit_vector ).

mim.linked_mesh()

リンクされたメッシュへの参照を与えます.

mim.int_method_of_element(i)

インデックスiの要素に定義された積分法に関する記述子を与えます.

mim.clear()

構造をクリアします. メッシュに定義された積分法はなくなります.