[Gmsh] Build the mesh in my own program

Mikhail Artemiev artemiev.mikhail at ngs.ru
Mon Oct 4 07:32:26 CEST 2010


Hi everybody once more!
Now I am ready to share my experience to use Gmsh 
functions in my own program.
Thank to Mikhail Titov's advice I found in utils/api_demos 
the examples of using Gmsh API.
Then I found in Gmsh reference manual this text:
<<Finally, to use Gmsh at the third level (i.e., to link 
the Gmsh library with your own code),
you will need to learn the internal Gmsh Application 
Programming Interface (API). No
complete documentation of this API is available yet; a 
good starting point is Section C.2
[Source code structure], page 185, which gives a short 
introduction to Gmsh's internal source
code structure. Then have a look e.g. at the examples in 
the 'utils/api_demos/' directory
in the source code. Due to the many possible configuration 
options (and associated external
dependencies), we currently do not distibute precompiled 
versions of the Gmsh library.
To build the library see the instructions in the top-level 
'README.txt' file in the source
distribution.>>

Ok, cmake was downloaded and after some torture Gmsh.exe, 
Gmsh.dll and Gmsh.lib was created.
Then I included Gmsh.lib in my Visual Studio project 
(Properties->Linker->Input->Additional Dependencies) where 
I had only one cpp-file (mainSimple.cpp from 
utils\api_demos):

#include <stdio.h>
#include <gmsh/Gmsh.h>
#include <gmsh/GModel.h>
#include <gmsh/MElement.h>

int main(int argc, char **argv)
{
   GmshInitialize(argc, argv);
   //GmshSetOption("Mesh", "Algorithm", 5);
   GModel *m = new GModel();
   m->readGEO("../../tutorial/t5.geo");
   //GmshMergeFile("../../tutorial/t5.geo"); // will also 
set the bbox
   m->mesh(3);
   for(GModel::riter it = m->firstRegion(); it != 
m->lastRegion(); ++it){
     GRegion *r = *it;
     printf("volume %d contains %d elements:\n", r->tag(), 
r->getNumMeshElements());
     for(unsigned int i = 0; i < r->getNumMeshElements(); 
i++)
       printf(" %d", r->getMeshElement(i)->getNum());
     printf("\n");
   }
   m->writeMSH("test.msh");
   m->writeUNV("test.unv");
   delete m;
   GmshFinalize();
}

After compilation I have 1225 errors like these:
                 Description 
                                                            
                                        File 
           Project
Error	1	error LNK2001: unresolved external symbol "public: 
static int __cdecl Fl::check(void)" 
(?check at Fl@@SAHXZ)	Gmsh.lib	delme
Error	5	error LNK2001: unresolved external symbol "void 
__cdecl fl_alert(char const *,...)" 
(?fl_alert@@YAXPBDZZ)	Gmsh.lib	delme
et cetera

If I delete Gmsh.lib from 'Additional Dependencies', after 
compilation I have 8 errors like these:
                 Description 
                                                            
                                        File 
           Project
Error	4	error LNK2001: unresolved external symbol "public: 
int __thiscall GModel::mesh(int)" 
(?mesh at GModel@@QAEHH at Z)	main.obj	delme
Error	7	error LNK2001: unresolved external symbol "int 
__cdecl GmshFinalize(void)" (?GmshFinalize@@YAHXZ)	 
       main.obj	delme
et cetera

In first case I tried to include a fltk library (I thought 
that 'Fl' means a part of 'fltk'), but I miscarried.
Because of <<no complete documentation of this API is 
available yet>> can anybody help me?

Thanks
Mikhail Artemiev, PhD student, NSTU


> Mikhail Titov:
> I would suggest to communicate with Gmsh using network. 
>Take a look at the
> source code. It has a couple of nice examples in 
>utils/solvers subfolder. It
> will definitely save some time since you can reuse 
>existing instance instead
> of launching new process every time.
> 
> IMHO it would be the last resort to link gmsh code in.
> 
> Mikhail