Ignore:
Timestamp:
07/24/23 11:55:12 (11 months ago)
Author:
jderouillat
Message:

Backport 2506 : limitation of number of vertex max in remaper

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/extern/remap/src/mapper.cpp

    r2269 r2538  
    154154      nIntersections++; 
    155155  } 
     156 
    156157  /* overallocate for NMAX neighbours for each elements */ 
     158/* 
    157159  remapMatrix = new double[nIntersections*NMAX]; 
    158160  srcAddress = new int[nIntersections*NMAX]; 
     
    161163  sourceWeightId =new long[nIntersections*NMAX]; 
    162164  targetWeightId =new long[nIntersections*NMAX]; 
    163  
     165*/ 
    164166 
    165167  if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; 
     
    195197 
    196198  int *nbSendElement = new int[mpiSize]; 
     199  int *nbSendVertex = new int[mpiSize]; 
    197200  int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 
    198201  double **recvValue = new double*[mpiSize]; 
    199202  double **recvArea = new double*[mpiSize]; 
    200203  double **recvGivenArea = new double*[mpiSize]; 
     204  int **recvVertexOffset = new int*[mpiSize]; 
    201205  Coord **recvGrad = new Coord*[mpiSize]; 
    202206  GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ 
     
    219223    { 
    220224      sendElement[rank] = new int[nbSendElement[rank]]; 
    221       recvValue[rank]   = new double[nbSendElement[rank]]; 
    222       recvArea[rank]    = new double[nbSendElement[rank]]; 
    223       recvGivenArea[rank] = new double[nbSendElement[rank]]; 
    224       if (order == 2) 
    225       { 
    226         recvNeighIds[rank] = new GloId[nbSendElement[rank]*(NMAX+1)]; 
    227         recvGrad[rank]    = new Coord[nbSendElement[rank]*(NMAX+1)]; 
    228       } 
    229       else 
    230         recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
    231  
    232225      last = -1; 
    233226      index = -1; 
     
    244237  /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 
    245238  int *nbRecvElement = new int[mpiSize]; 
     239  int *nbRecvVertex = new int[mpiSize]; 
    246240  MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 
    247241 
     
    253247  double **sendArea = new double*[mpiSize]; 
    254248  double **sendGivenArea = new double*[mpiSize]; 
     249  int    **sendVertexOffset = new int*[mpiSize]; 
    255250  Coord **sendGrad = new Coord*[mpiSize]; 
    256251  GloId **sendNeighIds = new GloId*[mpiSize]; 
    257   MPI_Request *sendRequest = new MPI_Request[5*mpiSize]; 
    258   MPI_Request *recvRequest = new MPI_Request[5*mpiSize]; 
     252  MPI_Request *sendRequest = new MPI_Request[6*mpiSize]; 
     253  MPI_Request *recvRequest = new MPI_Request[6*mpiSize]; 
    259254  for (int rank = 0; rank < mpiSize; rank++) 
    260255  { 
     
    268263    { 
    269264      recvElement[rank] = new int[nbRecvElement[rank]]; 
     265      MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     266      nbRecvRequest++; 
     267    } 
     268  } 
     269  MPI_Status *status = new MPI_Status[6*mpiSize]; 
     270   
     271  MPI_Waitall(nbSendRequest, sendRequest, status); 
     272  MPI_Waitall(nbRecvRequest, recvRequest, status); 
     273 
     274  nbSendRequest = 0; 
     275  nbRecvRequest = 0; 
     276 
     277  for (int rank = 0; rank < mpiSize; rank++) 
     278  { 
     279    if (nbRecvElement[rank] > 0) 
     280    { 
     281      nbRecvVertex[rank]=0 ; 
     282      for (int j = 0; j < nbRecvElement[rank]; j++) nbRecvVertex[rank]+=sstree.localElements[recvElement[rank][j]].n+1; 
     283      MPI_Issend(&nbRecvVertex[rank], 1, MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     284      nbSendRequest++; 
     285    } 
     286   
     287    if (nbSendElement[rank] > 0) 
     288    { 
     289      MPI_Irecv(&nbSendVertex[rank], 1, MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     290      nbRecvRequest++; 
     291    } 
     292  } 
     293   
     294  MPI_Waitall(nbSendRequest, sendRequest, status); 
     295  MPI_Waitall(nbRecvRequest, recvRequest, status); 
     296 
     297 
     298  /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
     299  nbSendRequest = 0; 
     300  nbRecvRequest = 0; 
     301  for (int rank = 0; rank < mpiSize; rank++) 
     302  { 
     303    if (nbRecvElement[rank] > 0) 
     304    { 
    270305      sendValue[rank]   = new double[nbRecvElement[rank]]; 
    271306      sendArea[rank]   = new double[nbRecvElement[rank]]; 
    272307      sendGivenArea[rank] = new double[nbRecvElement[rank]]; 
     308      sendVertexOffset[rank] = new int[nbRecvElement[rank]]; 
     309 
    273310      if (order == 2) 
    274311      { 
    275         sendNeighIds[rank] = new GloId[nbRecvElement[rank]*(NMAX+1)]; 
    276         sendGrad[rank]    = new Coord[nbRecvElement[rank]*(NMAX+1)]; 
    277       } 
    278       else 
    279       { 
    280         sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
    281       } 
    282       MPI_Irecv(recvElement[rank], nbRecvElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    283       nbRecvRequest++; 
    284     } 
    285   } 
    286   MPI_Status *status = new MPI_Status[5*mpiSize]; 
    287    
    288   MPI_Waitall(nbSendRequest, sendRequest, status); 
    289         MPI_Waitall(nbRecvRequest, recvRequest, status); 
    290  
    291   /* for all indices that have been received from requesting ranks: pack values and gradients, then send */ 
    292   nbSendRequest = 0; 
    293   nbRecvRequest = 0; 
    294   for (int rank = 0; rank < mpiSize; rank++) 
    295   { 
    296     if (nbRecvElement[rank] > 0) 
    297     { 
     312        sendNeighIds[rank] = new GloId[nbRecvVertex[rank]]; 
     313        sendGrad[rank]    = new Coord[nbRecvVertex[rank]]; 
     314      } 
     315      else sendNeighIds[rank] = new GloId[nbRecvElement[rank]]; 
     316 
    298317      int jj = 0; // jj == j if no weight writing 
     318      sendVertexOffset[rank][0]=0 ; 
    299319      for (int j = 0; j < nbRecvElement[rank]; j++) 
    300320      { 
     
    302322        sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 
    303323        sendGivenArea[rank][j] = sstree.localElements[recvElement[rank][j]].given_area; 
     324         
     325        if (j==0)  
     326        { 
     327          if (order==2) sendVertexOffset[rank][j]=sstree.localElements[recvElement[rank][j]].n+1 ; 
     328          else sendVertexOffset[rank][j]=1 ; 
     329        } 
     330        else  
     331        { 
     332          if (order == 2) sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+sstree.localElements[recvElement[rank][j]].n+1 ; 
     333          else sendVertexOffset[rank][j] = sendVertexOffset[rank][j-1]+1 ; 
     334        } 
     335 
    304336        if (order == 2) 
    305337        { 
     
    308340          sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 
    309341          jj++; 
    310           for (int i = 0; i < NMAX; i++) 
     342          for (int i = 0; i <  sstree.localElements[recvElement[rank][j]].n ; i++) 
    311343          { 
    312344            sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; 
     
    325357      MPI_Issend(sendGivenArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    326358      nbSendRequest++; 
     359      MPI_Issend(sendVertexOffset[rank],  nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     360      nbSendRequest++; 
     361 
    327362      if (order == 2) 
    328363      { 
    329         MPI_Issend(sendGrad[rank], 3*nbRecvElement[rank]*(NMAX+1), MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     364        MPI_Issend(sendGrad[rank], 3*nbRecvVertex[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    330365        nbSendRequest++; 
    331         MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     366        MPI_Issend(sendNeighIds[rank], 4*nbRecvVertex[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    332367//ym  --> attention taille GloId 
    333368        nbSendRequest++; 
     
    342377    if (nbSendElement[rank] > 0) 
    343378    { 
     379      recvValue[rank]   = new double[nbSendElement[rank]]; 
     380      recvArea[rank]    = new double[nbSendElement[rank]]; 
     381      recvGivenArea[rank] = new double[nbSendElement[rank]]; 
     382      recvVertexOffset[rank] = new int[nbSendElement[rank]]; 
     383 
     384      if (order == 2) 
     385      { 
     386        recvNeighIds[rank] = new GloId[nbSendVertex[rank]]; 
     387        recvGrad[rank]     = new Coord[nbSendVertex[rank]]; 
     388      } 
     389      else recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
     390 
     391 
    344392      MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    345393      nbRecvRequest++; 
     
    348396      MPI_Irecv(recvGivenArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    349397      nbRecvRequest++; 
     398      MPI_Irecv(recvVertexOffset[rank],  nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     399      nbRecvRequest++; 
     400 
    350401      if (order == 2) 
    351402      { 
    352         MPI_Irecv(recvGrad[rank], 3*nbSendElement[rank]*(NMAX+1), 
    353             MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     403        MPI_Irecv(recvGrad[rank], 3*nbSendVertex[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    354404        nbRecvRequest++; 
    355         MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[rank]*(NMAX+1), MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     405        MPI_Irecv(recvNeighIds[rank], 4*nbSendVertex[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    356406//ym  --> attention taille GloId 
    357407        nbRecvRequest++; 
     
    366416  } 
    367417         
    368         MPI_Waitall(nbSendRequest, sendRequest, status); 
     418  MPI_Waitall(nbSendRequest, sendRequest, status); 
    369419  MPI_Waitall(nbRecvRequest, recvRequest, status); 
    370420   
     
    397447 
    398448      /* first order: src value times weight (weight = supermesh area), later divide by target area */ 
    399       int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
    400       GloId neighID = recvNeighIds[rank][kk]; 
     449//      int kk = (order == 2) ? n1 * (NMAX + 1) : n1; 
     450      int offset ; 
     451      int nvertex ; 
     452      if (n1==0)  
     453      { 
     454        offset=0 ; 
     455        nvertex=recvVertexOffset[rank][0] ; 
     456      } 
     457      else  
     458      { 
     459        offset = recvVertexOffset[rank][n1-1]; 
     460        nvertex = recvVertexOffset[rank][n1]-recvVertexOffset[rank][n1-1]; 
     461      } 
     462 
     463      GloId neighID = recvNeighIds[rank][offset]; 
    401464      wgt_map[neighID] += w; 
    402465 
    403466      if (order == 2) 
    404467      { 
    405         for (int k = 0; k < NMAX+1; k++) 
     468        for (int k = 0; k < nvertex; k++) 
    406469        { 
    407           int kk = n1 * (NMAX + 1) + k; 
     470          int kk = offset + k; 
    408471          GloId neighID = recvNeighIds[rank][kk]; 
    409472          if (neighID.ind != -1)  wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); 
     
    423486    for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 
    424487    { 
    425       if (quantity)  this->remapMatrix[i] = (it->second ) / renorm; 
    426       else this->remapMatrix[i] = (it->second / e.area) / renorm; 
    427       this->srcAddress[i] = it->first.ind; 
    428       this->srcRank[i] = it->first.rank; 
    429       this->dstAddress[i] = j; 
    430       this->sourceWeightId[i]= it->first.globalId ; 
    431       this->targetWeightId[i]= targetGlobalId[j] ; 
     488      if (quantity)  this->remapMatrix.push_back((it->second ) / renorm); 
     489      else this->remapMatrix.push_back((it->second / e.area) / renorm); 
     490      this->srcAddress.push_back(it->first.ind); 
     491      this->srcRank.push_back(it->first.rank); 
     492      this->dstAddress.push_back(j); 
     493      this->sourceWeightId.push_back(it->first.globalId) ; 
     494      this->targetWeightId.push_back(targetGlobalId[j]) ; 
    432495      i++; 
    433496    } 
     
    443506      delete[] recvArea[rank]; 
    444507      delete[] recvGivenArea[rank]; 
     508      delete[] recvVertexOffset[rank]; 
    445509      if (order == 2) 
    446510      { 
     
    455519      delete[] sendArea[rank]; 
    456520      delete[] sendGivenArea[rank]; 
     521      delete[] sendVertexOffset[rank]; 
    457522      if (order == 2) 
    458523        delete[] sendGrad[rank]; 
     
    466531  delete[] nbSendElement; 
    467532  delete[] nbRecvElement; 
     533  delete[] nbSendVertex; 
     534  delete[] nbRecvVertex; 
    468535  delete[] sendElement; 
    469536  delete[] recvElement; 
     
    9561023Mapper::~Mapper() 
    9571024{ 
    958   delete [] remapMatrix; 
    959   delete [] srcAddress; 
    960   delete [] srcRank; 
    961   delete [] dstAddress; 
    962   delete [] sourceWeightId ; 
    963   delete [] targetWeightId ; 
    964   if (neighbourElements) delete [] neighbourElements; 
     1025  //delete [] remapMatrix; 
     1026  //delete [] srcAddress; 
     1027  //delete [] srcRank; 
     1028  //delete [] dstAddress; 
     1029  //delete [] sourceWeightId ; 
     1030  //delete [] targetWeightId ; 
     1031  //if (neighbourElements) delete [] neighbourElements; 
    9651032  CTimer::release() ; 
    9661033 } 
Note: See TracChangeset for help on using the changeset viewer.