GetFEM OO-commands

The toolbox comes with a set of Octave / MatLab objects mathworks-oo, (look at the @gf* sub-directories in the toolbox directory). These object are no more than the getfem object handles, which are flagged by Octave / MatLab as objects.

In order to use these objects, you have to call their constructors: gfMesh, gfMeshFem, gfGeoTrans, gfFem, gfInteg. These constructor just call the corresponding GetFEM function (i.e. gf_mesh, gf_mesh_fem, …), and convert the structure returned by these function into a Octave / MatLab object. There is also a gfObject function which converts any getfem handle into the corresponding Octave / MatLab object.

With such object, the most interesting feature is that you do not have to call the “long” functions names gf_mesh_fem_get(obj,...), gf_slice_set(obj,...) etc., instead you just call the shorter get(obj,...) or set(obj,...) whatever the type of obj is.

A small number of “pseudo-properties” are also defined on these objects, for example if m is a gfMesh object, you can use directly m.nbpts instead of get(m, 'nbpts').

As an example:

% 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)

Although this interface seems more convenient, you must be aware that this always induce a call to a mex-file, and additional Octave / MatLab code:

>> 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

Hence you should always try to store data in Octave / MatLab arrays instead of repetitively calling the getfem functions.

Avalaible object types are gfCvStruct, gfGeoTrans, gfEltm, gfInteg, gfFem, gfMesh, gfMeshFem, gfMeshIm, gfMdBrick, gfMdState, gfModel, gfSpmat, gfPrecond, and gfSlice.