Changeset 1564 for XIOS/trunk/src/node/grid.hpp
- Timestamp:
- 07/20/18 14:02:55 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/grid.hpp
r1542 r1564 19 19 namespace xios { 20 20 21 /// ////////////////////// D ᅵᅵclarations ////////////////////// ///21 /// ////////////////////// Declarations ////////////////////// /// 22 22 23 23 class CGridGroup; … … 91 91 StdSize getDataSize(void) const; 92 92 93 /// Entr ᅵᅵes-sorties de champs93 /// Entrees-sorties de champs 94 94 template <int n> 95 95 void inputField(const CArray<double,n>& field, CArray<double,1>& stored) const; … … 417 417 bool createMask) 418 418 { 419 int idx = 0; 420 int numElement = axisDomainOrder.numElements(); 421 int dim = domainMasks.size() * 2 + axisMasks.size(); 422 std::vector<CDomain*> domainP = this->getDomains(); 423 std::vector<CAxis*> axisP = this->getAxis(); 424 425 std::vector<int> idxLoop(dim,0), indexMap(numElement), eachDimSize(dim); 426 std::vector<int> currentIndex(dim); 427 int idxDomain = 0, idxAxis = 0; 428 for (int i = 0; i < numElement; ++i) 429 { 430 indexMap[i] = idx; 431 if (2 == axisDomainOrder(i)) { 432 eachDimSize[indexMap[i]] = domainP[idxDomain]->ni; 433 eachDimSize[indexMap[i]+1] = domainP[idxDomain]->nj; 434 idx += 2; ++idxDomain; 419 if (!gridMask.isEmpty() || createMask) 420 { 421 int idx = 0; 422 int numElement = axisDomainOrder.numElements(); 423 int dim = domainMasks.size() * 2 + axisMasks.size(); 424 std::vector<CDomain*> domainP = this->getDomains(); 425 std::vector<CAxis*> axisP = this->getAxis(); 426 427 std::vector<int> idxLoop(dim,0), indexMap(numElement), eachDimSize(dim); 428 std::vector<int> currentIndex(dim); 429 int idxDomain = 0, idxAxis = 0; 430 for (int i = 0; i < numElement; ++i) 431 { 432 indexMap[i] = idx; 433 if (2 == axisDomainOrder(i)) { 434 eachDimSize[indexMap[i]] = domainP[idxDomain]->ni; 435 eachDimSize[indexMap[i]+1] = domainP[idxDomain]->nj; 436 idx += 2; ++idxDomain; 437 } 438 else if (1 == axisDomainOrder(i)) { 439 // eachDimSize[indexMap[i]] = axisMasks[idxAxis]->numElements(); 440 eachDimSize[indexMap[i]] = axisP[idxAxis]->n; 441 ++idx; ++idxAxis; 442 } 443 else {}; 435 444 } 436 else if (1 == axisDomainOrder(i)) { 437 // eachDimSize[indexMap[i]] = axisMasks[idxAxis]->numElements(); 438 eachDimSize[indexMap[i]] = axisP[idxAxis]->n; 439 ++idx; ++idxAxis; 440 } 441 else {}; 442 } 443 444 if (!gridMask.isEmpty() && !createMask) 445 { 446 for (int i = 0; i < dim; ++i) 445 446 // if (!gridMask.isEmpty() && !createMask) 447 if (!createMask) 447 448 { 448 if (gridMask.extent(i) != eachDimSize[i]) 449 ERROR("CGrid::checkMask(void)", 450 << "The mask has one dimension whose size is different from the one of the local grid." << std::endl 451 << "Local size of dimension " << i << " is " << eachDimSize[i] << "." << std::endl 452 << "Mask size for dimension " << i << " is " << gridMask.extent(i) << "." << std::endl 453 << "Grid = " << this->getId()) 454 } 455 } 456 else { 457 CArrayBoolTraits<CArray<bool,N> >::resizeArray(gridMask,eachDimSize); 458 gridMask = true; 459 } 460 461 int ssize = gridMask.numElements(); 462 idx = 0; 463 while (idx < ssize) 464 { 465 for (int i = 0; i < dim-1; ++i) 466 { 467 if (idxLoop[i] == eachDimSize[i]) 449 for (int i = 0; i < dim; ++i) 468 450 { 469 idxLoop[i] = 0; 470 ++idxLoop[i+1]; 451 if (gridMask.extent(i) != eachDimSize[i]) 452 ERROR("CGrid::checkMask(void)", 453 << "The mask has one dimension whose size is different from the one of the local grid." << std::endl 454 << "Local size of dimension " << i << " is " << eachDimSize[i] << "." << std::endl 455 << "Mask size for dimension " << i << " is " << gridMask.extent(i) << "." << std::endl 456 << "Grid = " << this->getId()) 471 457 } 472 458 } 473 474 // Find out outer index 475 idxDomain = idxAxis = 0; 476 bool maskValue = true; 477 for (int i = 0; i < numElement; ++i) 459 else { 460 CArrayBoolTraits<CArray<bool,N> >::resizeArray(gridMask,eachDimSize); 461 gridMask = true; 462 } 463 464 int ssize = gridMask.numElements(); 465 idx = 0; 466 while (idx < ssize) 478 467 { 479 if (2 == axisDomainOrder(i))468 for (int i = 0; i < dim-1; ++i) 480 469 { 481 int idxTmp = idxLoop[indexMap[i]] + idxLoop[indexMap[i]+1] * eachDimSize[indexMap[i]]; 482 if (idxTmp < (*domainMasks[idxDomain]).numElements()) 483 maskValue = maskValue && (*domainMasks[idxDomain])(idxTmp); 484 else 485 maskValue = false; 486 ++idxDomain; 470 if (idxLoop[i] == eachDimSize[i]) 471 { 472 idxLoop[i] = 0; 473 ++idxLoop[i+1]; 474 } 487 475 } 488 else if (1 == axisDomainOrder(i)) 476 477 // Find out outer index 478 idxDomain = idxAxis = 0; 479 bool maskValue = true; 480 for (int i = 0; i < numElement; ++i) 489 481 { 490 int idxTmp = idxLoop[indexMap[i]]; 491 if (idxTmp < (*axisMasks[idxAxis]).numElements()) 492 maskValue = maskValue && (*axisMasks[idxAxis])(idxTmp); 493 else 494 maskValue = false; 495 496 ++idxAxis; 482 if (2 == axisDomainOrder(i)) 483 { 484 int idxTmp = idxLoop[indexMap[i]] + idxLoop[indexMap[i]+1] * eachDimSize[indexMap[i]]; 485 if (idxTmp < (*domainMasks[idxDomain]).numElements()) 486 maskValue = maskValue && (*domainMasks[idxDomain])(idxTmp); 487 else 488 maskValue = false; 489 ++idxDomain; 490 } 491 else if (1 == axisDomainOrder(i)) 492 { 493 int idxTmp = idxLoop[indexMap[i]]; 494 if (idxTmp < (*axisMasks[idxAxis]).numElements()) 495 maskValue = maskValue && (*axisMasks[idxAxis])(idxTmp); 496 else 497 maskValue = false; 498 499 ++idxAxis; 500 } 497 501 } 502 503 int maskIndex = idxLoop[0]; 504 int mulDim = 1; 505 for (int k = 1; k < dim; ++k) 506 { 507 mulDim *= eachDimSize[k-1]; 508 maskIndex += idxLoop[k]*mulDim; 509 } 510 *(gridMask.dataFirst()+maskIndex) &= maskValue; 511 512 ++idxLoop[0]; 513 ++idx; 498 514 } 499 500 int maskIndex = idxLoop[0]; 501 int mulDim = 1; 502 for (int k = 1; k < dim; ++k) 503 { 504 mulDim *= eachDimSize[k-1]; 505 maskIndex += idxLoop[k]*mulDim; 506 } 507 *(gridMask.dataFirst()+maskIndex) &= maskValue; 508 509 ++idxLoop[0]; 510 ++idx; 511 } 512 515 } 513 516 } 514 517
Note: See TracChangeset
for help on using the changeset viewer.