Ignore:
Timestamp:
06/05/15 16:42:18 (9 years ago)
Author:
rlacroix
Message:

Improve CF compliance: add a new axis attribute "bounds".

Fixes ticket #67.

File:
1 edited

Legend:

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

    r607 r609  
    482482      void CNc4DataOutput::writeAxis_(CAxis* axis) 
    483483      { 
    484          if (axis->IsWritten(this->filename)) return; 
    485          axis->checkAttributes(); 
    486          StdSize zoom_size_srv=axis->zoom_size_srv; 
    487          StdSize zoom_begin_srv=axis->zoom_begin_srv; 
    488          StdSize zoom_size  = (MULTI_FILE == SuperClass::type) ? zoom_size_srv 
    489                                                               : axis->zoom_size; 
    490          StdSize zoom_begin = (MULTI_FILE == SuperClass::type) ? zoom_begin_srv 
    491                                                               : axis->zoom_begin; 
    492  
    493  
    494          std::vector<StdString> dims; 
    495          StdString axisid = (!axis->name.isEmpty()) 
    496                              ? axis->name.getValue() : axis->getId(); 
    497          try 
    498          { 
    499            SuperClassWriter::addDimension(axisid, zoom_size); 
    500            dims.push_back(axisid); 
    501  
    502            switch (SuperClass::type) 
    503            { 
    504               case (MULTI_FILE ) : 
    505               {} 
    506               case (ONE_FILE) : 
     484        if (axis->IsWritten(this->filename)) return; 
     485        axis->checkAttributes(); 
     486        int zoom_size_srv  = axis->zoom_size_srv; 
     487        int zoom_begin_srv = axis->zoom_begin_srv; 
     488        int zoom_size  = (MULTI_FILE == SuperClass::type) ? zoom_size_srv : axis->zoom_size; 
     489        int zoom_begin = (MULTI_FILE == SuperClass::type) ? zoom_begin_srv : axis->zoom_begin; 
     490 
     491 
     492        std::vector<StdString> dims; 
     493        StdString axisid = !axis->name.isEmpty() ? axis->name.getValue() : axis->getId(); 
     494        try 
     495        { 
     496          SuperClassWriter::addDimension(axisid, zoom_size); 
     497          dims.push_back(axisid); 
     498 
     499          switch (SuperClass::type) 
     500          { 
     501            case MULTI_FILE: 
     502            case ONE_FILE: 
     503            { 
     504              SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); 
     505 
     506              SuperClassWriter::addAttribute("axis", StdString("Z"), &axisid); 
     507 
     508              if (!axis->name.isEmpty()) 
     509                SuperClassWriter::addAttribute("name", axis->name.getValue(), &axisid); 
     510 
     511              if (!axis->standard_name.isEmpty()) 
     512                SuperClassWriter::addAttribute("standard_name", axis->standard_name.getValue(), &axisid); 
     513 
     514              if (!axis->long_name.isEmpty()) 
     515                SuperClassWriter::addAttribute("long_name", axis->long_name.getValue(), &axisid); 
     516 
     517              if (!axis->unit.isEmpty()) 
     518                SuperClassWriter::addAttribute("units", axis->unit.getValue(), &axisid); 
     519 
     520              if (!axis->positive.isEmpty()) 
     521                if (axis->positive == CAxis::positive_attr::up) SuperClassWriter::addAttribute("positive", string("up"), &axisid); 
     522                else SuperClassWriter::addAttribute("positive", string("down"), &axisid); 
     523 
     524              StdString axisBoundsId = axisid + "_bounds"; 
     525              if (!axis->bounds.isEmpty()) 
    507526              { 
    508                  SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); 
    509  
    510                  SuperClassWriter::addAttribute("axis", StdString("Z"), &axisid); 
    511  
    512                  if (!axis->name.isEmpty()) 
    513                     SuperClassWriter::addAttribute 
    514                        ("name", axis->name.getValue(), &axisid); 
    515  
    516                  if (!axis->standard_name.isEmpty()) 
    517                     SuperClassWriter::addAttribute 
    518                        ("standard_name",  axis->standard_name.getValue(), &axisid); 
    519  
    520                  if (!axis->long_name.isEmpty()) 
    521                     SuperClassWriter::addAttribute 
    522                        ("long_name", axis->long_name.getValue(), &axisid); 
    523  
    524                  if (!axis->unit.isEmpty()) 
    525                     SuperClassWriter::addAttribute 
    526                        ("units", axis->unit.getValue(), &axisid); 
    527  
    528                 if (!axis->positive.isEmpty()) 
    529                   if (axis->positive==CAxis::positive_attr::up) SuperClassWriter::addAttribute("positive", string("up"), &axisid); 
    530                   else   SuperClassWriter::addAttribute("positive", string("down"), &axisid); 
    531  
    532                  SuperClassWriter::definition_end(); 
    533  
    534                  CArray<double,1> axis_value(zoom_size) ; 
    535                  for(StdSize i = 0 ; i < zoom_size_srv ; i++) axis_value(i)=axis->value(i+zoom_begin_srv) ; 
    536                  SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 
    537  
    538                  SuperClassWriter::definition_start(); 
    539  
    540                  break; 
     527                dims.push_back("axis_nbounds"); 
     528                SuperClassWriter::addVariable(axisBoundsId, NC_FLOAT, dims); 
     529                SuperClassWriter::addAttribute("bounds", axisBoundsId, &axisid); 
    541530              } 
    542               default : 
    543                  ERROR("CNc4DataOutput::writeDomain(domain)", 
    544                        << "[ type = " << SuperClass::type << "]" 
    545                        << " not implemented yet !"); 
    546            } 
    547          } 
    548          catch (CNetCdfException& e) 
    549          { 
    550            StdString msg("On writing the axis : "); 
    551            msg.append(axisid); msg.append("\n"); 
    552            msg.append("In the context : "); 
    553            CContext* context = CContext::getCurrent() ; 
    554            msg.append(context->getId()); msg.append("\n"); 
    555            msg.append(e.what()); 
    556            ERROR("CNc4DataOutput::writeAxis_(CAxis* axis)", << msg); 
    557          } 
    558          axis->addRelFile(this->filename); 
     531 
     532              SuperClassWriter::definition_end(); 
     533 
     534              CArray<double,1> axis_value(zoom_size); 
     535              for (int i = 0; i < zoom_size_srv; i++) axis_value(i) = axis->value(i + zoom_begin_srv); 
     536              SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 
     537 
     538              if (!axis->bounds.isEmpty()) 
     539              { 
     540                CArray<double,2> axisBounds(zoom_size, 2); 
     541                for (int i = 0; i < zoom_size_srv; i++) 
     542                { 
     543                  axisBounds(i, 0) = axis->bounds(i + zoom_begin_srv, 0); 
     544                  axisBounds(i, 1) = axis->bounds(i + zoom_begin_srv, 1); 
     545                } 
     546                SuperClassWriter::writeData(axisBounds, axisBoundsId, isCollective, 0); 
     547              } 
     548 
     549              SuperClassWriter::definition_start(); 
     550 
     551              break; 
     552            } 
     553            default : 
     554              ERROR("CNc4DataOutput::writeDomain(domain)", 
     555                    << "[ type = " << SuperClass::type << "]" 
     556                    << " not implemented yet !"); 
     557          } 
     558        } 
     559        catch (CNetCdfException& e) 
     560        { 
     561          StdString msg("On writing the axis : "); 
     562          msg.append(axisid); msg.append("\n"); 
     563          msg.append("In the context : "); 
     564          CContext* context = CContext::getCurrent() ; 
     565          msg.append(context->getId()); msg.append("\n"); 
     566          msg.append(e.what()); 
     567          ERROR("CNc4DataOutput::writeAxis_(CAxis* axis)", << msg); 
     568        } 
     569        axis->addRelFile(this->filename); 
    559570     } 
    560571 
     
    9991010                               ? file->description.getValue() 
    10001011                               : StdString("Created by xios"); 
     1012 
     1013         singleDomain = (file->nbDomains == 1); 
     1014 
    10011015         try 
    10021016         { 
    10031017           this->writeFileAttributes(filename, description, 
    1004                                      StdString ("CF-1.1"), 
     1018                                     StdString("CF-1.1"), 
    10051019                                     StdString("An IPSL model"), 
    10061020                                     this->getTimeStamp()); 
     1021 
     1022           if (file->nbAxis >= 1) 
     1023             SuperClassWriter::addDimension("axis_nbounds", 2); 
    10071024         } 
    10081025         catch (CNetCdfException& e) 
     
    10161033           ERROR("CNc4DataOutput::writeFile_ (CFile* file)", << msg); 
    10171034         } 
    1018          if (file->nbDomain==1) singleDomain=true ; 
    1019          else singleDomain=false ; 
    10201035      } 
    10211036 
Note: See TracChangeset for help on using the changeset viewer.