Ignore:
Timestamp:
09/06/18 18:55:44 (6 years ago)
Author:
oabramkina
Message:

Taking care of cases when a process doesn't possess a grid (its domain or axe size is zero).

Tested with CMIP6 toy models and IPSL model.

To do: remove grid mask from transformations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/io/nc4_data_output.cpp

    r1559 r1571  
    5656      { 
    5757        StdString lonName,latName ; 
    58           
     58 
    5959        domain->computeWrittenIndex(); 
    6060        domain->computeWrittenCompressedIndex(comm_file); 
     
    154154*/ 
    155155 
    156          CArray<size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
     156         CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
    157157         int nbWritten = indexToWrite.numElements(); 
    158158         CArray<double,1> writtenLat, writtenLon; 
     
    166166           for (int idx = 0; idx < nbWritten; ++idx) 
    167167           { 
    168                   if (idx < domain->latvalue.numElements()) 
     168                  if (indexToWrite(idx) < 0) 
    169169                  { 
    170                 writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
    171                 writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
     170              writtenLat(idx) = -1.;   // hole 
     171              writtenLon(idx) = -1.; 
    172172                  } 
    173173                  else 
    174174                  { 
    175                 writtenLat(idx) = 0.; 
    176                 writtenLon(idx) = 0.; 
     175              writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
     176              writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
    177177                  } 
    178178           } 
     
    189189               for (int nv = 0; nv < nvertex; ++nv) 
    190190               { 
    191                  if (idx < boundslat.columns()) 
    192                  { 
     191                 if (indexToWrite(idx) < 0) 
     192                 { 
     193                   writtenBndsLat(nv, idx) = -1.;  // hole 
     194                   writtenBndsLon(nv, idx) = -1.; 
     195                 } 
     196                 else 
     197                 { 
    193198                   writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 
    194199                   writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 
    195                  } 
    196                  else 
    197                  { 
    198                    writtenBndsLat(nv, idx) = 0.; 
    199                    writtenBndsLon(nv, idx) = 0.; 
    200                  } 
     200                 } 
    201201               } 
    202202           } 
     
    208208           for (int idx = 0; idx < nbWritten; ++idx) 
    209209           { 
    210                   if (idx < domain->areavalue.numElements()) 
    211                 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
     210                  if (indexToWrite(idx) < 0) 
     211              writtenArea(idx) = -1.; 
    212212                  else 
    213                 writtenArea(idx) = 0.; 
     213              writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
    214214           } 
    215215         } 
     
    426426                     std::vector<StdSize> start(2) ; 
    427427                     std::vector<StdSize> count(2) ; 
    428                      if (domain->isEmpty()) 
    429                      { 
    430                        start[0]=0 ; start[1]=0 ; 
    431                        count[0]=0 ; count[1]=0 ; 
    432                      } 
    433                      else 
     428// Comment out for a moment because it is not working for a hole 
     429//                     if (domain->isEmpty()) 
     430//                     { 
     431//                       start[0]=0 ; start[1]=0 ; 
     432//                       count[0]=0 ; count[1]=0 ; 
     433//                     } 
     434//                     else 
    434435                     { 
    435436                       start[1]=domain->ibegin; 
     
    875876          case (MULTI_FILE) : 
    876877          { 
     878            ERROR("CNc4DataOutput::writeDomain(domain)", 
     879            << "[ type = multiple_file ]" 
     880            << " is not yet implemented for UGRID files !"); 
    877881            break; 
    878882          } 
     
    940944         int nvertex = (domain->nvertex.isEmpty()) ? 0 : domain->nvertex; 
    941945 
    942          CArray<size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
     946         CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
    943947         int nbWritten = indexToWrite.numElements(); 
    944948         CArray<double,1> writtenLat, writtenLon; 
     
    952956           for (int idx = 0; idx < nbWritten; ++idx) 
    953957           { 
    954              if (idx < domain->latvalue.numElements()) 
    955              { 
    956                writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
    957                writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
    958              } 
    959              else 
    960              { 
    961                writtenLat(idx) = 0.; 
    962                writtenLon(idx) = 0.; 
    963              } 
     958             if (indexToWrite(idx) < 0) 
     959             { 
     960               writtenLat(idx) = -1.; 
     961               writtenLon(idx) = -1.; 
     962             } 
     963             else 
     964             { 
     965               writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
     966               writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
     967             } 
    964968           } 
    965969         } 
     
    976980             for (int nv = 0; nv < nvertex; ++nv) 
    977981             { 
    978                if (idx < boundslat.columns()) 
     982               if (indexToWrite(idx) < 0) 
     983               { 
     984                 writtenBndsLat(nv, idx) = -1.; 
     985                 writtenBndsLon(nv, idx) = -1.; 
     986               } 
     987               else 
    979988               { 
    980989                 writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 
    981990                 writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 
    982                } 
    983                else 
    984                { 
    985                  writtenBndsLat(nv, idx) = 0.; 
    986                  writtenBndsLon(nv, idx) = 0.; 
    987991                } 
    988992             } 
     
    995999           for (int idx = 0; idx < nbWritten; ++idx) 
    9961000           { 
    997                   if (idx < domain->areavalue.numElements()) 
    998                 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
     1001                  if (indexToWrite(idx) < 0) 
     1002              writtenArea(idx) = -1.; 
    9991003                  else 
    1000                 writtenArea(idx) = 0.; 
     1004                    writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
    10011005           } 
    10021006         } 
     
    12751279          SuperClassWriter::definition_end(); 
    12761280 
    1277           CArray<size_t, 1>& indexToWrite = axis->localIndexToWriteOnServer; 
     1281          CArray<int, 1>& indexToWrite = axis->localIndexToWriteOnServer; 
    12781282          int nbWritten = indexToWrite.numElements(); 
    12791283          CArray<double,1> axis_value(indexToWrite.numElements()); 
     
    12821286            for (int i = 0; i < nbWritten; i++) 
    12831287            { 
    1284               if (i < axis->value.numElements()) 
     1288              if (indexToWrite(i) < 0) 
     1289                axis_value(i) = -1;   // Some value in case of a hole 
     1290              else 
    12851291                axis_value(i) = axis->value(indexToWrite(i)); 
    1286               else 
    1287                 axis_value(i) = 0.; 
    12881292            } 
    12891293          } 
     
    12951299            for (int i = 0; i < nbWritten; i++) 
    12961300            { 
    1297               if (i < axis->label.numElements()) 
     1301              if (indexToWrite(i) < 0) 
     1302                axis_label(i) = boost::lexical_cast<string>(-1);  // Some value in case of a hole 
     1303              else 
    12981304                axis_label(i) = axis->label(indexToWrite(i)); 
    1299               else 
    1300                 axis_label(i) = boost::lexical_cast<string>(0);  // Write 0 as a label 
    13011305            } 
    13021306          } 
     
    13161320                  for (int i = 0; i < nbWritten; ++i) 
    13171321                  { 
    1318                     if (i < axis->bounds.columns()) 
     1322                    if (indexToWrite(i) < 0) 
     1323                    { 
     1324                      axis_bounds(0, i) = -1.; // Some value in case of a hole 
     1325                      axis_bounds(1, i) = -1.; 
     1326                    } 
     1327                    else 
    13191328                    { 
    13201329                      axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 
    13211330                      axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 
    1322                     } 
    1323                     else 
    1324                     { 
    1325                       axis_bounds(0, i) = 0.; 
    1326                       axis_bounds(1, i) = 0.; 
    13271331 
    13281332                    } 
     
    13561360                  for (int i = 0; i < nbWritten; ++i) 
    13571361                  { 
    1358                     if (i < axis->bounds.columns()) 
     1362                    if (indexToWrite(i) < 0) 
     1363                    { 
     1364                      axis_bounds(0, i) = -1.; 
     1365                      axis_bounds(1, i) = -1.; 
     1366                    } 
     1367                    else 
    13591368                    { 
    13601369                      axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 
    13611370                      axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 
    1362                     } 
    1363                     else 
    1364                     { 
    1365                       axis_bounds(0, i) = 0.; 
    1366                       axis_bounds(1, i) = 0.; 
    13671371                    } 
    13681372                  } 
Note: See TracChangeset for help on using the changeset viewer.