Skip to content

Commit 1925cb3

Browse files
committed
Consider only surface-neighbors, not volume-neighbors
in CInterpolator::ReconstructBoundary.
1 parent dbf073c commit 1925cb3

1 file changed

Lines changed: 65 additions & 71 deletions

File tree

Common/src/interface_interpolation/CInterpolator.cpp

Lines changed: 65 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)