Ignore:
Timestamp:
10/19/15 17:41:35 (9 years ago)
Author:
mhnguyen
Message:

Processing pole of rectangular grid with latitude = 90

+) Use average value of all points with latitude 90 (-90)

Test
+) On Curie
+) test_remap pass

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/domain_algorithm_interpolate.cpp

    r709 r743  
    3939        int orderInterp = interpDomain_->order.getValue(); 
    4040 
    41   int constNVertex = 4; // Value by default number of vertex for rectangular domain 
     41  const double poleValue = 90.0; 
     42  const int constNVertex = 4; // Value by default number of vertex for rectangular domain 
    4243  int nVertexSrc, nVertexDest; 
    4344  nVertexSrc = nVertexDest = constNVertex; 
     
    7980  } 
    8081 
     82  bool isNorthPole = false; 
     83  bool isSouthPole = false; 
     84  std::map<int,std::vector<std::pair<int,double> > > interpMapValueNorthPole; 
     85  std::map<int,std::vector<std::pair<int,double> > > interpMapValueSouthPole; 
     86 
    8187  int localDomainDestSize = domainDest_->i_index.numElements(); 
    8288  int niDest = domainDest_->ni.getValue(), njDest = domainDest_->nj.getValue(); 
     
    110116  else 
    111117  { 
     118    if (poleValue == std::abs(domainDest_->lat_start)) isNorthPole = true; 
     119    if (poleValue == std::abs(domainDest_->lat_end)) isSouthPole = true; 
     120    if (isNorthPole && (0 == domainDest_->jbegin.getValue())) 
     121    { 
     122      int ibegin = domainDest_->ibegin.getValue(); 
     123      for (i = 0; i < niDest; ++i) 
     124      { 
     125        interpMapValueNorthPole[i+ibegin]; 
     126      } 
     127    } 
     128 
     129    if (isSouthPole && (domainDest_->nj_glo.getValue() == (domainDest_->jbegin.getValue() + njDest))) 
     130    { 
     131      int ibegin = domainDest_->ibegin.getValue(); 
     132      int njGlo = domainDest_->nj_glo.getValue(); 
     133      int niGlo = domainDest_->ni_glo.getValue(); 
     134      for (i = 0; i < niDest; ++i) 
     135      { 
     136        k = (njGlo - 1)*niGlo + i + ibegin; 
     137        interpMapValueSouthPole[k]; 
     138      } 
     139    } 
     140 
    112141    // Ok, fill in boundary values for rectangular domain 
    113     domainDest_->fillInRectilinearBoundLonLat(boundsLonDest, boundsLatDest); 
    114142    nVertexDest = constNVertex; 
     143    domainDest_->fillInRectilinearBoundLonLat(boundsLonDest, boundsLatDest, isNorthPole, isSouthPole); 
    115144  } 
    116145 
     
    152181 
    153182  std::map<int,std::vector<std::pair<int,double> > > interpMapValue; 
     183  std::map<int,std::vector<std::pair<int,double> > >::const_iterator iteNorthPole = interpMapValueNorthPole.end(), 
     184                                                                     iteSouthPole = interpMapValueSouthPole.end(); 
    154185  for (int idx = 0;  idx < mapper.nWeights; ++idx) 
    155186  { 
    156187    interpMapValue[mapper.targetWeightId[idx]].push_back(make_pair(mapper.sourceWeightId[idx],mapper.remapMatrix[idx])); 
    157   } 
     188    if (iteNorthPole != interpMapValueNorthPole.find(mapper.targetWeightId[idx])) 
     189    { 
     190      interpMapValueNorthPole[mapper.targetWeightId[idx]].push_back(make_pair(mapper.sourceWeightId[idx],mapper.remapMatrix[idx])); 
     191    } 
     192 
     193    if (iteSouthPole != interpMapValueSouthPole.find(mapper.targetWeightId[idx])) 
     194    { 
     195      interpMapValueSouthPole[mapper.targetWeightId[idx]].push_back(make_pair(mapper.sourceWeightId[idx],mapper.remapMatrix[idx])); 
     196    } 
     197  } 
     198  int niGloDst = domainDest_->ni_glo.getValue(); 
     199  processPole(interpMapValueNorthPole, niGloDst); 
     200  processPole(interpMapValueSouthPole, niGloDst); 
     201 
     202  if (!interpMapValueNorthPole.empty()) 
     203  { 
     204     std::map<int,std::vector<std::pair<int,double> > >::iterator itNorthPole = interpMapValueNorthPole.begin(); 
     205     for (; itNorthPole != iteNorthPole; ++itNorthPole) 
     206     { 
     207       if (!(itNorthPole->second.empty())) 
     208        itNorthPole->second.swap(interpMapValue[itNorthPole->first]); 
     209     } 
     210  } 
     211 
     212  if (!interpMapValueSouthPole.empty()) 
     213  { 
     214     std::map<int,std::vector<std::pair<int,double> > >::iterator itSouthPole = interpMapValueSouthPole.begin(); 
     215     for (; itSouthPole != iteSouthPole; ++itSouthPole) 
     216     { 
     217       if (!(itSouthPole->second.empty())) 
     218        itSouthPole->second.swap(interpMapValue[itSouthPole->first]); 
     219     } 
     220  } 
     221 
    158222  exchangeRemapInfo(interpMapValue); 
    159223 
    160224  delete [] globalSrc; 
    161225  delete [] globalDst; 
     226} 
     227 
     228void CDomainAlgorithmInterpolate::processPole(std::map<int,std::vector<std::pair<int,double> > >& interMapValuePole, 
     229                                              int nbGlobalPointOnPole) 
     230{ 
     231  CContext* context = CContext::getCurrent(); 
     232  CContextClient* client=context->client; 
     233 
     234  MPI_Comm poleComme(MPI_COMM_NULL); 
     235  MPI_Comm_split(client->intraComm, interMapValuePole.empty() ? MPI_UNDEFINED : 1, 0, &poleComme); 
     236  if (MPI_COMM_NULL != poleComme) 
     237  { 
     238    int nbClientPole; 
     239    MPI_Comm_size(poleComme, &nbClientPole); 
     240 
     241    std::map<int,std::vector<std::pair<int,double> > >::iterator itePole = interMapValuePole.end(), itPole, 
     242                                                                 itbPole = interMapValuePole.begin(); 
     243 
     244    int nbWeight = 0; 
     245    for (itPole = itbPole; itPole != itePole; ++itPole) 
     246       nbWeight += itPole->second.size(); 
     247 
     248    std::vector<int> recvCount(nbClientPole,0); 
     249    std::vector<int> displ(nbClientPole,0); 
     250    MPI_Allgather(&nbWeight,1,MPI_INT,&recvCount[0],1,MPI_INT,poleComme) ; 
     251 
     252    displ[0]=0; 
     253    for(int n=1;n<nbClientPole;++n) displ[n]=displ[n-1]+recvCount[n-1] ; 
     254    int recvSize=displ[nbClientPole-1]+recvCount[nbClientPole-1] ; 
     255 
     256    std::vector<int> sendSourceIndexBuff(nbWeight); 
     257    std::vector<double> sendSourceWeightBuff(nbWeight); 
     258    int k = 0; 
     259    for (itPole = itbPole; itPole != itePole; ++itPole) 
     260    { 
     261      for (int idx = 0; idx < itPole->second.size(); ++idx) 
     262      { 
     263        sendSourceIndexBuff[k] = (itPole->second)[idx].first; 
     264        sendSourceWeightBuff[k] = (itPole->second)[idx].second; 
     265        ++k; 
     266      } 
     267    } 
     268 
     269    std::vector<int> recvSourceIndexBuff(recvSize); 
     270    std::vector<double> recvSourceWeightBuff(recvSize); 
     271 
     272    // Gather all index and weight for pole 
     273    MPI_Allgatherv(&sendSourceIndexBuff[0],nbWeight,MPI_INT,&recvSourceIndexBuff[0],&recvCount[0],&displ[0],MPI_INT,poleComme); 
     274    MPI_Allgatherv(&sendSourceWeightBuff[0],nbWeight,MPI_DOUBLE,&recvSourceWeightBuff[0],&recvCount[0],&displ[0],MPI_DOUBLE,poleComme); 
     275 
     276    std::map<int,double> recvTemp; 
     277    for (int idx = 0; idx < recvSize; ++idx) 
     278    { 
     279      if (recvTemp.end() != recvTemp.find(recvSourceIndexBuff[idx])) 
     280        recvTemp[recvSourceIndexBuff[idx]] += recvSourceWeightBuff[idx]/nbGlobalPointOnPole; 
     281      else 
     282        recvTemp[recvSourceIndexBuff[idx]] = 0.0; 
     283    } 
     284 
     285    std::map<int,double>::const_iterator itRecvTemp, itbRecvTemp = recvTemp.begin(), iteRecvTemp = recvTemp.end(); 
     286 
     287    for (itPole = itbPole; itPole != itePole; ++itPole) 
     288    { 
     289      itPole->second.clear(); 
     290      for (itRecvTemp = itbRecvTemp; itRecvTemp != iteRecvTemp; ++itRecvTemp) 
     291          itPole->second.push_back(make_pair(itRecvTemp->first, itRecvTemp->second)); 
     292    } 
     293  } 
     294 
    162295} 
    163296 
Note: See TracChangeset for help on using the changeset viewer.