@@ -61,17 +61,19 @@ void polympo_setMPICommunicator_f(MPMesh_ptr p_mpmesh, MPI_Fint fcomm){
6161
6262void polympo_createMPs_f (MPMesh_ptr p_mpmesh,
6363 const int numElms,
64- const int numMPs, // total number of MPs which is GREATER than or equal to number of active MPs
64+ const int numMPs, // total nof of MPs which is >= no of active MPs
6565 int * mpsPerElm,
6666 const int * mp2Elm,
6767 const int * isMPActive) {
6868 checkMPMeshValid (p_mpmesh);
69-
69+ std::cout<<__FUNCTION__<<std::endl;
7070 // the mesh must be fixed/set before adding MPs
7171 auto p_mesh = ((polyMPO::MPMesh*)p_mpmesh)->p_mesh ;
7272 PMT_ALWAYS_ASSERT (!p_mesh->meshEditable ());
7373 PMT_ALWAYS_ASSERT (p_mesh->getNumElements () == numElms);
7474
75+ // Find the total no of MPs across all ranks
76+ // And loop over all MPs and find the smallest element id associated across a MP
7577 int numActiveMPs = 0 ;
7678 int minElmID = numElms+1 ;
7779 for (int i = 0 ; i < numMPs; i++) {
@@ -82,20 +84,27 @@ void polympo_createMPs_f(MPMesh_ptr p_mpmesh,
8284 }
8385 }
8486 }
85- // TODO do we care about empty ranks? check just in case...
86- PMT_ALWAYS_ASSERT (numActiveMPs>0 );
87-
88- int firstElmWithMPs=-1 ;
87+ long long globalNumActiveMPs = 0 ;
88+ int globalMinElmID;
89+ MPI_Allreduce (&numActiveMPs, &globalNumActiveMPs, 1 , MPI_LONG_LONG_INT, MPI_SUM, MPI_COMM_WORLD);
90+ MPI_Allreduce (&minElmID, &globalMinElmID, 1 , MPI_INT, MPI_MIN, MPI_COMM_WORLD);
91+ PMT_ALWAYS_ASSERT (globalNumActiveMPs>0 );
92+
93+ // Loop over all mesh elements 0,1,... and find the first element that has an associated MP
94+ int firstElmWithMPs=numElms+1 ;
8995 for (int i=0 ; i<numElms; i++) {
9096 if (mpsPerElm[i]) {
9197 firstElmWithMPs = i;
9298 break ;
9399 }
94100 }
101+ int globalFirstElmWithMPs;
102+ MPI_Allreduce (&firstElmWithMPs, &globalFirstElmWithMPs, 1 , MPI_INT, MPI_MIN, MPI_COMM_WORLD);
103+
95104 int offset = -1 ;
96- if (minElmID-firstElmWithMPs ==1 ) {
105+ if (globalMinElmID-globalFirstElmWithMPs ==1 ) {
97106 offset = 1 ;
98- }else if (minElmID-firstElmWithMPs ==0 ){
107+ }else if (globalMinElmID-globalFirstElmWithMPs ==0 ){
99108 offset = 0 ;
100109 }else {
101110 fprintf (stderr," The minElmID is incorrect! Offset is wrong!\n " );
@@ -116,12 +125,18 @@ void polympo_createMPs_f(MPMesh_ptr p_mpmesh,
116125 auto mpsPerElm_d = create_mirror_view_and_copy (mpsPerElm, numElms);
117126 auto active_mp2Elm_d = create_mirror_view_and_copy (active_mp2Elm.data (), numActiveMPs);
118127 auto active_mpIDs_d = create_mirror_view_and_copy (active_mpIDs.data (), numActiveMPs);
119-
128+
120129 delete ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
121130 ((polyMPO::MPMesh*)p_mpmesh)->p_MPs =
122131 new polyMPO::MaterialPoints (numElms, numActiveMPs, mpsPerElm_d, active_mp2Elm_d, active_mpIDs_d);
132+
123133 auto p_MPs = ((polyMPO::MPMesh*)p_mpmesh)->p_MPs ;
124134 p_MPs->setElmIDoffset (offset);
135+
136+ assert (cudaDeviceSynchronize () == cudaSuccess);
137+ MPI_Barrier (MPI_COMM_WORLD);
138+ printf (" Foo1\n " );
139+
125140}
126141
127142void polympo_startRebuildMPs_f (MPMesh_ptr p_mpmesh,
0 commit comments