Ignore:
Timestamp:
05/31/23 12:20:29 (13 months ago)
Author:
ymipsl
Message:

Supress limitation of number of vertex max in remaper.
YM

File:
1 edited

Legend:

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

    r1639 r2506  
    145145      nIntersections++; 
    146146  } 
     147 
    147148  /* overallocate for NMAX neighbours for each elements */ 
     149/* 
    148150  remapMatrix = new double[nIntersections*NMAX]; 
    149151  srcAddress = new int[nIntersections*NMAX]; 
     
    152154  sourceWeightId =new long[nIntersections*NMAX]; 
    153155  targetWeightId =new long[nIntersections*NMAX]; 
    154  
     156*/ 
    155157 
    156158  if (mpiRank == 0 && verbose) cout << "Remapping..." << endl; 
     
    186188 
    187189  int *nbSendElement = new int[mpiSize]; 
     190  int *nbSendVertex = new int[mpiSize]; 
    188191  int **sendElement = new int*[mpiSize]; /* indices of elements required from other rank */ 
    189192  double **recvValue = new double*[mpiSize]; 
    190193  double **recvArea = new double*[mpiSize]; 
    191194  double **recvGivenArea = new double*[mpiSize]; 
     195  int **recvVertexOffset = new int*[mpiSize]; 
    192196  Coord **recvGrad = new Coord*[mpiSize]; 
    193197  GloId **recvNeighIds = new GloId*[mpiSize]; /* ids of the of the source neighbours which also contribute through gradient */ 
     
    210214    { 
    211215      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       else 
    221         recvNeighIds[rank] = new GloId[nbSendElement[rank]]; 
    222  
    223216      last = -1; 
    224217      index = -1; 
     
    235228  /* communicate sizes of source elements to be sent (index lists and later values and gradients) */ 
    236229  int *nbRecvElement = new int[mpiSize]; 
     230  int *nbRecvVertex = new int[mpiSize]; 
    237231  MPI_Alltoall(nbSendElement, 1, MPI_INT, nbRecvElement, 1, MPI_INT, communicator); 
    238232 
     
    244238  double **sendArea = new double*[mpiSize]; 
    245239  double **sendGivenArea = new double*[mpiSize]; 
     240  int    **sendVertexOffset = new int*[mpiSize]; 
    246241  Coord **sendGrad = new Coord*[mpiSize]; 
    247242  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]; 
    250245  for (int rank = 0; rank < mpiSize; rank++) 
    251246  { 
     
    259254    { 
    260255      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    { 
    261296      sendValue[rank]   = new double[nbRecvElement[rank]]; 
    262297      sendArea[rank]   = new double[nbRecvElement[rank]]; 
    263298      sendGivenArea[rank] = new double[nbRecvElement[rank]]; 
     299      sendVertexOffset[rank] = new int[nbRecvElement[rank]]; 
     300 
    264301      if (order == 2) 
    265302      { 
    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 
    289308      int jj = 0; // jj == j if no weight writing 
     309      sendVertexOffset[rank][0]=0 ; 
    290310      for (int j = 0; j < nbRecvElement[rank]; j++) 
    291311      { 
     
    293313        sendArea[rank][j] = sstree.localElements[recvElement[rank][j]].area; 
    294314        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 
    295327        if (order == 2) 
    296328        { 
     
    299331          sendNeighIds[rank][jj] = sstree.localElements[recvElement[rank][j]].src_id; 
    300332          jj++; 
    301           for (int i = 0; i < NMAX; i++) 
     333          for (int i = 0; i <  sstree.localElements[recvElement[rank][j]].n ; i++) 
    302334          { 
    303335            sendGrad[rank][jj] = sstree.localElements[recvElement[rank][j]].gradNeigh[i]; 
     
    316348      MPI_Issend(sendGivenArea[rank],  nbRecvElement[rank], MPI_DOUBLE, rank, 0, communicator, &sendRequest[nbSendRequest]); 
    317349      nbSendRequest++; 
     350      MPI_Issend(sendVertexOffset[rank],  nbRecvElement[rank], MPI_INT, rank, 0, communicator, &sendRequest[nbSendRequest]); 
     351      nbSendRequest++; 
     352 
    318353      if (order == 2) 
    319354      { 
    320         MPI_Issend(sendGrad[rank], 3*nbRecvElement[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]); 
    321356        nbSendRequest++; 
    322         MPI_Issend(sendNeighIds[rank], 4*nbRecvElement[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]); 
    323358//ym  --> attention taille GloId 
    324359        nbSendRequest++; 
     
    333368    if (nbSendElement[rank] > 0) 
    334369    { 
     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 
    335383      MPI_Irecv(recvValue[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    336384      nbRecvRequest++; 
     
    339387      MPI_Irecv(recvGivenArea[rank],  nbSendElement[rank], MPI_DOUBLE, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
    340388      nbRecvRequest++; 
     389      MPI_Irecv(recvVertexOffset[rank],  nbSendElement[rank], MPI_INT, rank, 0, communicator, &recvRequest[nbRecvRequest]); 
     390      nbRecvRequest++; 
     391 
    341392      if (order == 2) 
    342393      { 
    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]); 
    345395        nbRecvRequest++; 
    346         MPI_Irecv(recvNeighIds[rank], 4*nbSendElement[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]); 
    347397//ym  --> attention taille GloId 
    348398        nbRecvRequest++; 
     
    357407  } 
    358408         
    359         MPI_Waitall(nbSendRequest, sendRequest, status); 
     409  MPI_Waitall(nbSendRequest, sendRequest, status); 
    360410  MPI_Waitall(nbRecvRequest, recvRequest, status); 
    361411   
     
    388438 
    389439      /* 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]; 
    392455      wgt_map[neighID] += w; 
    393456 
    394457      if (order == 2) 
    395458      { 
    396         for (int k = 0; k < NMAX+1; k++) 
     459        for (int k = 0; k < nvertex; k++) 
    397460        { 
    398           int kk = n1 * (NMAX + 1) + k; 
     461          int kk = offset + k; 
    399462          GloId neighID = recvNeighIds[rank][kk]; 
    400463          if (neighID.ind != -1)  wgt_map[neighID] += w * scalarprod(recvGrad[rank][kk], (*it)->x); 
     
    414477    for (map<GloId,double>::iterator it = wgt_map.begin(); it != wgt_map.end(); it++) 
    415478    { 
    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]) ; 
    423486      i++; 
    424487    } 
     
    434497      delete[] recvArea[rank]; 
    435498      delete[] recvGivenArea[rank]; 
     499      delete[] recvVertexOffset[rank]; 
    436500      if (order == 2) 
    437501      { 
     
    446510      delete[] sendArea[rank]; 
    447511      delete[] sendGivenArea[rank]; 
     512      delete[] sendVertexOffset[rank]; 
    448513      if (order == 2) 
    449514        delete[] sendGrad[rank]; 
     
    457522  delete[] nbSendElement; 
    458523  delete[] nbRecvElement; 
     524  delete[] nbSendVertex; 
     525  delete[] nbRecvVertex; 
    459526  delete[] sendElement; 
    460527  delete[] recvElement; 
     
    9391006Mapper::~Mapper() 
    9401007{ 
    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.