Ignore:
Timestamp:
01/14/19 13:33:48 (5 years ago)
Author:
oabramkina
Message:

Merging dev to trunk. Major changes:

(1) Grid mask is applied in the source filter of clients: unmasked values are replaced by NaN. It is not reconstructed any more by servers.

(2) Domain/axis mask has been incorporated into data index, with only data index sent to servers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/io/nc4_data_output.cpp

    r1622 r1637  
    155155*/ 
    156156 
    157          CArray<size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
     157         CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
    158158         int nbWritten = indexToWrite.numElements(); 
    159159         CArray<double,1> writtenLat, writtenLon; 
     
    167167           for (int idx = 0; idx < nbWritten; ++idx) 
    168168           { 
    169                   if (idx < domain->latvalue.numElements()) 
    170                   { 
    171                 writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
    172                 writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
    173                   } 
    174                   else 
    175                   { 
    176                 writtenLat(idx) = 0.; 
    177                 writtenLon(idx) = 0.; 
    178                   } 
     169             if (indexToWrite(idx) < 0) 
     170             { 
     171               writtenLat(idx) = -1.;   // hole 
     172               writtenLon(idx) = -1.; 
     173             } 
     174             else 
     175             { 
     176               writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
     177               writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
     178             } 
    179179           } 
    180           
    181180 
    182181           if (domain->hasBounds) 
     
    190189               for (int nv = 0; nv < nvertex; ++nv) 
    191190               { 
    192                  if (idx < boundslat.columns()) 
    193                  { 
     191                 if (indexToWrite(idx) < 0) 
     192                 { 
     193                   writtenBndsLat(nv, idx) = -1.;  // hole 
     194                   writtenBndsLon(nv, idx) = -1.; 
     195                 } 
     196                 else 
     197                 { 
    194198                   writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 
    195199                   writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 
    196                  } 
    197                  else 
    198                  { 
    199                    writtenBndsLat(nv, idx) = 0.; 
    200                    writtenBndsLon(nv, idx) = 0.; 
    201                  } 
     200                 } 
    202201               } 
    203202           } 
     
    209208           for (int idx = 0; idx < nbWritten; ++idx) 
    210209           { 
    211                   if (idx < domain->areavalue.numElements()) 
    212                 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
     210                  if (indexToWrite(idx) < 0) 
     211              writtenArea(idx) = -1.; 
    213212                  else 
    214                 writtenArea(idx) = 0.; 
     213              writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
    215214           } 
    216215         } 
     
    427426                     std::vector<StdSize> start(2) ; 
    428427                     std::vector<StdSize> count(2) ; 
    429                      if (domain->isEmpty()) 
    430                      { 
    431                        start[0]=0 ; start[1]=0 ; 
    432                        count[0]=0 ; count[1]=0 ; 
    433                      } 
    434                      else 
     428// Comment out: 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 
    435435                     { 
    436436                       start[1]=domain->ibegin; 
     
    877877          case (MULTI_FILE) : 
    878878          { 
     879            ERROR("CNc4DataOutput::writeDomain(domain)", 
     880            << "[ type = multiple_file ]" 
     881            << " is not yet implemented for UGRID files !"); 
    879882            break; 
    880883          } 
     
    942945         int nvertex = (domain->nvertex.isEmpty()) ? 0 : domain->nvertex; 
    943946 
    944          CArray<size_t, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
     947         CArray<int, 1>& indexToWrite = domain->localIndexToWriteOnServer; 
    945948         int nbWritten = indexToWrite.numElements(); 
    946949         CArray<double,1> writtenLat, writtenLon; 
     
    954957           for (int idx = 0; idx < nbWritten; ++idx) 
    955958           { 
    956              if (idx < domain->latvalue.numElements()) 
    957              { 
    958                writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
    959                writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
    960              } 
    961              else 
    962              { 
    963                writtenLat(idx) = 0.; 
    964                writtenLon(idx) = 0.; 
    965              } 
     959             if (indexToWrite(idx) < 0) 
     960             { 
     961               writtenLat(idx) = -1.; 
     962               writtenLon(idx) = -1.; 
     963             } 
     964             else 
     965             { 
     966               writtenLat(idx) = domain->latvalue(indexToWrite(idx)); 
     967               writtenLon(idx) = domain->lonvalue(indexToWrite(idx)); 
     968             } 
    966969           } 
    967970         } 
     
    978981             for (int nv = 0; nv < nvertex; ++nv) 
    979982             { 
    980                if (idx < boundslat.columns()) 
     983               if (indexToWrite(idx) < 0) 
     984               { 
     985                 writtenBndsLat(nv, idx) = -1.; 
     986                 writtenBndsLon(nv, idx) = -1.; 
     987               } 
     988               else 
    981989               { 
    982990                 writtenBndsLat(nv, idx) = boundslat(nv, int(indexToWrite(idx))); 
    983991                 writtenBndsLon(nv, idx) = boundslon(nv, int(indexToWrite(idx))); 
    984                } 
    985                else 
    986                { 
    987                  writtenBndsLat(nv, idx) = 0.; 
    988                  writtenBndsLon(nv, idx) = 0.; 
    989992                } 
    990993             } 
     
    9971000           for (int idx = 0; idx < nbWritten; ++idx) 
    9981001           { 
    999                   if (idx < domain->areavalue.numElements()) 
    1000                 writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
    1001                   else 
    1002                 writtenArea(idx) = 0.; 
     1002             if (indexToWrite(idx) < 0) 
     1003               writtenArea(idx) = -1.; 
     1004             else 
     1005               writtenArea(idx) = domain->areavalue(indexToWrite(idx)); 
    10031006           } 
    10041007         } 
     
    12771280          SuperClassWriter::definition_end(); 
    12781281 
    1279           CArray<size_t, 1>& indexToWrite = axis->localIndexToWriteOnServer; 
     1282          CArray<int, 1>& indexToWrite = axis->localIndexToWriteOnServer; 
    12801283          int nbWritten = indexToWrite.numElements(); 
    12811284          CArray<double,1> axis_value(indexToWrite.numElements()); 
     
    12841287            for (int i = 0; i < nbWritten; i++) 
    12851288            { 
    1286               if (i < axis->value.numElements()) 
     1289              if (indexToWrite(i) < 0) 
     1290                axis_value(i) = -1;   // Some value in case of a hole 
     1291              else 
    12871292                axis_value(i) = axis->value(indexToWrite(i)); 
    1288               else 
    1289                 axis_value(i) = 0.; 
    12901293            } 
    12911294          } 
     
    12971300            for (int i = 0; i < nbWritten; i++) 
    12981301            { 
    1299               if (i < axis->label.numElements()) 
     1302              if (indexToWrite(i) < 0) 
     1303                axis_label(i) = boost::lexical_cast<string>(-1);  // Some value in case of a hole 
     1304              else 
    13001305                axis_label(i) = axis->label(indexToWrite(i)); 
    1301               else 
    1302                 axis_label(i) = boost::lexical_cast<string>(0);  // Write 0 as a label 
    13031306            } 
    13041307          } 
     
    13181321                  for (int i = 0; i < nbWritten; ++i) 
    13191322                  { 
    1320                     if (i < axis->bounds.columns()) 
     1323                    if (indexToWrite(i) < 0) 
     1324                    { 
     1325                      axis_bounds(0, i) = -1.; // Some value in case of a hole 
     1326                      axis_bounds(1, i) = -1.; 
     1327                    } 
     1328                    else 
    13211329                    { 
    13221330                      axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 
    13231331                      axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 
    1324                     } 
    1325                     else 
    1326                     { 
    1327                       axis_bounds(0, i) = 0.; 
    1328                       axis_bounds(1, i) = 0.; 
    1329  
    13301332                    } 
    13311333                  } 
     
    13581360                  for (int i = 0; i < nbWritten; ++i) 
    13591361                  { 
    1360                     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 
    13611368                    { 
    13621369                      axis_bounds(0, i) = axis->bounds(0, int(indexToWrite(i))); 
    13631370                      axis_bounds(1, i) = axis->bounds(1, int(indexToWrite(i))); 
    1364                     } 
    1365                     else 
    1366                     { 
    1367                       axis_bounds(0, i) = 0.; 
    1368                       axis_bounds(1, i) = 0.; 
    13691371                    } 
    13701372                  } 
Note: See TracChangeset for help on using the changeset viewer.