Changeset 692 for XIOS/trunk/src/io


Ignore:
Timestamp:
09/16/15 16:26:32 (9 years ago)
Author:
rlacroix
Message:

Add a new file attribute to give our users more control on the time counter.

The time_counter attribute can take one of the following values:

  • centered: use centered times for the time counter (previous behavior, used by default)
  • instant: use instant times for the time counter
  • record: use record indexes for the time counter
  • none: disable the output of the time counter completely.
File:
1 edited

Legend:

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

    r686 r692  
    14091409 
    14101410         CArray<double,1> time_data(1) ; 
     1411         CArray<double,1> time_data_bound(2); 
    14111412         CArray<double,1> time_counter(1) ; 
    14121413         CArray<double,1> time_counter_bound(2); 
    1413          CArray<double,1> time_data_bound(2); 
    14141414 
    14151415        bool wtime   = !(!field->operation.isEmpty() && (field->getOperationTimeType() == func::CFunctor::once)); 
     
    14171417        if (wtime) 
    14181418        { 
    1419           time_counter(0)= (Time(field->last_Write_srv) + Time(field->lastlast_Write_srv)) / 2; 
     1419          Time lastWrite = field->last_Write_srv; 
     1420          Time lastLastWrite = field->lastlast_Write_srv; 
     1421 
    14201422          if (field->getOperationTimeType() == func::CFunctor::instant) 
    1421             time_data(0) = Time(field->last_Write_srv); 
    1422           else if (field->getOperationTimeType() == func::CFunctor::centered) time_data(0) = time_counter(0); 
    1423  
    1424           time_counter_bound(0) = Time(field->lastlast_Write_srv); 
    1425           time_counter_bound(1) = Time(field->last_Write_srv); 
     1423            time_data(0) = lastWrite; 
     1424          else if (field->getOperationTimeType() == func::CFunctor::centered) 
     1425            time_data(0) = (lastWrite + lastLastWrite) / 2; 
     1426 
    14261427          if (field->getOperationTimeType() == func::CFunctor::instant) 
    1427             time_data_bound(0) = time_data_bound(1) = Time(field->last_Write_srv); 
     1428            time_data_bound(0) = time_data_bound(1) = lastWrite; 
    14281429          else if (field->getOperationTimeType() == func::CFunctor::centered) 
    14291430          { 
    1430             time_data_bound(0) = time_counter_bound(0); 
    1431             time_data_bound(1) = time_counter_bound(1); 
     1431            time_data_bound(0) = lastLastWrite; 
     1432            time_data_bound(1) = lastWrite; 
    14321433          } 
    1433          } 
     1434 
     1435          if (field->file->time_counter == CFile::time_counter_attr::instant) 
     1436            time_counter(0) = lastWrite; 
     1437          else if (field->file->time_counter == CFile::time_counter_attr::centered) 
     1438            time_counter(0) = (lastWrite + lastLastWrite) / 2; 
     1439          else if (field->file->time_counter == CFile::time_counter_attr::record) 
     1440            time_counter(0) = field->getNStep() - 1; 
     1441 
     1442 
     1443          if (field->file->time_counter == CFile::time_counter_attr::instant) 
     1444            time_counter_bound(0) = time_counter_bound(1) = lastWrite; 
     1445          else if (field->file->time_counter == CFile::time_counter_attr::centered) 
     1446          { 
     1447            time_counter_bound(0) = lastLastWrite; 
     1448            time_counter_bound(1) = lastWrite; 
     1449          } 
     1450          else if (field->file->time_counter == CFile::time_counter_attr::record) 
     1451            time_counter_bound(0) = time_counter_bound(1) = field->getNStep() - 1; 
     1452        } 
    14341453 
    14351454         bool isRoot ; 
     
    14681487              case (MULTI_FILE) : 
    14691488              { 
    1470                  SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep()-1); 
     1489                 SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1); 
    14711490                 if (wtime) 
    14721491                 { 
    1473                    SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep()-1); 
    1474                    SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep()-1); 
    1475                    SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1); 
    1476                    SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1); 
     1492                   SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep() - 1); 
     1493                   SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1); 
     1494                   if (field->file->time_counter != CFile::time_counter_attr::none) 
     1495                   { 
     1496                     SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep() - 1); 
     1497                     if (field->file->time_counter != CFile::time_counter_attr::record) 
     1498                       SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1); 
     1499                   } 
    14771500                 } 
    14781501                 break ; 
     
    15661589                if (wtime) 
    15671590                { 
    1568                   SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 
    1569                   SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep() - 1, isRoot); 
    1570                   SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); 
    1571                   SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); 
     1591                   SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 
     1592                   SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); 
     1593                   if (field->file->time_counter != CFile::time_counter_attr::none) 
     1594                   { 
     1595                     SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep() - 1, isRoot); 
     1596                     if (field->file->time_counter != CFile::time_counter_attr::record) 
     1597                       SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); 
     1598                   } 
    15721599                } 
    15731600 
     
    16451672           } 
    16461673 
    1647            // Adding time_counter 
    1648            axisid = "time_counter" ; 
    1649            axisBoundId = "time_counter_bounds" ; 
    1650            dims.clear() ; 
    1651            dims.push_back(timeid); 
    1652            if (!SuperClassWriter::varExist(axisid)) 
     1674           if (field->file->time_counter != CFile::time_counter_attr::none) 
    16531675           { 
    1654               SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims); 
    1655               SuperClassWriter::addAttribute("axis", string("T"), &axisid); 
    1656               CDate timeOrigin=cal->getTimeOrigin() ; 
    1657               StdString strTimeOrigin=timeOrigin.toString() ; 
    1658  
    1659               this->writeTimeAxisAttributes 
    1660                  (axisid, cal->getType(), 
    1661                   StdString("seconds since ").append(strTimeOrigin), 
    1662                   strTimeOrigin, axisBoundId); 
    1663            } 
    1664  
    1665            // Adding time_counter_bound dimension 
    1666            if (!SuperClassWriter::varExist(axisBoundId)) 
    1667            { 
    1668               dims.clear(); 
    1669               dims.push_back(timeid); 
    1670               dims.push_back(timeBoundId); 
    1671               SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims); 
     1676             // Adding time_counter 
     1677             axisid = "time_counter"; 
     1678             axisBoundId = "time_counter_bounds"; 
     1679             dims.clear(); 
     1680             dims.push_back(timeid); 
     1681             if (!SuperClassWriter::varExist(axisid)) 
     1682             { 
     1683                SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims); 
     1684                SuperClassWriter::addAttribute("axis", string("T"), &axisid); 
     1685 
     1686                if (field->file->time_counter != CFile::time_counter_attr::record) 
     1687                { 
     1688                  CDate timeOrigin = cal->getTimeOrigin(); 
     1689                  StdString strTimeOrigin = timeOrigin.toString(); 
     1690 
     1691                  this->writeTimeAxisAttributes(axisid, cal->getType(), 
     1692                                                StdString("seconds since ").append(strTimeOrigin), 
     1693                                                strTimeOrigin, axisBoundId); 
     1694                } 
     1695             } 
     1696 
     1697             // Adding time_counter_bound dimension 
     1698             if (field->file->time_counter != CFile::time_counter_attr::record) 
     1699             { 
     1700                if (!SuperClassWriter::varExist(axisBoundId)) 
     1701                { 
     1702                  dims.clear(); 
     1703                  dims.push_back(timeid); 
     1704                  dims.push_back(timeBoundId); 
     1705                  SuperClassWriter::addVariable(axisBoundId, NC_DOUBLE, dims); 
     1706                } 
     1707             } 
    16721708           } 
    16731709         } 
Note: See TracChangeset for help on using the changeset viewer.