GetFEM OOコマンド¶
ツールボックスには, Octave / MatLab オブジェクト mathworks-oo ,(toolboxディレクトリの @gf*
サブディレクトリを見てください.)のセットがあります.これらのオブジェクトは, Octave / MatLab によってオブジェクトとしてフラグが付けられるgetfemオブジェクトハンドルにすぎません.
これらのオブジェクトを使用するには,コンストラクタを gfMesh
, gfMeshFem
, gfGeoTrans
, gfFem
, gfInteg
と呼ぶ必要があります.これらのコンストラクタは,対応する GetFEM 関数(つまり, gf_mesh
, gf_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" も定義されています.たとえば, m
が gfMesh
オブジェクトの場合, 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
.