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()37void 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