source: XIOS/trunk/src/io/nc4_data_input.cpp @ 685

Last change on this file since 685 was 685, checked in by rlacroix, 9 years ago

Merge "output" and "input" folders into one "io" folder.

Some files were used for both output and input so the separation was not valid anymore.

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 2.8 KB
Line 
1#include "nc4_data_input.hpp"
2
3#include "context.hpp"
4#include "context_server.hpp"
5
6namespace xios
7{
8  CNc4DataInput::CNc4DataInput(const StdString& filename, MPI_Comm comm_file, bool multifile, bool isCollective /*= true*/)
9    : SuperClass()
10    , SuperClassWriter(filename, &comm_file, multifile)
11    , comm_file(comm_file)
12    , filename(filename)
13    , isCollective(isCollective)
14  {
15    SuperClass::type = multifile ? MULTI_FILE : ONE_FILE;
16  }
17
18  CNc4DataInput::~CNc4DataInput(void)
19  { /* Nothing more to do */ }
20
21  StdSize CNc4DataInput::getFieldNbRecords_(CField* field)
22  {
23    StdString fieldId = !field->name.isEmpty() ? field->name.getValue() : field->getBaseFieldReference()->getId();
24
25    if (SuperClassWriter::isTemporal(fieldId))
26    {
27      return SuperClassWriter::getDimensions(&fieldId)[SuperClassWriter::getUnlimitedDimensionName()];
28    }
29
30    return 1;
31  }
32
33  void CNc4DataInput::readFieldData_(CField* field)
34  {
35    CContext* context = CContext::getCurrent();
36    CContextServer* server = context->server;
37
38    CGrid* grid = field->grid;
39
40    if (!grid->doGridHaveDataToWrite())
41      if (SuperClass::type==MULTI_FILE || !isCollective) return;
42
43    StdString fieldId = !field->name.isEmpty() ? field->name.getValue() : field->getBaseFieldReference()->getId();
44
45    CArray<double,1> fieldData(grid->getWrittenDataSize());
46    if (!field->default_value.isEmpty()) fieldData = field->default_value;
47
48    switch (SuperClass::type)
49    {
50      case MULTI_FILE:
51        SuperClassWriter::getData(fieldData, fieldId, isCollective, field->getNStep() - 1);
52        break;
53      case ONE_FILE:
54      {
55        std::vector<int> nZoomBeginGlobal = grid->getDistributionServer()->getZoomBeginGlobal();
56        std::vector<int> nZoomBeginServer = grid->getDistributionServer()->getZoomBeginServer();
57        std::vector<int> nZoomSizeServer  = grid->getDistributionServer()->getZoomSizeServer();
58
59        int ssize = nZoomBeginGlobal.size();
60
61        std::vector<StdSize> start(ssize);
62        std::vector<StdSize> count(ssize);
63
64        for (int i = 0; i < ssize; ++i)
65        {
66          start[i] = nZoomBeginServer[ssize - i - 1] - nZoomBeginGlobal[ssize - i - 1];
67          count[i] = nZoomSizeServer[ssize - i - 1];
68        }
69
70        SuperClassWriter::getData(fieldData, fieldId, isCollective, field->getNStep() - 1, &start, &count);
71        break;
72      }
73    }
74
75    field->inputField(fieldData);
76
77    if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty())
78    {
79      double scaleFactor = 1.0, addOffset = 0.0;
80      if (!field->scale_factor.isEmpty()) scaleFactor = field->scale_factor;
81      if (!field->add_offset.isEmpty()) addOffset = field->add_offset;
82      field->invertScaleFactorAddOffset(scaleFactor, addOffset);
83    }
84  }
85
86  void CNc4DataInput::closeFile_(void)
87  {
88    SuperClassWriter::close();
89  }
90} // namespace xios
Note: See TracBrowser for help on using the repository browser.