1 #ifdef PARALLEL
2 
3 #include "dlfcn.h"
4 
5 
6 // #include <mystdlib.h>
7 
8 #include <meshing.hpp>
9 
10 // #include <visual.hpp>
11 
12 
13 #include <meshing.hpp>
14 
15 void (*NGS_ParallelRun) (const string & message) = NULL;
16 
17 
18 namespace netgen
19 {
20 #include "../interface/writeuser.hpp"
21   extern string ngdir;
22 }
23 
24 void Parallel_Exit();
25 
26 
27 namespace netgen {
28   extern AutoPtr<Mesh>  mesh;
29   // extern VisualSceneMesh vsmesh;
30   extern NGLIB_API MeshingParameters mparam;
31 }
32 
33 using namespace netgen;
34 using netgen::RegisterUserFormats;
35 
36 
ParallelRun()37 void ParallelRun()
38 {
39   string message;
40   MPI_Status status;
41 
42 
43   MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
44   MPI_Comm_rank(MPI_COMM_WORLD, &id);
45 
46   while ( true )
47     {
48       message = MyMPI_RecvCmd();
49 
50       if ( message.compare(0, 3, "ngs") == 0 )
51         {
52 	  if (NGS_ParallelRun == NULL)
53 	    {
54 	      static int timer = NgProfiler::CreateTimer ("load shared library ngsolve");
55 	      NgProfiler::RegionTimer reg (timer);
56 
57 
58 	      void * handle = dlopen ("libngsolve.so", RTLD_NOW | RTLD_GLOBAL);
59 	      if (!handle)
60 		{
61 		  cerr << "cannot load shared library libngsolve.so" << endl;
62 		  exit(1);
63 		}
64 
65 	      NGS_ParallelRun = (void (*) (const string & message))  dlsym (handle, "NGS_ParallelRun");
66 
67 	      if (!NGS_ParallelRun)
68 		{
69 		  cerr << "cannot bind function NGS_ParallelRun" << endl;
70 		  exit(1);
71 		}
72 	    }
73           (*NGS_ParallelRun) (message);
74         }
75       else if ( message == "mesh" )
76 	{
77 	  VT_USER_START ("Mesh::ReceiveParallelMesh");
78 	  mesh.Reset( new netgen::Mesh);
79 	  mesh->SendRecvMesh();
80 	  VT_USER_END ("Mesh::ReceiveParallelMesh");
81 	}
82 
83       else if ( message == "visualize" )
84 	{
85 	  cout << "parallel message visualize depreciated" << endl;
86 	}
87 
88       else if ( message == "bcastparthread" )
89 	{
90 	  MyMPI_Bcast (mparam.parthread);
91 	}
92 
93       else if ( message ==  "end" )
94 	{
95 	  break;
96 	}
97 
98       else
99 	{
100 	  PrintMessage ( 1, "received unidentified message '" + message + "'\n");
101 	  break;
102 	}
103 
104     }
105 }
106 
107 #endif
108