diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index d0f88b4adcea93aa35c3d62072c88cd8ba40ffba..2d0e399dccaf7da2edbfef6ad26934084330d519 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.46 2001-05-01 18:58:24 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.47 2001-05-03 00:09:42 geuzaine Exp $ #include <map> #include "Gmsh.h" @@ -1301,6 +1301,73 @@ void mesh_define_transfinite_volume_cb(CALLBACK_ARGS){ _add_transfinite(3); } +// Dynamic Solver Menus + +#include "Solvers.h" + +void getdp_cb(CALLBACK_ARGS){ + static int first=1; + if(first){ + first = 0; + strcpy(GetDP_Info.file,CTX.basefilename); + strcat(GetDP_Info.file,".pro"); + strcpy(GetDP_Info.mesh,""); + } + WID->getdp_value[0]->value(GetDP_Info.file); + GetDP(GetDP_Info.file); + WID->create_getdp_window(); +} +void getdp_file_open_cb(CALLBACK_ARGS){ + char *newfile; + newfile = fl_file_chooser("Open Problem Definition File", "*", NULL); + if (newfile != NULL) strcpy(GetDP_Info.file,newfile); + WID->getdp_value[0]->value(GetDP_Info.file); + GetDP(GetDP_Info.file); +} +void getdp_file_edit_cb(CALLBACK_ARGS){ + Msg(WARNING, "Should lauch a file editor"); +} +void getdp_choose_mesh_cb(CALLBACK_ARGS){ + char *newfile; + newfile = fl_file_chooser("Open Mesh File", "*", NULL); + if (newfile != NULL) strcpy(GetDP_Info.mesh,newfile); + WID->getdp_value[1]->value(GetDP_Info.mesh); +} +void getdp_pre_cb(CALLBACK_ARGS){ + char arg[256]; + if(strlen(GetDP_Info.mesh)) + sprintf(arg, "%s -msh %s -pre %s", + GetDP_Info.file, GetDP_Info.mesh, + GetDP_Info.res[WID->getdp_choice[0]->value()]); + else + sprintf(arg, "%s -pre %s", + GetDP_Info.file, + GetDP_Info.res[WID->getdp_choice[0]->value()]); + + GetDP(arg); +} +void getdp_cal_cb(CALLBACK_ARGS){ + char arg[256]; + if(strlen(GetDP_Info.mesh)) + sprintf(arg, "%s -msh %s -cal", GetDP_Info.file, GetDP_Info.mesh); + else + sprintf(arg, "%s -cal", GetDP_Info.file); + GetDP(arg); +} +void getdp_post_cb(CALLBACK_ARGS){ + char arg[256]; + if(strlen(GetDP_Info.mesh)) + sprintf(arg, "%s -msh %s -bin -pos %s", + GetDP_Info.file, GetDP_Info.mesh, + GetDP_Info.postop[WID->getdp_choice[1]->value()]); + else + sprintf(arg, "%s -bin -pos %s", + GetDP_Info.file, + GetDP_Info.postop[WID->getdp_choice[1]->value()]); + GetDP(arg); +} + + // Dynamic Post Menus void view_toggle_cb(CALLBACK_ARGS){ diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h index 4cb0d5399cfc8c609d498e41e1558bd571957139..f0b2c4da4b5d9df628a610e806c31091854ac3d2 100644 --- a/Fltk/Callbacks.h +++ b/Fltk/Callbacks.h @@ -181,6 +181,16 @@ void con_mesh_define_length_cb(CALLBACK_ARGS) ; void con_mesh_define_transfinite_line_cb(CALLBACK_ARGS) ; void con_mesh_define_transfinite_volume_cb(CALLBACK_ARGS) ; +// Dynamic Solver Menus + +void getdp_cb(CALLBACK_ARGS); +void getdp_file_open_cb(CALLBACK_ARGS); +void getdp_file_edit_cb(CALLBACK_ARGS); +void getdp_choose_mesh_cb(CALLBACK_ARGS); +void getdp_pre_cb(CALLBACK_ARGS); +void getdp_cal_cb(CALLBACK_ARGS); +void getdp_post_cb(CALLBACK_ARGS); + // Dynamic post menus void view_toggle_cb(CALLBACK_ARGS) ; diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index 47b53b7752cabcddbe748fb2628640d7fe32e3f9..b8f7edbd94bbc0f98d61c666f5b38d7e1fd6b39a 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.63 2001-05-01 18:58:24 geuzaine Exp $ +// $Id: GUI.cpp,v 1.64 2001-05-03 00:09:42 geuzaine Exp $ // To make the interface as visually consistent as possible, please: // - use the BH, BW, WB, IW values for button heights/widths, window borders, etc. @@ -246,6 +246,7 @@ Context_Item menu_mesh[] = Context_Item menu_solver[] = { { "2Solver", NULL } , + { "GetDP", (Fl_Callback *)getdp_cb } , { NULL } }; Context_Item menu_post[] = @@ -456,6 +457,7 @@ GUI::GUI(int argc, char **argv) { init_view_window = 0; init_geometry_context_window = 0; init_mesh_context_window = 0; + init_getdp_window = 0; if(strlen(CTX.display)) Fl::display(CTX.display); @@ -494,6 +496,7 @@ GUI::GUI(int argc, char **argv) { create_view_options_window(-1); create_message_window(); create_about_window(); + create_getdp_window(); // Draw the scene g_opengl_window->redraw(); @@ -717,9 +720,7 @@ void GUI::set_context(Context_Item *menu_asked, int flag){ m_popup_butt[i]->hide(); } break; - case 2 : // solver contexts - break; - default : // geometry or mesh contexts + default : // geometry, mesh, solver contexts for(i=0 ; i < NB_BUTT_MAX ; i++){ m_toggle_butt[i]->hide(); m_popup_butt[i]->hide(); @@ -2336,3 +2337,95 @@ void GUI::create_mesh_context_window(int num){ } } + +//************** Create the window for the getdp solver ************** + +void GUI::create_getdp_window(){ + int i; + static Fl_Group *g[10]; + + if(!init_getdp_window){ + init_getdp_window = 1 ; + + int width = 25*CTX.fontsize; + int height = 5*WB+9*BH + WB; + + getdp_window = new Fl_Window(width,height); + getdp_window->box(WINDOW_BOX); + getdp_window->label("GetDP Solver"); + { + Fl_Tabs* o = new Fl_Tabs(WB, WB, width-2*WB, height-3*WB-BH); + { + g[0] = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "General"); + g[0]->labelsize(CTX.fontsize); + + getdp_value[0] = new Fl_Output(8*CTX.fontsize, 2*WB+1*BH, BW, BH, "Problem"); + getdp_butt[0] = new Fl_Button(8*CTX.fontsize+BW-2*BB-WB, 3*WB+2*BH, BB, BH, "Edit"); + getdp_butt[0]->callback(getdp_file_edit_cb); + getdp_butt[1] = new Fl_Button(8*CTX.fontsize+BW-BB, 3*WB+2*BH, BB, BH, "Choose"); + getdp_butt[1]->callback(getdp_file_open_cb); + + getdp_choice[0] = new Fl_Choice(8*CTX.fontsize, 4*WB+3*BH, BW, BH,"Resolution"); + getdp_choice[1] = new Fl_Choice(8*CTX.fontsize, 5*WB+4*BH, BW, BH,"PostOperation"); + + getdp_value[1] = new Fl_Output(8*CTX.fontsize, 6*WB+5*BH, BW, BH, "Mesh"); + getdp_butt[2] = new Fl_Button(8*CTX.fontsize+BW-BB, 7*WB+6*BH, BB, BH, "Choose"); + getdp_butt[2]->callback(getdp_choose_mesh_cb); + + for(i=0 ; i<2 ; i++){ + getdp_value[i]->labelsize(CTX.fontsize); + getdp_value[i]->textsize(CTX.fontsize); + getdp_value[i]->type(FL_HORIZONTAL); + getdp_value[i]->align(FL_ALIGN_LEFT); + getdp_value[i]->value(0); + } + + for(i=0 ; i<3 ; i++){ + getdp_butt[i]->labelsize(CTX.fontsize); + } + + for(i=0 ; i<2 ; i++){ + getdp_choice[i]->textsize(CTX.fontsize); + getdp_choice[i]->labelsize(CTX.fontsize); + } + + g[0]->end(); + } + o->end(); + } + + { + Fl_Button* o = new Fl_Button(width-4*BB-4*WB, height-BH-WB, BB, BH, "Pre"); + o->labelsize(CTX.fontsize); + o->callback(getdp_pre_cb); + } + { + Fl_Button* o = new Fl_Button(width-3*BB-3*WB, height-BH-WB, BB, BH, "Cal"); + o->labelsize(CTX.fontsize); + o->callback(getdp_cal_cb); + } + { + Fl_Button* o = new Fl_Button(width-2*BB-2*WB, height-BH-WB, BB, BH, "Post"); + o->labelsize(CTX.fontsize); + o->callback(getdp_post_cb); + } + { + Fl_Button* o = new Fl_Button(width-BB-WB, height-BH-WB, BB, BH, "Cancel"); + o->labelsize(CTX.fontsize); + o->callback(cancel_cb, (void*)getdp_window); + } + + + if(CTX.center_windows) + getdp_window->position(m_window->x()+m_window->w()/2-width/2, + m_window->y()+9*BH-height/2); + getdp_window->end(); + } + else{ + if(getdp_window->shown()) + getdp_window->redraw(); + else + getdp_window->show(); + } +} + diff --git a/Fltk/GUI.h b/Fltk/GUI.h index fb9e80959638a4689589d51d7d01b0f390f2dc39..cda15ce554a9fd7d0b29b8a109f384cf4059b5ab 100644 --- a/Fltk/GUI.h +++ b/Fltk/GUI.h @@ -169,6 +169,12 @@ public: Fl_Window *context_mesh_window ; Fl_Input *context_mesh_input[20] ; + // solver windows + int init_getdp_window; + Fl_Window *getdp_window ; + Fl_Output *getdp_value[50] ; + Fl_Choice *getdp_choice[10] ; + Fl_Button *getdp_butt[10] ; // the constructor GUI(int argc, char **argv); @@ -187,6 +193,7 @@ public: void create_about_window(); void create_geometry_context_window(int num); void create_mesh_context_window(int num); + void create_getdp_window(); // general purpose interaction void run(); diff --git a/Fltk/Makefile b/Fltk/Makefile index 1ecf46c12015c07e057e69d8ca2f9a4c1e67ac00..76f14c81800364a1fb447af06bf8f7be3f2aa988 100644 --- a/Fltk/Makefile +++ b/Fltk/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.16 2001-04-23 10:38:08 geuzaine Exp $ +# $Id: Makefile,v 1.17 2001-05-03 00:09:42 geuzaine Exp $ # # Makefile for "libFltk.a" # @@ -32,7 +32,9 @@ SRC = Main.cpp \ Callbacks.cpp\ Opengl.cpp\ Opengl_Window.cpp\ - Colorbar_Window.cpp + Colorbar_Window.cpp\ + Socket.cpp\ + Solvers.cpp OBJ = $(SRC:.cpp=.o) diff --git a/Fltk/Socket.cpp b/Fltk/Socket.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a452234dc87053d5e9ff1093ea31a5b833318d68 --- /dev/null +++ b/Fltk/Socket.cpp @@ -0,0 +1,184 @@ +/* $Id: Socket.cpp,v 1.1 2001-05-03 00:09:42 geuzaine Exp $ */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/un.h> +#include <unistd.h> + +#include "Message.h" + +int Socket_ReceiveData(int socket, void *buffer, int bytes){ + int sofar, remaining, len; + char *buf; + + buf = (char*)buffer; + sofar = 0; + remaining = bytes; + do { + len = read(socket, buf + sofar, remaining); + if (len<=0) return 0; + sofar += len; + remaining -= len; + } while (remaining>0); + return bytes; +} + +void Socket_SendData(int socket, void *buffer, int bytes){ + int sofar, remaining, len; + char *buf; + + buf = (char*)buffer; + sofar = 0; + remaining = bytes; + do { + len = write(socket, buf + sofar, remaining); + sofar += len; + remaining -= len; + } while (remaining>0); +} + +int Socket_ReceiveInt(int socket, int *i){ + return Socket_ReceiveData(socket, i, sizeof(int)); +} + +void Socket_SendInt(int socket, int i){ + Socket_SendData(socket, &i, sizeof(int)); +} + +int Socket_ReceiveDouble(int socket, double *x){ + return Socket_ReceiveData(socket, x, sizeof(double)); +} + +void Socket_SendDouble(int socket, double x){ + Socket_SendData(socket, &x, sizeof(double)); +} + +int Socket_ReceiveString(int socket, char str[]){ + int len; + + if (Socket_ReceiveInt(socket, &len)) { + if (Socket_ReceiveData(socket, str, len)==len) { + str[len] = '\0'; + return 1; + } + } + return 0; +} + +void Socket_SendString(int socket, char str[]){ + int len; + + len = strlen(str); + Socket_SendInt(socket, len); + Socket_SendData(socket, str, len); +} + + +int Socket_StartProgram(char *progname, char *sockname){ + int s, sock; +#ifdef WIN32 + int len; +#else + socklen_t len ; +#endif + struct sockaddr_un addr, from; + char command[1000]; + fd_set rfds; + struct timeval tv; + int retval; + + /* first delete the socket's name if it exists */ + unlink(sockname); + + /* make the socket */ + s = socket(PF_UNIX, SOCK_STREAM, 0); + if (s<0) { + Msg(GERROR, "Couldn't create socket"); + return -1; + } + + /* bind the socket to its name */ + strcpy(addr.sun_path, sockname); + addr.sun_family = AF_UNIX; + if(bind(s, (struct sockaddr *)&addr, strlen(addr.sun_path)+sizeof(addr.sun_family)) < 0) { + Msg(GERROR, "Couldn't bind socket to name"); + return -1; + } + + /* change permissions on the socket name in case it has to be rm'd later */ + chmod(sockname, 0666); + + /* Start the external function via system() call */ + sprintf(command, "%s -socket %s &", progname, sockname); + system(command); + + /* wait for external function to connect */ + if(listen(s, 20)) Msg(GERROR, "Socket listen failed"); + + /* Watch s to see when it has input. */ + FD_ZERO(&rfds); + FD_SET(s, &rfds); + /* Wait up to one second */ + tv.tv_sec = 2; + tv.tv_usec = 0; + retval = select(s+1, &rfds, NULL, NULL, &tv); + + if(!retval){ + Msg(GERROR, "Socket listening timeout"); + return -1; + } + + len = sizeof(from); + if ( (sock = accept(s, (struct sockaddr *)&from, &len)) < 0) { + Msg(GERROR, "Socket accept failed"); + return -1; + } + + close(s); /* don't need this socket anymore */ + + return sock; +} + +int Socket_StopProgram(char *progname, char *sockname, int sock){ + if(unlink(sockname)==-1) Msg(WARNING, "Impossible to unlink the socket"); + close(sock); + return 0; +} + + +int Socket_Connect(char *sockname){ + struct sockaddr_un addr; + int len, sock; + int tries; + + /* create socket */ + sock = socket(PF_UNIX, SOCK_STREAM, 0); + if (sock<0){ + Msg(GERROR, "Couldn't create socket"); + return -1; + } + + /* try to connect socket to given name */ + strcpy(addr.sun_path, sockname); + addr.sun_family = AF_UNIX; + len = strlen(addr.sun_path)+sizeof(addr.sun_family); + for (tries=0;tries<5;tries++) { + if (connect(sock, (struct sockaddr *)&addr, len) < 0) { + Msg(GERROR, "Socket connect failed"); + } + else { + return sock; + } + } + + return -1; +} + + +void Socket_Close(int sock){ + close(sock); +} diff --git a/Fltk/Socket.h b/Fltk/Socket.h new file mode 100644 index 0000000000000000000000000000000000000000..a25f56bb97bffa24c37c7a8b9cd80e3d4ae0f4f5 --- /dev/null +++ b/Fltk/Socket.h @@ -0,0 +1,17 @@ +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +int Socket_ReceiveData(int socket, void *buffer, int bytes); +void Socket_SendData(int socket, void *buffer, int bytes); +int Socket_ReceiveInt(int socket, int *i); +void Socket_SendInt(int socket, int i); +int Socket_ReceiveDouble(int socket, double *x); +void Socket_SendDouble(int socket, double x); +int Socket_ReceiveString(int socket, char str[]); +void Socket_SendString(int socket, char str[]); +int Socket_StartProgram(char *progname, char *sockname); +int Socket_StopProgram(char *progname, char *sockname, int sock); +int Socket_Connect(char *sockname); +void Socket_Close(int sock); + +#endif diff --git a/Fltk/Solvers.cpp b/Fltk/Solvers.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ff83bedc8eda68225c2bc053dae663098b93764e --- /dev/null +++ b/Fltk/Solvers.cpp @@ -0,0 +1,117 @@ +// $Id: Solvers.cpp,v 1.1 2001-05-03 00:09:42 geuzaine Exp $ + +#include "Gmsh.h" + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/un.h> +#include <unistd.h> + +#include "Socket.h" +#include "OpenFile.h" +#include "Solvers.h" + +#include "GmshUI.h" +#include "GUI.h" +#include "Mesh.h" +#include "Draw.h" + + +extern GUI *WID; + + +#if defined(WIN32) && !defined(__CYGWIN__) +#define SLASH "\\" +#else +#define SLASH "/" +#endif + +#define GET_PATH(path_val) \ + char *tmp; \ + if ((tmp = getenv("HOME"))) strcpy(path_val, tmp); \ + else if((tmp = getenv("TMP"))) strcpy(path_val, tmp); \ + else if((tmp = getenv("TEMP"))) strcpy(path_val, tmp); \ + else strcpy(path_val, ""); \ + if(strlen(path_val)) strcat(path_val, SLASH); + + + + +// interface to GetDP + +_GetDP_Info GetDP_Info ; + +int GetDP(char *args){ + int sock, i, n ; + char progname[1000], sockname[1000], str[1000]; + + GET_PATH(sockname); + strcat(sockname, ".gmsh-socket-GetDP"); + + sprintf(progname, "getdp %s", args); + sock = Socket_StartProgram(progname, sockname); + if(sock<0){ + Msg(GERROR, "Could not execute '%s'", progname); + return 0; + } + + GetDP_Info.nbres = 0; + GetDP_Info.nbpostop = 0; + + while(1){ + Socket_ReceiveInt(sock, &i); + + if(i<0){ + Msg(INFO, "Finished '%s'", progname); + break; + } + + Socket_ReceiveString(sock, str); + + switch(i){ + case 10 : // status + Msg(STATUS3N, "GetDP %s", str); + break ; + case 101 : // available resolution + strcpy(GetDP_Info.res[GetDP_Info.nbres++],str); + break ; + case 102 : // available postoperations + strcpy(GetDP_Info.postop[GetDP_Info.nbpostop++],str); + break ; + case 200 : // load postprocessing file + n = List_Nbr(Post_ViewList); + MergeProblem(str); + Draw(); + if(n != List_Nbr(Post_ViewList)) + WID->set_context(menu_post, 0); + break ; + default : + Msg(DIRECT, "GetDP > %s", str); + break ; + } + + } + + if(GetDP_Info.nbres){ + WID->getdp_choice[0]->clear(); + for(i=0;i<GetDP_Info.nbres;i++) + WID->getdp_choice[0]->add(GetDP_Info.res[i]); + WID->getdp_choice[0]->value(0); + } + + if(GetDP_Info.nbpostop){ + WID->getdp_choice[1]->clear(); + for(i=0;i<GetDP_Info.nbpostop;i++) + WID->getdp_choice[1]->add(GetDP_Info.postop[i]); + WID->getdp_choice[1]->value(0); + } + + + Socket_StopProgram(progname, sockname, sock); + + return 1; +} + + + diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp index e31d2abf9a32e6d8467316df681189b46a95d27c..2b684377ce0c3ae5433940850f06d6f548614f69 100644 --- a/Graphics/Scale.cpp +++ b/Graphics/Scale.cpp @@ -1,4 +1,4 @@ -// $Id: Scale.cpp,v 1.18 2001-04-22 18:13:02 geuzaine Exp $ +// $Id: Scale.cpp,v 1.19 2001-05-03 00:09:42 geuzaine Exp $ #include "Gmsh.h" #include "GmshUI.h" @@ -21,8 +21,8 @@ static XCharStruct overall; if(overall.width > cv_w) cv_w=overall.width #elif _FLTK - -#define CHECK_W cv_w=gl_width(label) +static double overall ; +#define CHECK_W overall=gl_width(label) ; if(overall > cv_w) cv_w=overall #else diff --git a/Makefile b/Makefile index fb131d579982adc76be12d785c02ef3fe2b3664c..f441ec624e79aa8f6919d1533d911989e7afebe8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.94 2001-04-26 17:58:00 remacle Exp $ +# $Id: Makefile,v 1.95 2001-05-03 00:09:42 geuzaine Exp $ # ---------------------------------------------------------------------- # Makefile for Gmsh # ---------------------------------------------------------------------- @@ -184,7 +184,7 @@ tag: echo "#define GMSH_VERSION $(GMSH_RELEASE)" > Common/GmshVersion.h echo "#define GMSH_DATE \"`date`\"" >> Common/GmshVersion.h echo "#define GMSH_HOST \"`hostname`\"" >> Common/GmshVersion.h - echo "#define GMSH_PACKAGER \"`hostname`\"" >> Common/GmshVersion.h + echo "#define GMSH_PACKAGER \"`whoami`\"" >> Common/GmshVersion.h echo "#define GMSH_OS \"`uname -sr`\"" >> Common/GmshVersion.h initialtag: diff --git a/doc/VERSIONS b/doc/VERSIONS index 8e91552892f97eb2e305df9e90042db9609e1cbb..2b2082094ec20417e40551823ad4a4ce05bf96ae 100644 --- a/doc/VERSIONS +++ b/doc/VERSIONS @@ -1,7 +1,7 @@ -$Id: VERSIONS,v 1.11 2001-05-01 18:59:37 geuzaine Exp $ +$Id: VERSIONS,v 1.12 2001-05-03 00:09:42 geuzaine Exp $ New in 1.19: Fixed seg. fault scalar simplex post-processing; new -"Solver" menu; +"Solver" menu; Sockets; fixed small scale display problems; New in 1.18: Fixed many small bugs and incoherences in post-processing; fixed broken background mesh in 1D mesh generation. diff --git a/www/gmsh.html b/www/gmsh.html index 8497d8538442812b120baa12fa96c47e8d4f420a..0ee7005bb41c9891a52b27a4ff592b32f35d54b9 100644 --- a/www/gmsh.html +++ b/www/gmsh.html @@ -50,7 +50,7 @@ ENDSCRIPT---> This page is a mirror of <a href="/gmsh/">/gmsh/</a><p> ENDMIRROR---> -<!---BEGINDATE$Date: 2001-04-25 16:11:03 $ENDDATE---> +<!---BEGINDATE$Date: 2001-05-03 00:09:42 $ENDDATE---> Copyright © 1998-2001<br> Jean-Fran�ois Remacle and @@ -449,8 +449,8 @@ href="http://mesa3d.sourceforge.net">http://mesa3d.sourceforge.net</A> (a Linux RPM is directly available <A href="/gmsh/thirdparty/Mesa-3.2-2.i386.rpm">here</A>). Remember that you may have to reconfigure the loader (ldconfig under Linux) or -modify the LD_LIBRARY_PATH (or SHLIB_PATH on HP) in order for Gmsh to -find the libraries. +modify the LD_LIBRARY_PATH (or SHLIB_PATH on HP) environment variable +in order for Gmsh to find the libraries. </font></td>