Changeset 2506 for XIOS2/trunk/extern/remap/src/mapper.cpp
- Timestamp:
- 05/31/23 12:20:29 (13 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS2/trunk/extern/remap/src/mapper.cpp
r1639 r2506 145 145 nIntersections++; 146 146 } 147 147 148 /* overallocate for NMAX neighbours for each elements */ 149 /* 148 150 remapMatrix = new double[nIntersections*NMAX]; 149 151 srcAddress = new int[nIntersections*NMAX]; … … 152 154 sourceWeightId =new long[nIntersections*NMAX]; 153 155 targetWeightId =new long[nIntersections*NMAX]; 154 156 */ 155 157 156 158 if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; … … 186 188 187 189 int *nbSendElement = new int[mpiSize]; 190 int *nbSendVertex = new int[mpiSize]; 188 191 int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 189 192 double **recvValue = new double*[mpiSize]; 190 193 double **recvArea = new double*[mpiSize]; 191 194 double **recvGivenArea = new double*[mpiSize]; 195 int **recvVertexOffset = new int*[mpiSize]; 192 196 Coord **recvGrad = new Coord*[mpiSize]; 193 197 GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ … … 210 214 { 211 215 sendElement[rank] = new int[nbSendElement[rank]]; 212 recvValue[rank] = new double[nbSendElement[rank]];213 recvArea[rank] = new double[nbSendElement[rank]];214 recvGivenArea[rank] = new double[nbSendElement[rank]];215 if (order == 2)216 {217 recvNeighIds[rank] = new GloId[nbSendElement[rank]*(NMAX+1)];218 recvGrad[rank] = new Coord[nbSendElement[rank]*(NMAX+1)];219 }220 else221 recvNeighIds[rank] = new GloId[nbSendElement[rank]];222 223 216 last = -1; 224 217 index = -1; … … 235 228 /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 236 229 int *nbRecvElement = new int[mpiSize]; 230 int *nbRecvVertex = new int[mpiSize]; 237 231 MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 238 232 … … 244 238 double **sendArea = new double*[mpiSize]; 245 239 double **sendGivenArea = new double*[mpiSize]; 240 int **sendVertexOffset = new int*[mpiSize]; 246 241 Coord **sendGrad = new Coord*[mpiSize]; 247 242 GloId **sendNeighIds = new GloId*[mpiSize]; 248 MPI_Request *sendRequest = new MPI_Request[ 5*mpiSize];249 MPI_Request *recvRequest = new MPI_Request[ 5*mpiSize];243 MPI_Request *sendRequest = new MPI_Request[6*mpiSize]; 244 MPI_Request *recvRequest = new MPI_Request[6*mpiSize]; 250 245 for (int rank = 0; rank < mpiSize; rank++) 251 246 { … … 259 254 { 260 255 recvElement[rank] = new int[nbRecvElement[rank]]; 256 MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 257 nbRecvRequest++; 258 } 259 } 260 MPI_Status *status = new MPI_Status[6*mpiSize]; 261 262 MPI_Waitall(nbSendRequest, sendRequest, status); 263 MPI_Waitall(nbRecvRequest, recvRequest, status); 264 265 nbSendRequest = 0; 266 nbRecvRequest = 0; 267 268 for (int rank = 0; rank < mpiSize; rank++) 269 { 270 if (nbRecvElement[rank] > 0) 271 { 272 nbRecvVertex[rank]=0 ; 273 for (int j = 0; j < nbRecvElement[rank]; j++) nbRecvVertex[rank]+=sstree.localElements[recvElement[rank][j]].n+1; 274 MPI_Issend(&nbRecvVertex[rank], 1, MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 275 nbSendRequest++; 276 } 277 278 if (nbSendElement[rank] > 0) 279 { 280 MPI_Irecv(&nbSendVertex[rank], 1, MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 281 nbRecvRequest++; 282 } 283 } 284 285 MPI_Waitall(nbSendRequest, sendRequest, status); 286 MPI_Waitall(nbRecvRequest, recvRequest, status); 287 288 289 /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 290 nbSendRequest = 0; 291 nbRecvRequest = 0; 292 for (int rank = 0; rank < mpiSize; rank++) 293 { 294 if (nbRecvElement[rank] > 0) 295 { 261 296 sendValue[rank] = new double[nbRecvElement[rank]]; 262 297 sendArea[rank] = new double[nbRecvElement[rank]]; 263 298 sendGivenArea[rank] = new double[nbRecvElement[rank]]; 299 sendVertexOffset[rank] = new int[nbRecvElement[rank]]; 300 264 301 if (order == 2) 265 302 { 266 sendNeighIds[rank] = new GloId[nbRecvElement[rank]*(NMAX+1)]; 267 sendGrad[rank] = new Coord[nbRecvElement[rank]*(NMAX+1)]; 268 } 269 else 270 { 271 sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 272 } 273 MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 274 nbRecvRequest++; 275 } 276 } 277 MPI_Status *status = new MPI_Status[5*mpiSize]; 278 279 MPI_Waitall(nbSendRequest, sendRequest, status); 280 MPI_Waitall(nbRecvRequest, recvRequest, status); 281 282 /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 283 nbSendRequest = 0; 284 nbRecvRequest = 0; 285 for (int rank = 0; rank < mpiSize; rank++) 286 { 287 if (nbRecvElement[rank] > 0) 288 { 303 sendNeighIds[rank] = new GloId[nbRecvVertex[rank]]; 304 sendGrad[rank] = new Coord[nbRecvVertex[rank]]; 305 } 306 else sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 307 289 308 int jj = 0; // jj == j if no weight writing 309 sendVertexOffset[rank][0]=0 ; 290 310 for (int j = 0; j < nbRecvElement[rank]; j++) 291 311 { … … 293 313 sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 294 314 sendGivenArea[rank][j] = sstree.localElements[recvElement[rank][j]].given_area; 315 316 if (j==0) 317 { 318 if (order==2) sendVertexOffset[rank][j]=sstree.localElements[recvElement[rank][j]].n+1 ; 319 else sendVertexOffset[rank][j]=1 ; 320 } 321 else 322 { 323 if (order == 2) sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+sstree.localElements[recvElement[rank][j]].n+1 ; 324 else sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+1 ; 325 } 326 295 327 if (order == 2) 296 328 { … … 299 331 sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 300 332 jj++; 301 for (int i = 0; i < NMAX; i++)333 for (int i = 0; i < sstree.localElements[recvElement[rank][j]].n ; i++) 302 334 { 303 335 sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; … … 316 348 MPI_Issend(sendGivenArea[rank], nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 317 349 nbSendRequest++; 350 MPI_Issend(sendVertexOffset[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 351 nbSendRequest++; 352 318 353 if (order == 2) 319 354 { 320 MPI_Issend(sendGrad[rank], 3*nbRecv Element[rank]*(NMAX+1), MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]);355 MPI_Issend(sendGrad[rank], 3*nbRecvVertex[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 321 356 nbSendRequest++; 322 MPI_Issend(sendNeighIds[rank], 4*nbRecv Element[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]);357 MPI_Issend(sendNeighIds[rank], 4*nbRecvVertex[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 323 358 //ym --> attention taille GloId 324 359 nbSendRequest++; … … 333 368 if (nbSendElement[rank] > 0) 334 369 { 370 recvValue[rank] = new double[nbSendElement[rank]]; 371 recvArea[rank] = new double[nbSendElement[rank]]; 372 recvGivenArea[rank] = new double[nbSendElement[rank]]; 373 recvVertexOffset[rank] = new int[nbSendElement[rank]]; 374 375 if (order == 2) 376 { 377 recvNeighIds[rank] = new GloId[nbSendVertex[rank]]; 378 recvGrad[rank] = new Coord[nbSendVertex[rank]]; 379 } 380 else recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 381 382 335 383 MPI_Irecv(recvValue[rank], nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 336 384 nbRecvRequest++; … … 339 387 MPI_Irecv(recvGivenArea[rank], nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 340 388 nbRecvRequest++; 389 MPI_Irecv(recvVertexOffset[rank], nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 390 nbRecvRequest++; 391 341 392 if (order == 2) 342 393 { 343 MPI_Irecv(recvGrad[rank], 3*nbSendElement[rank]*(NMAX+1), 344 MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 394 MPI_Irecv(recvGrad[rank], 3*nbSendVertex[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 345 395 nbRecvRequest++; 346 MPI_Irecv(recvNeighIds[rank], 4*nbSend Element[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]);396 MPI_Irecv(recvNeighIds[rank], 4*nbSendVertex[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 347 397 //ym --> attention taille GloId 348 398 nbRecvRequest++; … … 357 407 } 358 408 359 409 MPI_Waitall(nbSendRequest, sendRequest, status); 360 410 MPI_Waitall(nbRecvRequest, recvRequest, status); 361 411 … … 388 438 389 439 /* first order: src value times weight (weight = supermesh area), later divide by target area */ 390 int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 391 GloId neighID = recvNeighIds[rank][kk]; 440 // int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 441 int offset ; 442 int nvertex ; 443 if (n1==0) 444 { 445 offset=0 ; 446 nvertex=recvVertexOffset[rank][0] ; 447 } 448 else 449 { 450 offset = recvVertexOffset[rank][n1-1]; 451 nvertex = recvVertexOffset[rank][n1]-recvVertexOffset[rank][n1-1]; 452 } 453 454 GloId neighID = recvNeighIds[rank][offset]; 392 455 wgt_map[neighID] += w; 393 456 394 457 if (order == 2) 395 458 { 396 for (int k = 0; k < NMAX+1; k++)459 for (int k = 0; k < nvertex; k++) 397 460 { 398 int kk = n1 * (NMAX + 1)+ k;461 int kk = offset + k; 399 462 GloId neighID = recvNeighIds[rank][kk]; 400 463 if (neighID.ind != -1) wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); … … 414 477 for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 415 478 { 416 if (quantity) this->remapMatrix [i] = (it->second ) / renorm;417 else this->remapMatrix [i] = (it->second / e.area) / renorm;418 this->srcAddress [i] = it->first.ind;419 this->srcRank [i] = it->first.rank;420 this->dstAddress [i] = j;421 this->sourceWeightId [i]= it->first.globalId;422 this->targetWeightId [i]= targetGlobalId[j];479 if (quantity) this->remapMatrix.push_back((it->second ) / renorm); 480 else this->remapMatrix.push_back((it->second / e.area) / renorm); 481 this->srcAddress.push_back(it->first.ind); 482 this->srcRank.push_back(it->first.rank); 483 this->dstAddress.push_back(j); 484 this->sourceWeightId.push_back(it->first.globalId) ; 485 this->targetWeightId.push_back(targetGlobalId[j]) ; 423 486 i++; 424 487 } … … 434 497 delete[] recvArea[rank]; 435 498 delete[] recvGivenArea[rank]; 499 delete[] recvVertexOffset[rank]; 436 500 if (order == 2) 437 501 { … … 446 510 delete[] sendArea[rank]; 447 511 delete[] sendGivenArea[rank]; 512 delete[] sendVertexOffset[rank]; 448 513 if (order == 2) 449 514 delete[] sendGrad[rank]; … … 457 522 delete[] nbSendElement; 458 523 delete[] nbRecvElement; 524 delete[] nbSendVertex; 525 delete[] nbRecvVertex; 459 526 delete[] sendElement; 460 527 delete[] recvElement; … … 939 1006 Mapper::~Mapper() 940 1007 { 941 delete [] remapMatrix; 942 delete [] srcAddress; 943 delete [] srcRank; 944 delete [] dstAddress; 945 if (neighbourElements) delete [] neighbourElements; 946 } 947 948 } 1008 1009 } 1010 1011 }
Note: See TracChangeset
for help on using the changeset viewer.