GetFEM OOコマンド

ツールボックスには, Octave / MatLab オブジェクト mathworks-oo ,(toolboxディレクトリの @gf* サブディレクトリを見てください.)のセットがあります.これらのオブジェクトは, Octave / MatLab によってオブジェクトとしてフラグが付けられるgetfemオブジェクトハンドルにすぎません.

これらのオブジェクトを使用するには,コンストラクタを gfMeshgfMeshFemgfGeoTransgfFemgfInteg と呼ぶ必要があります.これらのコンストラクタは,対応する GetFEM 関数(つまり, gf_meshgf_mesh_fem ,....)を呼び出し,これらの関数が返す構造体を Octave / MatLab オブジェクトに変換します.また gfObject 関数もあり,これはgetfemハンドルを対応する Octave / MatLab オブジェクトに変換します.

このようなオブジェクトで最も興味深いのは, "long" 関数の名前を gf_mesh_fem_get(obj,...)gf_slice_set(obj,...) などと呼ぶ必要がなく, obj の型に関係なく,短い get(obj,...)set(obj,...) を呼ぶだけでよいことです.

これらのオブジェクトには少数の "pseudo-properties" も定義されています.たとえば, mgfMesh オブジェクトの場合, get(m, 'nbpts') の代わりに直接 m.nbpts を使用できます.

例として

% classical creation of a mesh object
>> m=gf_mesh('load', 'many_element.mesh_fem')
m =
     id: 2
    cid: 0
% conversion to a matlab object. the display function is overloaded for gfMesh.
>> mm=gfMesh(m)
gfMesh object ID=2 [11544 bytes], dim=3, nbpts=40, nbcvs=7
% direct creation of a gfMesh object. Arguments are the same than those of gf_mesh
>> m=gfMesh('load', 'many_element.mesh_fem')
gfMesh object ID=3 [11544 bytes], dim=3, nbpts=40, nbcvs=7
% get(m, 'pid_from_cvid') is redirected to gf_mesh_get(m,'pid from cvid')
>> get(m, 'pid_from_cvid', 3)
ans =
     8     9    11    15    17    16    18    10    12
% m.nbpts is directly translated into gf_mesh_get(m,'nbpts')
>> m.nbpts
ans =
    40

>> mf=gfMeshFem('load','many_element.mesh_fem')
gfMeshFem object: ID=5 [1600 bytes], qdim=1, nbdof=99,
  linked gfMesh object: dim=3, nbpts=40, nbcvs=7
>> mf.mesh
gfMesh object ID=4 [11544 bytes], dim=3, nbpts=40, nbcvs=7
% accessing the linked mesh object
>> mf.mesh.nbpts
ans =
    40
>> get(mf.mesh, 'pid_from_cvid', 3)
ans =
     8     9    11    15    17    16    18    10    12

>> mf.nbdof
ans =
    99

% access to fem of convex 1
>> mf.fem(2)
gfFem object ID=0 dim=2, target_dim=1, nbdof=9,[EQUIV, POLY, LAGR], est.degree=4
 -> FEM_QK(2,2)
>> mf.mesh.geotrans(1)
gfGeoTrans object ID= 0 dim=2, nbpts= 6 : GT_PK(2,2)

このインターフェイスの方が便利なようですが,mex-fileが呼び出されると,次のような追加の Octave / MatLab コードが生成されます.

>> tic; j=0; for i=1:1000, j=j+mf.nbdof; end; toc
elapsed_time =
    0.6060
>> tic; j=0; for i=1:1000, j=j+gf_mesh_fem_get(mf,'nbdof'); end; toc
elapsed_time =
    0.1698
>> tic; j=0;n=mf.nbdof;  for i=1:1000, j=j+n; end; toc
elapsed_time =
    0.0088

したがって,getfem関数を繰り返し呼び出すのではなく,必ず Octave / MatLab 配列にデータを格納するようにしてください.

使用可能なオブジェクトタイプは gfCvStruct, gfGeoTrans, gfEltm, gfInteg, gfFem, gfMesh, gfMeshFem, gfMeshIm, gfMdBrick, gfMdState, gfModel, gfSpmat, gfPrecond, and gfSlice