netgen/ng/ngappinit.cpp

401 lines
9.1 KiB
C++
Raw Normal View History

2009-01-13 04:40:13 +05:00
/*
The main function of netgen.
This file is a modification of tkAppInit.c from the Tcl/Tk package
*/
2014-10-29 16:09:10 +05:00
#include <mystdlib.h>
2014-10-08 18:46:25 +06:00
#include <inctcl.hpp>
2009-01-13 04:40:13 +05:00
#include <meshing.hpp>
#ifdef PARALLEL
#include <mpi.h>
2011-07-04 18:29:18 +06:00
extern void ParallelRun();
namespace netgen
{
MPI_Comm mesh_comm;
}
2009-01-13 04:40:13 +05:00
#endif
2016-07-10 21:07:36 +05:00
#include "../libsrc/interface/writeuser.hpp"
2009-01-13 04:40:13 +05:00
namespace netgen
{
GUI support from Python and some cleanup Squashed commit of the following: commit 5058ceb9351548937487aa94073e7f59236ae9fe Merge: d37f0af 2da1465 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:33:55 2017 +0200 Merge remote-tracking branch 'origin/master' into native_tcl_macos commit d37f0afcc1389c0c3ec0899da9c1af158c926ca5 Author: Matthias <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:27:12 2017 +0200 link gui to netgen, some fixes commit 297141455cd4fab81709c13d6253ad8114beee4a Author: Matthias <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:02:47 2017 +0200 windows fixes commit 9bf290a60835f29762b15ee3b722da132678f90c Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 18:59:53 2017 +0200 More cleanup, proper code separation ... between netgen exectuable and gui library commit f46d438d3c9dd32f9f94642b4ec00b85611ef1dd Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 14:03:53 2017 +0200 fix typos commit b3d301ff4e321189aef469bff77f7cffa7b69e98 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:32:57 2017 +0200 also link tk to togl on windows... commit c3519abee7b041e45c913a45999ed2d29d4ff325 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:30:16 2017 +0200 link TCL to togl on windows commit 80b607436b45f38f4bac2708a78ef03561ad44e5 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:26:45 2017 +0200 linkt TCL only to netgen executable commit 080139a431e949e14cb9f05194e19c5129aca3d3 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:20:36 2017 +0200 fix dll ex/import commit dd68efacb01fbbbe3f136168f12fed41fa3c3c8a Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:15:39 2017 +0200 fix dll export commit 9023b9ca49b4c2b99f228f64564990e2d0246b8c Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 12:06:14 2017 +0200 use system tcl/tk on MacOS, but download tcl/tk for windows commit 16eb4c1b01eb5229f93274791187b2c666bb8b8e Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 12:01:36 2017 +0200 more cleanup commit 6df5b82a7d9a1177a755446d563d6c4b98ff6329 Merge: af23786 2b0d3f0 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 11:45:42 2017 +0200 Merge remote-tracking branch 'origin/master' into native_tcl_macos commit af2378637a6513de3b50841ed6314cd7e12f7205 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 11:45:40 2017 +0200 some cleanup commit 81bbe117efe25df53c71f9ae603c50ee4557703a Author: Joachim Schöberl <joachim.schoeberl@tuwien.ac.at> Date: Tue May 9 20:14:46 2017 +0200 tk-gui commit 387e6da678661dd3b9d75d696733f46fe43d789a Merge: e658b5b e653d8e Author: Joachim Schöberl <joachim.schoeberl@tuwien.ac.at> Date: Tue May 9 18:49:20 2017 +0200 Merge remote-tracking branch 'origin/gui_from_python' into native_tcl_macos commit e658b5b2c1ac3264f4165b5f6d2b821b3b1b0926 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Tue May 9 18:30:35 2017 +0200 use native tcl on macos commit e653d8e6789d20e24b16a68bf760415940e881f8 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 16:37:23 2017 +0200 next fix commit f663c80b00754d141a02fa6abde2077c841bbafb Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 16:23:21 2017 +0200 Fix symbol export on windows commit 70d99782423d33d3fa6f80e758a7377d0cb52840 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 15:14:56 2017 +0200 GUI support from Python Enables experimental support for starting the Netgen GUI from Python directly. To use it, just import the gui module: > import netgen.gui
2017-05-10 22:34:42 +05:00
DLL_HEADER extern Flags parameters;
DLL_HEADER extern bool netgen_executable_started;
2009-01-13 04:40:13 +05:00
}
GUI support from Python and some cleanup Squashed commit of the following: commit 5058ceb9351548937487aa94073e7f59236ae9fe Merge: d37f0af 2da1465 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:33:55 2017 +0200 Merge remote-tracking branch 'origin/master' into native_tcl_macos commit d37f0afcc1389c0c3ec0899da9c1af158c926ca5 Author: Matthias <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:27:12 2017 +0200 link gui to netgen, some fixes commit 297141455cd4fab81709c13d6253ad8114beee4a Author: Matthias <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 19:02:47 2017 +0200 windows fixes commit 9bf290a60835f29762b15ee3b722da132678f90c Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 18:59:53 2017 +0200 More cleanup, proper code separation ... between netgen exectuable and gui library commit f46d438d3c9dd32f9f94642b4ec00b85611ef1dd Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 14:03:53 2017 +0200 fix typos commit b3d301ff4e321189aef469bff77f7cffa7b69e98 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:32:57 2017 +0200 also link tk to togl on windows... commit c3519abee7b041e45c913a45999ed2d29d4ff325 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:30:16 2017 +0200 link TCL to togl on windows commit 80b607436b45f38f4bac2708a78ef03561ad44e5 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:26:45 2017 +0200 linkt TCL only to netgen executable commit 080139a431e949e14cb9f05194e19c5129aca3d3 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:20:36 2017 +0200 fix dll ex/import commit dd68efacb01fbbbe3f136168f12fed41fa3c3c8a Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 13:15:39 2017 +0200 fix dll export commit 9023b9ca49b4c2b99f228f64564990e2d0246b8c Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 12:06:14 2017 +0200 use system tcl/tk on MacOS, but download tcl/tk for windows commit 16eb4c1b01eb5229f93274791187b2c666bb8b8e Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 12:01:36 2017 +0200 more cleanup commit 6df5b82a7d9a1177a755446d563d6c4b98ff6329 Merge: af23786 2b0d3f0 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 11:45:42 2017 +0200 Merge remote-tracking branch 'origin/master' into native_tcl_macos commit af2378637a6513de3b50841ed6314cd7e12f7205 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Wed May 10 11:45:40 2017 +0200 some cleanup commit 81bbe117efe25df53c71f9ae603c50ee4557703a Author: Joachim Schöberl <joachim.schoeberl@tuwien.ac.at> Date: Tue May 9 20:14:46 2017 +0200 tk-gui commit 387e6da678661dd3b9d75d696733f46fe43d789a Merge: e658b5b e653d8e Author: Joachim Schöberl <joachim.schoeberl@tuwien.ac.at> Date: Tue May 9 18:49:20 2017 +0200 Merge remote-tracking branch 'origin/gui_from_python' into native_tcl_macos commit e658b5b2c1ac3264f4165b5f6d2b821b3b1b0926 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Tue May 9 18:30:35 2017 +0200 use native tcl on macos commit e653d8e6789d20e24b16a68bf760415940e881f8 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 16:37:23 2017 +0200 next fix commit f663c80b00754d141a02fa6abde2077c841bbafb Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 16:23:21 2017 +0200 Fix symbol export on windows commit 70d99782423d33d3fa6f80e758a7377d0cb52840 Author: Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at> Date: Mon May 8 15:14:56 2017 +0200 GUI support from Python Enables experimental support for starting the Netgen GUI from Python directly. To use it, just import the gui module: > import netgen.gui
2017-05-10 22:34:42 +05:00
DLL_HEADER extern bool nodisplay;
2009-01-13 04:40:13 +05:00
using netgen::parameters;
using netgen::ngdir;
using netgen::verbose;
2009-01-25 17:35:25 +05:00
using netgen::Array;
2009-01-13 04:40:13 +05:00
using netgen::RegisterUserFormats;
/*
* The following variable is a special hack that is needed in order for
* Sun shared libraries to be used for Tcl.
*/
2009-09-09 02:37:33 +06:00
2009-01-13 04:40:13 +05:00
// extern "C" int matherr();
2009-09-09 02:37:33 +06:00
// int *tclDummyMathPtr = (int *) matherr;
2009-01-13 04:40:13 +05:00
extern "C" int Ng_ServerSocketManagerInit (int port);
extern "C" int Ng_ServerSocketManagerRun (void);
2011-07-15 03:36:19 +06:00
2009-01-13 04:40:13 +05:00
bool shellmode = false;
2013-02-26 19:11:08 +06:00
2009-01-13 04:40:13 +05:00
/*
*
* The Netgen main function
*
*/
int main(int argc, char ** argv)
{
netgen::netgen_executable_started = true;
2012-02-12 08:25:26 +06:00
2009-01-13 04:40:13 +05:00
#ifdef PARALLEL
2012-06-16 18:09:38 +06:00
int mpi_required = MPI_THREAD_MULTIPLE;
#ifdef VTRACE
2012-06-16 18:59:03 +06:00
mpi_required = MPI_THREAD_SINGLE;
2012-06-16 18:09:38 +06:00
#endif
int mpi_provided;
2012-06-13 15:07:11 +06:00
MPI_Init_thread(&argc, &argv, mpi_required, &mpi_provided);
2011-07-15 03:36:19 +06:00
2009-01-13 04:40:13 +05:00
MPI_Comm_size(MPI_COMM_WORLD, &netgen::ntasks);
MPI_Comm_rank(MPI_COMM_WORLD, &netgen::id);
2011-07-15 03:36:19 +06:00
MPI_Comm_dup ( MPI_COMM_WORLD, &netgen::mesh_comm);
2009-01-13 04:40:13 +05:00
#endif
if ( netgen::id == 0 )
{
2009-01-16 01:41:14 +05:00
cout << "NETGEN-" << PACKAGE_VERSION << endl;
2009-01-13 04:40:13 +05:00
2011-01-11 01:18:01 +05:00
cout << "Developed by Joachim Schoeberl at" << endl
2011-02-19 03:50:58 +05:00
<< "2010-xxxx Vienna University of Technology" << endl
2011-01-11 01:18:01 +05:00
<< "2006-2010 RWTH Aachen University" << endl
<< "1996-2006 Johannes Kepler University Linz" << endl;
2009-01-13 04:40:13 +05:00
#ifdef OCCGEOMETRY
cout << "Including OpenCascade geometry kernel" << endl;
#endif
#ifdef ACIS
cout << "Including ACIS geometry kernel" << endl;
#endif
#ifdef LINUX
//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW);
//cout << "Handle Floating Point Exceptions: " << fegetexcept() << endl;
#endif
#ifdef DEBUG
cout << "You are running the debug version !" << endl;
#endif
#ifdef PARALLEL
2012-06-13 15:07:11 +06:00
if (netgen::ntasks == 1)
{
cout << "Run parallel Netgen with 'mpirun -np xy netgen'" << endl;
}
else
{
cout << "Running MPI - parallel using "
<< netgen::ntasks << " processor"
<< ((netgen::ntasks > 1) ? "s " : " ") << endl;
cout << "MPI-version = " << MPI_VERSION << '.' << MPI_SUBVERSION << endl;
if (mpi_provided == MPI_THREAD_MULTIPLE)
cout << "multithreaded MPI is supported" << endl;
}
2009-01-13 04:40:13 +05:00
#endif
}
2011-07-04 18:29:18 +06:00
2009-01-13 04:40:13 +05:00
2012-07-06 13:49:05 +06:00
netgen::h_argc = argc;
netgen::h_argv = argv;
2009-01-13 04:40:13 +05:00
// command line arguments:
for (int i = 1; i < argc; i++)
{
if (argv[i][0] == '-')
parameters.SetCommandLineFlag (argv[i]);
else
{
if (strstr(argv[i], ".py"))
parameters.SetFlag ("py", argv[i]);
else
parameters.SetFlag ("geofile", argv[i]);
}
2009-01-13 04:40:13 +05:00
}
if (getenv ("NETGENDIR") && strlen (getenv ("NETGENDIR")))
ngdir = getenv ("NETGENDIR");
else
ngdir = ".";
verbose = parameters.GetDefineFlag ("V");
if (verbose)
cout << "NETGENDIR = " << ngdir << endl;
2012-02-12 08:25:26 +06:00
2009-01-13 04:40:13 +05:00
if ( netgen::id == 0 )
{
if (parameters.StringFlagDefined ("testout"))
netgen::testout = new ofstream (parameters.GetStringFlag ("testout", "test.out"));
2009-01-13 04:40:13 +05:00
#ifdef SOCKETS
Ng_ServerSocketManagerInit(static_cast<int>(parameters.GetNumFlag("serversocket",-1)));
if(parameters.GetNumFlag("serversocket",-1) > 0 && !parameters.GetDefineFlag("display"))
nodisplay = true;
#endif
if(parameters.GetDefineFlag("batchmode"))
nodisplay = true;
2011-06-16 22:48:54 +06:00
2009-01-13 04:40:13 +05:00
if(parameters.GetDefineFlag("shellmode"))
{
nodisplay = true;
shellmode = true;
}
Tcl_FindExecutable(NULL);
// initialize application
Tcl_Interp * myinterp = Tcl_CreateInterp ();
if (Tcl_AppInit (myinterp) == TCL_ERROR)
{
cerr << "Exit Netgen due to initialization problem" << endl;
exit (1);
}
// parse tcl-script
int errcode;
2009-01-18 00:37:57 +05:00
bool internaltcl = false;
2009-01-13 04:40:13 +05:00
if (shellmode)
internaltcl = false;
if (verbose)
{
cout << "Tcl header version = " << TCL_PATCH_LEVEL << endl;
Tcl_Eval (myinterp, "puts \"Tcl runtime version = [info patchlevel] \";");
}
if (parameters.GetDefineFlag ("internaltcl"))
internaltcl=true;
if (parameters.GetDefineFlag ("externaltcl"))
internaltcl=false;
2009-01-18 00:37:57 +05:00
2009-01-13 04:40:13 +05:00
if (internaltcl)
{
if (verbose)
cout << "using internal Tcl-script" << endl;
// connect to one string
extern const char * ngscript[];
const char ** hcp = ngscript;
int len = 0;
while (*hcp)
len += strlen (*hcp++);
char * tr1 = new char[len+1];
*tr1 = 0;
hcp = ngscript;
char * tt1 = tr1;
while (*hcp)
{
strcat (tt1, *hcp);
tt1 += strlen (*hcp++);
}
errcode = Tcl_Eval (myinterp, tr1);
delete [] tr1;
}
else
{
string startfile = ngdir + "/ng.tcl";
if (verbose)
cout << "Load Tcl-script from " << startfile << endl;
errcode = Tcl_EvalFile (myinterp, (char*)startfile.c_str());
}
if (errcode)
{
cout << "Error in Tcl-Script:" << endl;
// cout << "result = " << myinterp->result << endl;
cout << "result = " << Tcl_GetStringResult (myinterp) << endl;
// cout << "in line " << myinterp->errorLine << endl;
2009-01-13 04:40:13 +05:00
cout << "\nMake sure to set environment variable NETGENDIR to directory containing ng.tcl" << endl;
2009-01-13 04:40:13 +05:00
exit (1);
}
// lookup user file formats and insert into format list:
2009-01-25 17:35:25 +05:00
Array<const char*> userformats;
2009-09-22 13:12:00 +06:00
Array<const char*> extensions;
RegisterUserFormats (userformats, extensions);
2009-01-13 04:40:13 +05:00
ostringstream fstr;
2009-09-22 13:12:00 +06:00
tcl_const char * exportft = Tcl_GetVar (myinterp, "exportfiletype", 0);
2009-01-13 04:40:13 +05:00
for (int i = 1; i <= userformats.Size(); i++)
2009-09-22 13:12:00 +06:00
{
fstr << ".ngmenu.file.filetype add radio -label \""
<< userformats.Get(i) << "\" -variable exportfiletype\n";
fstr << "lappend meshexportformats { {" << userformats.Get(i) << "} {" << extensions.Get(i) << "} }\n";
}
2009-01-13 04:40:13 +05:00
Tcl_Eval (myinterp, (char*)fstr.str().c_str());
2009-09-22 13:12:00 +06:00
Tcl_SetVar (myinterp, "exportfiletype", exportft, 0);
2009-01-13 04:40:13 +05:00
#ifdef SOCKETS
Ng_ServerSocketManagerRun();
#endif
// start event-loop
Tk_MainLoop();
Tcl_DeleteInterp (myinterp);
Tcl_Exit(0);
}
2011-07-04 18:29:18 +06:00
2009-01-13 04:40:13 +05:00
#ifdef PARALLEL
else
{
ParallelRun();
MPI_Finalize();
}
2011-07-04 18:29:18 +06:00
2009-01-13 04:40:13 +05:00
#endif
return 0;
}
2009-01-18 05:25:35 +05:00
/*
2009-01-13 04:40:13 +05:00
extern "C" int Tix_Init (Tcl_Interp * interp);
extern "C" int Itcl_Init (Tcl_Interp * interp);
extern "C" int Itk_Init (Tcl_Interp * interp);
2009-01-18 05:25:35 +05:00
*/
2009-01-13 04:40:13 +05:00
extern "C" int Ng_Init (Tcl_Interp * interp);
extern "C" int Ng_Vis_Init (Tcl_Interp * interp);
// extern Tcl_PackageInitProc * Tk_SafeInit;
/*
*
* Initialize packages
*
*/
2009-04-05 17:30:37 +06:00
// extern "C" int NGSolve_Init (Tcl_Interp * interp);
2009-01-13 04:40:13 +05:00
int Tcl_AppInit(Tcl_Interp * interp)
{
if (Tcl_Init(interp) == TCL_ERROR) {
cerr << "Problem in Tcl_Init: " << endl;
cout << "result = " << Tcl_GetStringResult (interp) << endl;
// cerr << interp->result << endl;
2009-01-13 04:40:13 +05:00
// return TCL_ERROR;
}
if (!nodisplay && Tk_Init(interp) == TCL_ERROR) {
cerr << "Problem in Tk_Init: " << endl;
cout << "result = " << Tcl_GetStringResult (interp) << endl;
// cerr << interp->result << endl;
2009-01-13 04:40:13 +05:00
// return TCL_ERROR;
}
#ifdef TRAFO
// extern int Trafo_Init (Tcl_Interp * interp);
// if (Trafo_Init(interp) == TCL_ERROR)
// {
// cerr << "Problem in Trafo_Init: " << endl;
// cerr << interp->result << endl;
// return TCL_ERROR;
// }
#endif
#ifdef EBGELAST
extern int EBGElast_Init (Tcl_Interp * interp);
if(EBGElast_Init(interp) == TCL_ERROR)
{
cerr << "Problem in EBGElast_Init: " << endl;
cerr << interp->result << endl;
return TCL_ERROR;
}
#endif
#ifdef SMALLTRAFO
extern int SmallModels_Init (Tcl_Interp * interp);
if(SmallModels_Init(interp) == TCL_ERROR)
{
cerr << "Problem in SmallModel_Init: " << endl;
cerr << interp->result << endl;
return TCL_ERROR;
}
#endif
#ifdef SOCKETS
extern int Ng_Socket_Init (Tcl_Interp * interp);
if ( Ng_Socket_Init(interp) == TCL_ERROR)
{
cerr << "Problem in Ng_Socket_Init: " << endl;
cerr << interp->result << endl;
return TCL_ERROR;
}
#endif
#ifdef ZUGSTANGE
extern int Zugstange_Init (Tcl_Interp * interp);
if (Zugstange_Init(interp) == TCL_ERROR)
{
cerr << "Problem in Zugstange_Init: " << endl;
cerr << interp->result << endl;
return TCL_ERROR;
}
#endif
Tcl_StaticPackage(interp, "Tk", Tk_Init, 0);
return TCL_OK;
}
2013-02-26 19:11:08 +06:00