Changeset 785
- Timestamp:
- 11/12/15 16:33:18 (7 years ago)
- Location:
- XIOS/trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/inputs/REMAP/iodef.xml
r783 r785 25 25 </file> 26 26 <file id="out_dst_regular_pole" name="out_dst_regular_pole" type="one_file"> 27 <!-- <field field_ref="dst_field_regular_pole" name="field" />-->27 <field field_ref="dst_field_regular_pole" name="field" /> 28 28 </file> 29 29 <file id="output_dst_regular" name="output_dst_regular" type="one_file"> … … 68 68 <generate_rectilinear_domain lat_start="-90" lat_end="90" lon_start="2" lon_end="360"/> 69 69 <interpolate_domain/> 70 <!-- <zoom_domain id="dst_domain_regular_pole"/>--> 70 71 </domain> 71 72 <domain id="dst_domain_regular" domain_src="src_domain_regular_tmp" ni_glo="90" nj_glo="45" type="rectilinear"> -
XIOS/trunk/src/io/nc4_data_input.cpp
r783 r785 232 232 domain->fillInRectilinearLonLat(); 233 233 } 234 else if (this->isCurvilinear(fieldId)) 235 { 236 int ni = domain->ni; 237 int nj = domain->nj; 238 std::vector<StdSize> nBeginLatLon(2), nSizeLatLon(2); 239 nBeginLatLon[0] = domain->jbegin.getValue(); nBeginLatLon[1] = domain->ibegin.getValue(); 240 nSizeLatLon[0] = nj; nSizeLatLon[1] = ni; 241 242 StdString latName = this->getLatCoordName(fieldId); 243 domain->latvalue_2d.resize(ni,nj); 244 readFieldVariableValue(domain->latvalue_2d, latName, nBeginLatLon, nSizeLatLon); 245 StdString lonName = this->getLonCoordName(fieldId); 246 domain->lonvalue_2d.resize(ni,nj); 247 readFieldVariableValue(domain->lonvalue_2d, lonName, nBeginLatLon, nSizeLatLon); 248 249 StdString boundsLatName = this->getBoundsId(latName); 250 if (0 == boundsLatName.compare("")) 251 ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)", 252 << "Field '" << fieldId << std::endl 253 << "Trying to read attributes from curvilinear grid." 254 << "Latitude variable " << latName << " does not have bounds."); 255 StdString boundsLonName = this->getBoundsId(lonName); 256 if (0 == boundsLonName.compare("")) 257 ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)", 258 << "Field '" << fieldId << std::endl 259 << "Trying to read attributes from curvilinear grid." 260 << "Longitude variable " << lonName << " does not have bounds."); 261 262 int nbVertex = this->getNbVertex(fieldId); 263 domain->nvertex.setValue(nbVertex); 264 std::vector<StdSize> nBeginBndsLatLon(3), nSizeBndsLatLon(3); 265 nBeginBndsLatLon[0] = domain->jbegin.getValue(); nSizeBndsLatLon[0] = nj; 266 nBeginBndsLatLon[1] = domain->ibegin.getValue(); nSizeBndsLatLon[1] = ni; 267 nBeginBndsLatLon[2] = 0; nSizeBndsLatLon[2] = nbVertex; 268 269 domain->bounds_lat_2d.resize(nbVertex,ni,nj); 270 readFieldVariableValue(domain->bounds_lat_2d, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon); 271 domain->bounds_lon_2d.resize(nbVertex,ni,nj); 272 readFieldVariableValue(domain->bounds_lon_2d, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon); 273 } 234 274 else if (this->isUnstructured(fieldId)) 235 275 { 236 int ni = domain->ni; 276 if (domain->i_index.isEmpty()) 277 ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)", 278 << "Field '" << fieldId << std::endl 279 << "Trying to read attributes from unstructured grid." 280 << "i_index of domain" << domain->getId() << " is mandatory"); 281 282 int ni = domain->i_index.numElements(); 237 283 std::vector<StdSize> nBeginLatLon(1,0), nSizeLatLon(1,0); 238 n BeginLatLon[0] = domain->ibegin.getValue();239 nSizeLatLon[0] = ni;284 nSizeLatLon[0] = domain->ni_glo.getValue(); 285 CArray<double,1> globalLonLat(domain->ni_glo.getValue()); 240 286 241 287 StdString latName = this->getLatCoordName(fieldId); 288 readFieldVariableValue(globalLonLat, latName, nBeginLatLon, nSizeLatLon); 242 289 domain->latvalue_1d.resize(ni); 243 readFieldVariableValue(domain->latvalue_1d, latName, nBeginLatLon, nSizeLatLon); 290 for (int idx = 0; idx < ni; ++idx) 291 domain->latvalue_1d(idx) = globalLonLat(domain->i_index(idx)); 292 244 293 StdString lonName = this->getLonCoordName(fieldId); 294 readFieldVariableValue(globalLonLat, lonName, nBeginLatLon, nSizeLatLon); 245 295 domain->lonvalue_1d.resize(ni); 246 readFieldVariableValue(domain->lonvalue_1d, lonName, nBeginLatLon, nSizeLatLon); 296 for (int idx = 0; idx < ni; ++idx) 297 domain->lonvalue_1d(idx) = globalLonLat(domain->i_index(idx)); 247 298 248 299 StdString boundsLatName = this->getBoundsId(latName); … … 262 313 domain->nvertex.setValue(nbVertex); 263 314 std::vector<StdSize> nBeginBndsLatLon(2), nSizeBndsLatLon(2); 264 nBeginBndsLatLon[0] = domain->ibegin.getValue(); nSizeBndsLatLon[0] = ni;315 nBeginBndsLatLon[0] = 0; nSizeBndsLatLon[0] = domain->ni_glo.getValue(); 265 316 nBeginBndsLatLon[1] = 0; nSizeBndsLatLon[1] = nbVertex; 266 317 318 CArray<double,2> globalBndsLonLat(nSizeBndsLatLon[1], nSizeBndsLatLon[0]); 319 readFieldVariableValue(globalBndsLonLat, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon); 267 320 domain->bounds_lat_1d.resize(nbVertex,ni); 268 readFieldVariableValue(domain->bounds_lat_1d, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon); 321 for (int idx = 0; idx < ni; ++idx) 322 for (int jdx = 0; jdx < nbVertex; ++jdx) 323 domain->bounds_lat_1d(jdx,idx) = globalBndsLonLat(jdx, domain->i_index(idx)); 324 325 readFieldVariableValue(globalBndsLonLat, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon); 269 326 domain->bounds_lon_1d.resize(nbVertex,ni); 270 readFieldVariableValue(domain->bounds_lon_1d, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon); 271 } 272 else if (this->isCurvilinear(fieldId)) 273 { 274 int ni = domain->ni; 275 int nj = domain->nj; 276 std::vector<StdSize> nBeginLatLon(2), nSizeLatLon(2); 277 nBeginLatLon[0] = domain->jbegin.getValue(); nBeginLatLon[1] = domain->ibegin.getValue(); 278 nSizeLatLon[0] = nj; nSizeLatLon[1] = ni; 279 280 StdString latName = this->getLatCoordName(fieldId); 281 domain->latvalue_2d.resize(ni,nj); 282 readFieldVariableValue(domain->latvalue_2d, latName, nBeginLatLon, nSizeLatLon); 283 StdString lonName = this->getLonCoordName(fieldId); 284 domain->lonvalue_2d.resize(ni,nj); 285 readFieldVariableValue(domain->lonvalue_2d, lonName, nBeginLatLon, nSizeLatLon); 286 287 StdString boundsLatName = this->getBoundsId(latName); 288 if (0 == boundsLatName.compare("")) 289 ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)", 290 << "Field '" << fieldId << std::endl 291 << "Trying to read attributes from curvilinear grid." 292 << "Latitude variable " << latName << " does not have bounds."); 293 StdString boundsLonName = this->getBoundsId(lonName); 294 if (0 == boundsLonName.compare("")) 295 ERROR("CNc4DataInput::readDomainAttributeValueFromFile(...)", 296 << "Field '" << fieldId << std::endl 297 << "Trying to read attributes from curvilinear grid." 298 << "Longitude variable " << lonName << " does not have bounds."); 299 300 int nbVertex = this->getNbVertex(fieldId); 301 domain->nvertex.setValue(nbVertex); 302 std::vector<StdSize> nBeginBndsLatLon(3), nSizeBndsLatLon(3); 303 nBeginBndsLatLon[0] = domain->jbegin.getValue(); nSizeBndsLatLon[0] = nj; 304 nBeginBndsLatLon[1] = domain->ibegin.getValue(); nSizeBndsLatLon[1] = ni; 305 nBeginBndsLatLon[2] = 0; nSizeBndsLatLon[2] = nbVertex; 306 307 domain->bounds_lat_2d.resize(nbVertex,ni,nj); 308 readFieldVariableValue(domain->bounds_lat_2d, boundsLatName, nBeginBndsLatLon, nSizeBndsLatLon); 309 domain->bounds_lon_2d.resize(nbVertex,ni,nj); 310 readFieldVariableValue(domain->bounds_lon_2d, boundsLonName, nBeginBndsLatLon, nSizeBndsLatLon); 327 for (int idx = 0; idx < ni; ++idx) 328 for (int jdx = 0; jdx < nbVertex; ++jdx) 329 domain->bounds_lon_1d(jdx,idx) = globalBndsLonLat(jdx, domain->i_index(idx)); 311 330 } 312 331 } -
XIOS/trunk/src/node/domain.cpp
r784 r785 332 332 else // unstructured domain 333 333 { 334 int globalDomainSize = ni_glo * nj_glo;335 if (globalDomainSize <= nbLocalDomain)336 {337 for (int idx = 0; idx < nbLocalDomain; ++idx)334 if (this->i_index.isEmpty()) 335 { 336 int globalDomainSize = ni_glo * nj_glo; 337 if (globalDomainSize <= nbLocalDomain) 338 338 { 339 if (rankOnDomain < globalDomainSize)339 for (int idx = 0; idx < nbLocalDomain; ++idx) 340 340 { 341 int iIdx = rankOnDomain % ni_glo; 342 int jIdx = rankOnDomain / ni_glo; 343 ibegin.setValue(iIdx); jbegin.setValue(jIdx); 344 ni.setValue(1); nj.setValue(1); 341 if (rankOnDomain < globalDomainSize) 342 { 343 int iIdx = rankOnDomain % ni_glo; 344 int jIdx = rankOnDomain / ni_glo; 345 ibegin.setValue(iIdx); jbegin.setValue(jIdx); 346 ni.setValue(1); nj.setValue(1); 347 } 348 else 349 { 350 ibegin.setValue(0); jbegin.setValue(0); 351 ni.setValue(0); nj.setValue(0); 352 } 345 353 } 346 else 354 } 355 else 356 { 357 float njGlo = nj_glo.getValue(); 358 float niGlo = ni_glo.getValue(); 359 std::vector<int> ibeginVec(nbLocalDomain,0); 360 std::vector<int> niVec(nbLocalDomain); 361 for (int i = 1; i < nbLocalDomain; ++i) 347 362 { 348 ibegin.setValue(0); jbegin.setValue(0); 349 ni.setValue(0); nj.setValue(0); 363 int range = ni_glo / nbLocalDomain; 364 if (i < (ni_glo%nbLocalDomain)) ++range; 365 niVec[i-1] = range; 366 ibeginVec[i] = ibeginVec[i-1] + niVec[i-1]; 350 367 } 368 niVec[nbLocalDomain-1] = ni_glo - ibeginVec[nbLocalDomain-1]; 369 370 int iIdx = rankOnDomain % nbLocalDomain; 371 ibegin.setValue(ibeginVec[iIdx]); 372 jbegin.setValue(0); 373 ni.setValue(niVec[iIdx]); 374 nj.setValue(1); 351 375 } 352 376 } 353 377 else 354 378 { 355 float njGlo = nj_glo.getValue(); 356 float niGlo = ni_glo.getValue(); 357 std::vector<int> ibeginVec(nbLocalDomain,0); 358 std::vector<int> niVec(nbLocalDomain); 359 for (int i = 1; i < nbLocalDomain; ++i) 360 { 361 int range = ni_glo / nbLocalDomain; 362 if (i < (ni_glo%nbLocalDomain)) ++range; 363 niVec[i-1] = range; 364 ibeginVec[i] = ibeginVec[i-1] + niVec[i-1]; 365 } 366 niVec[nbLocalDomain-1] = ni_glo - ibeginVec[nbLocalDomain-1]; 367 368 int iIdx = rankOnDomain % nbLocalDomain; 369 ibegin.setValue(ibeginVec[iIdx]); 379 ibegin.setValue(this->i_index(0)); 370 380 jbegin.setValue(0); 371 ni.setValue( niVec[iIdx]);381 ni.setValue(this->i_index.numElements()); 372 382 nj.setValue(1); 373 383 } 374 384 } 385 386 checkDomain(); 375 387 } 376 388 -
XIOS/trunk/src/test/test_remap.f90
r783 r785 120 120 bounds_lon_1D=dst_boundslon, bounds_lat_1D=dst_boundslat, nvertex=dst_nvertex) 121 121 122 ! CALL xios_set_zoom_domain_attr("dst_domain_regular_pole", zoom_ibegin=10, zoom_ni=10, & 123 ! zoom_jbegin=10, zoom_nj=10) 122 124 123 125 dtime%second = 3600
Note: See TracChangeset
for help on using the changeset viewer.