@@ -173,7 +173,7 @@ void CInterpolator::ReconstructBoundary(unsigned long val_zone, int val_marker){
173173
174174 unsigned long iVertex, kVertex ;
175175
176- unsigned long *uptr, dPoint, EdgeIndex, jEdge, nEdges, nNodes, nVertex, iDim, nDim, iPoint;
176+ unsigned long *uptr, nVertex, iDim, nDim, iPoint;
177177
178178 unsigned long nGlobalLinkedNodes, nLocalVertex, nLocalLinkedNodes;
179179
@@ -184,94 +184,88 @@ void CInterpolator::ReconstructBoundary(unsigned long val_zone, int val_marker){
184184 else
185185 nVertex = 0 ;
186186
187+ /* --- Get the number of domain vertices on the marker, and a mapping
188+ * (iVertex) -> (iLocalVertex, non-domain points being ignored). ---*/
189+ unsigned long * iVertex_to_iLocalVertex = new unsigned long [ nVertex ];
190+ nLocalVertex = 0 ;
191+ for (iVertex = 0 ; iVertex < nVertex; iVertex++) {
192+ iPoint = geom->vertex [val_marker][iVertex]->GetNode ();
193+ if (geom->nodes ->GetDomain (iPoint)){
194+ iVertex_to_iLocalVertex[iVertex] = nLocalVertex;
195+ nLocalVertex++;
196+ } else {
197+ iVertex_to_iLocalVertex[iVertex] = numeric_limits<unsigned long >::max ();
198+ }
199+ }
187200
188- su2double *Buffer_Send_Coord = new su2double [ nVertex * nDim ];
201+ // coordinates of all domain vertices on the marker
202+ su2double *Buffer_Send_Coord = new su2double [ nLocalVertex * nDim ];
203+ // global point IDs of all domain vertices on the marker
189204 unsigned long *Buffer_Send_GlobalPoint = new unsigned long [ nVertex ];
190205
191- unsigned long *Buffer_Send_nLinkedNodes = new unsigned long [ nVertex ];
192- unsigned long *Buffer_Send_StartLinkedNodes = new unsigned long [ nVertex ];
193- unsigned long **Aux_Send_Map = new unsigned long *[ nVertex ];
194-
195- /* --- Copy coordinates and point to the auxiliar vector ---*/
196-
197- nGlobalVertex = 0 ;
198- nLocalVertex = 0 ;
199- nLocalLinkedNodes = 0 ;
206+ // Assign to each domain vertex on the marker, identified by local point ID,
207+ // a set of surface-neighbor vertices on the marker, identified by global point ID.
208+ map<unsigned long , set<unsigned long >*> neighbors;
200209
210+ /* --- Define or initialize them. ---*/
201211 for (iVertex = 0 ; iVertex < nVertex; iVertex++) {
202-
203- Buffer_Send_nLinkedNodes[iVertex] = 0 ;
204- Aux_Send_Map[iVertex] = nullptr ;
205-
206212 iPoint = geom->vertex [val_marker][iVertex]->GetNode ();
207-
208213 if (geom->nodes ->GetDomain (iPoint)) {
209- Buffer_Send_GlobalPoint[nLocalVertex] = geom-> nodes -> GetGlobalIndex (iPoint) ;
210-
214+ unsigned long iLocalVertex = iVertex_to_iLocalVertex[iVertex] ;
215+ Buffer_Send_GlobalPoint[iLocalVertex] = geom-> nodes -> GetGlobalIndex (iPoint);
211216 for (iDim = 0 ; iDim < nDim; iDim++)
212- Buffer_Send_Coord[nLocalVertex*nDim+iDim] = geom->nodes ->GetCoord (iPoint, iDim);
213-
214- nNodes = 0 ;
215- nEdges = geom->nodes ->GetnPoint (iPoint);
216-
217- for (jEdge = 0 ; jEdge < nEdges; jEdge++){
218- EdgeIndex = geom->nodes ->GetEdge (iPoint, jEdge);
219-
220- if ( iPoint == geom->edges ->GetNode (EdgeIndex,0 ) )
221- dPoint = geom->edges ->GetNode (EdgeIndex,1 );
222- else
223- dPoint = geom->edges ->GetNode (EdgeIndex,0 );
224-
225- if ( geom->nodes ->GetVertex (dPoint, val_marker) != -1 )
226- nNodes++;
227- }
228-
229- Buffer_Send_StartLinkedNodes[nLocalVertex] = nLocalLinkedNodes;
230- Buffer_Send_nLinkedNodes[nLocalVertex] = nNodes;
231-
232- nLocalLinkedNodes += nNodes;
233-
234- Aux_Send_Map[nLocalVertex] = new unsigned long [ nNodes ];
235- nNodes = 0 ;
236-
237- for (jEdge = 0 ; jEdge < nEdges; jEdge++){
238- EdgeIndex = geom->nodes ->GetEdge (iPoint, jEdge);
239-
240- if ( iPoint == geom->edges ->GetNode (EdgeIndex,0 ) )
241- dPoint = geom->edges ->GetNode (EdgeIndex,1 );
242- else
243- dPoint = geom->edges ->GetNode (EdgeIndex,0 );
217+ Buffer_Send_Coord[iLocalVertex*nDim+iDim] = geom->nodes ->GetCoord (iPoint, iDim);
218+ neighbors[iPoint] = new set<unsigned long >;
219+ }
220+ }
244221
245- if ( geom->nodes ->GetVertex (dPoint, val_marker) != -1 ){
246- // Though we store global indices here, they will be later replaced by
247- // the index to Buffer_Receive_nLinkedNodes, Buffer_Receive_StartLinkedNodes etc.
248- Aux_Send_Map[nLocalVertex][nNodes] = geom->nodes ->GetGlobalIndex (dPoint);
249- nNodes++;
250- }
222+ /* --- Define the neighbors map. ---*/
223+ for (unsigned long iElem; iElem < geom->nElem_Bound [val_marker]; iElem++){
224+ CPrimalGrid* elem = geom->bound [val_marker][iElem];
225+ for (unsigned short iNode=0 ; iNode<elem->GetnNodes (); iNode++){
226+ unsigned short iPoint = elem->GetNode (iNode);
227+ for (unsigned short iNeighbor=0 ; iNeighbor<elem->GetnNeighbor_Nodes (iNeighbor); iNeighbor++){
228+ unsigned long jPoint = elem->GetNode ( elem->GetNeighbor_Nodes (iNode,iNeighbor) );
229+ unsigned long jPoint_global = geom->nodes ->GetGlobalIndex (jPoint);
230+ neighbors[iPoint]->insert ( jPoint_global );
251231 }
252- nLocalVertex++;
253232 }
254233 }
255234
256- unsigned long *Buffer_Send_LinkedNodes = new unsigned long [ nLocalLinkedNodes ];
257-
235+ // numbers of surface-neighbors of all domain vertices on the marker
236+ unsigned long *Buffer_Send_nLinkedNodes = new unsigned long [ nLocalVertex ];
237+ // cumsum of Buffer_Send_nLinkedNodes
238+ unsigned long *Buffer_Send_StartLinkedNodes = new unsigned long [ nLocalVertex ];
258239 nLocalLinkedNodes = 0 ;
259-
260- for (iVertex = 0 ; iVertex < nLocalVertex; iVertex++){
261- for (jEdge = 0 ; jEdge < Buffer_Send_nLinkedNodes[iVertex]; jEdge++){
262- Buffer_Send_LinkedNodes[nLocalLinkedNodes] = Aux_Send_Map[iVertex][jEdge];
263- nLocalLinkedNodes++;
240+ for (iVertex = 0 ; iVertex < nVertex; iVertex++) {
241+ iPoint = geom->vertex [val_marker][iVertex]->GetNode ();
242+ if (geom->nodes ->GetDomain (iPoint)) {
243+ unsigned long iLocalVertex = iVertex_to_iLocalVertex[iVertex];
244+ Buffer_Send_nLinkedNodes[iLocalVertex] = neighbors[iPoint]->size ();
245+ Buffer_Send_StartLinkedNodes[iLocalVertex] = nLocalLinkedNodes;
246+ nLocalLinkedNodes += Buffer_Send_nLinkedNodes[iLocalVertex];
264247 }
265248 }
266-
267- for (iVertex = 0 ; iVertex < nVertex; iVertex++){
268- if ( Aux_Send_Map[iVertex] != nullptr )
269- delete [] Aux_Send_Map[iVertex];
249+ // global point IDs of surface-neighbors of all domain vertices on the marker
250+ unsigned long *Buffer_Send_LinkedNodes = new unsigned long [ nLocalLinkedNodes ];
251+ unsigned long index = 0 ;
252+ for (iVertex = 0 ; iVertex < nVertex; iVertex++) {
253+ iPoint = geom->vertex [val_marker][iVertex]->GetNode ();
254+ if (geom->nodes ->GetDomain (iPoint)) {
255+ for (unsigned long jPoint_global : *(neighbors[iPoint])){
256+ Buffer_Send_LinkedNodes[index] = jPoint_global;
257+ index++;
258+ }
259+ delete neighbors[iPoint];
260+ neighbors[iPoint]=nullptr ;
261+ }
270262 }
271- delete [] Aux_Send_Map; Aux_Send_Map = nullptr ;
272263
273- /* --- Now the arrays of all processes must be joined to a single/global arrays, StartLinkedNodes indices must be shifted,
274- * and the global point IDs in LinkedNodes are replaced by global vertex IDs.
264+
265+
266+ /* --- Now these arrays of all processes must be joined to a single/global arrays. For this,
267+ * the entries of StartLinkedNodes must be shifted.
268+ * Furthermore, the global point IDs in LinkedNodes are replaced by global vertex IDs.
275269 * For this, the master process collects the data from all processes, joins them and broadcasts them again. ---*/
276270
277271 /* --- Allocate global arrays. ---*/
0 commit comments