- Timestamp:
- 10/19/15 17:41:35 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/transformation/domain_algorithm_interpolate.cpp
r709 r743 39 39 int orderInterp = interpDomain_->order.getValue(); 40 40 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 42 43 int nVertexSrc, nVertexDest; 43 44 nVertexSrc = nVertexDest = constNVertex; … … 79 80 } 80 81 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 81 87 int localDomainDestSize = domainDest_->i_index.numElements(); 82 88 int niDest = domainDest_->ni.getValue(), njDest = domainDest_->nj.getValue(); … … 110 116 else 111 117 { 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 112 141 // Ok, fill in boundary values for rectangular domain 113 domainDest_->fillInRectilinearBoundLonLat(boundsLonDest, boundsLatDest);114 142 nVertexDest = constNVertex; 143 domainDest_->fillInRectilinearBoundLonLat(boundsLonDest, boundsLatDest, isNorthPole, isSouthPole); 115 144 } 116 145 … … 152 181 153 182 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(); 154 185 for (int idx = 0; idx < mapper.nWeights; ++idx) 155 186 { 156 187 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 158 222 exchangeRemapInfo(interpMapValue); 159 223 160 224 delete [] globalSrc; 161 225 delete [] globalDst; 226 } 227 228 void 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 162 295 } 163 296
Note: See TracChangeset
for help on using the changeset viewer.