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

.