Ignore:
Timestamp:
06/10/15 10:39:11 (9 years ago)
Author:
rlacroix
Message:

Improve CF compliance: Add a new domain attribute "area".

Fixes ticket #68.

File:
1 edited

Legend:

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

    r609 r611  
    9999 
    100100         string lonid,latid,bounds_lonid,bounds_latid ; 
     101         string areaId = "area" + appendDomid; 
    101102/* 
    102103         StdString lonid_loc = (server->intraCommSize > 1) 
     
    118119                 if (server->intraCommSize > 1) 
    119120                 { 
    120  
    121121  //                 SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue()); 
    122122  //                 SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue()); 
     
    211211                 //SuperClassWriter::setDefaultValue(maskid, &dvm); 
    212212 
     213                 if (domain->hasArea) 
     214                 { 
     215                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     216                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     217                 } 
     218 
    213219                 SuperClassWriter::definition_end(); 
    214220 
     
    226232                     break; 
    227233                 } 
     234 
     235                 if (domain->hasArea) 
     236                   SuperClassWriter::writeData(domain->area_srv, areaId, isCollective, 0); 
     237 
    228238                 SuperClassWriter::definition_start(); 
    229239 
     
    234244                 SuperClassWriter::addDimension(dimXid, domain->zoom_ni.getValue()); 
    235245                 SuperClassWriter::addDimension(dimYid, domain->zoom_nj.getValue()); 
    236  
    237246 
    238247                 switch (domain->type) 
     
    255264                     break; 
    256265                 } 
     266 
     267                 if (domain->hasArea) 
     268                 { 
     269                   dim0.clear(); 
     270                   dim0.push_back(dimYid); dim0.push_back(dimXid); 
     271                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     272                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     273                   dim0.clear(); 
     274                 } 
     275 
    257276                 this->writeAxisAttributes 
    258277                    (lonid, "X", "longitude", "Longitude", "degrees_east", domid); 
     
    260279                    (latid, "Y", "latitude", "Latitude", "degrees_north", domid); 
    261280 
    262  
    263281                 SuperClassWriter::definition_end(); 
     282 
    264283                 switch (domain->type) 
    265284                 { 
     
    270289                     if (domain->isEmpty()) 
    271290                     { 
    272                        start[0]=0 ; start [1]=0 ; 
     291                       start[0]=0 ; start[1]=0 ; 
    273292                       count[0]=0 ; count[1]=0 ; 
    274293                     } 
     
    308327                   } 
    309328                 } 
     329 
     330                 if (domain->hasArea) 
     331                 { 
     332                   std::vector<StdSize> start(2); 
     333                   std::vector<StdSize> count(2); 
     334 
     335                   if (domain->isEmpty()) 
     336                   { 
     337                     start[0] = 0; start[1] = 0; 
     338                     count[0] = 0; count[1] = 0; 
     339                   } 
     340                   else 
     341                   { 
     342                     start[1] = domain->zoom_ibegin_srv - domain->zoom_ibegin.getValue(); 
     343                     start[0] = domain->zoom_jbegin_srv - domain->zoom_jbegin.getValue(); 
     344                     count[1] = domain->zoom_ni_srv; 
     345                     count[0] = domain->zoom_nj_srv; 
     346                   } 
     347 
     348                   SuperClassWriter::writeData(domain->area_srv, areaId, isCollective, 0, &start, &count); 
     349                 } 
     350 
    310351                 SuperClassWriter::definition_start(); 
    311352                 break; 
     
    351392 
    352393         string lonid,latid,bounds_lonid,bounds_latid ; 
     394         string areaId = "area" + appendDomid; 
    353395 
    354396         try 
     
    387429                 dim0.push_back(dimXid); 
    388430 
     431                 if (domain->hasArea) 
     432                 { 
     433                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     434                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     435                 } 
     436 
    389437                 SuperClassWriter::definition_end(); 
    390438 
     
    397445                   SuperClassWriter::writeData(domain->bounds_lat_srv, bounds_latid, isCollective, 0); 
    398446                 } 
     447 
     448                 if (domain->hasArea) 
     449                   SuperClassWriter::writeData(domain->area_srv, areaId, isCollective, 0); 
     450 
    399451                 SuperClassWriter::definition_start(); 
    400452                 break ; 
     
    426478                 } 
    427479 
     480                 if (domain->hasArea) 
     481                 { 
     482                   dim0.clear(); 
     483                   dim0.push_back(dimXid); 
     484                   SuperClassWriter::addVariable(areaId, NC_FLOAT, dim0); 
     485                   SuperClassWriter::addAttribute("units", StdString("m2"), &areaId); 
     486                 } 
     487 
    428488                 SuperClassWriter::definition_end(); 
    429489 
     
    456516                 } 
    457517 
     518                 if (domain->hasArea) 
     519                   SuperClassWriter::writeData(domain->area_srv, areaId, isCollective, 0, &start, &count); 
    458520 
    459521                 SuperClassWriter::definition_start(); 
     
    607669         StdString dimXid,dimYid; 
    608670         std::deque<StdString> dimIdList, dimCoordList; 
     671         bool hasArea = false; 
     672         StdString cellMeasures = "area:"; 
    609673 
    610674         for (int i = 0; i < numElement; ++i) 
     
    639703                 break ; 
    640704            } 
     705            if (domain->hasArea) 
     706            { 
     707              hasArea = true; 
     708              cellMeasures += " area" + appendDomid; 
     709            } 
    641710            ++idxDomain; 
    642711           } 
     
    754823              SuperClassWriter::addAttribute("interval_write", duration.toString(), &fieldid); 
    755824           } 
     825 
     826           if (hasArea) 
     827             SuperClassWriter::addAttribute("cell_measures", cellMeasures, &fieldid); 
    756828 
    757829           if (!field->default_value.isEmpty()) 
Note: See TracChangeset for help on using the changeset viewer.