source: XIOS/dev/dev_olga/src/filter/source_filter.cpp @ 1021

Last change on this file since 1021 was 1021, checked in by oabramkina, 7 years ago

Intermeadiate version for merging with new server functionalities.

File size: 3.0 KB
RevLine 
[638]1#include "source_filter.hpp"
2#include "grid.hpp"
3#include "exception.hpp"
[756]4#include "calendar_util.hpp"
[638]5
6namespace xios
7{
[1021]8  CSourceFilter::CSourceFilter(CGarbageCollector& gc, CGrid* grid,
9                               const CDuration offset /*= NoneDu*/, bool manualTrigger /*= false*/)
10    : COutputPin(gc, manualTrigger)
11    , grid(grid)
[756]12    , offset(offset)
[638]13  {
14    if (!grid)
15      ERROR("CSourceFilter::CSourceFilter(CGrid* grid)",
16            "Impossible to construct a source filter without providing a grid.");
17  }
18
19  template <int N>
[643]20  void CSourceFilter::streamData(CDate date, const CArray<double, N>& data)
[638]21  {
[756]22    date = date + offset; // this is a temporary solution, it should be part of a proper temporal filter
23
[638]24    CDataPacketPtr packet(new CDataPacket);
[643]25    packet->date = date;
26    packet->timestamp = date;
[638]27    packet->status = CDataPacket::NO_ERROR;
28
29    packet->data.resize(grid->storeIndex_client.numElements());
30    grid->inputField(data, packet->data);
31
[1021]32    onOutputReady(packet);
[638]33  }
34
[643]35  template void CSourceFilter::streamData<1>(CDate date, const CArray<double, 1>& data);
36  template void CSourceFilter::streamData<2>(CDate date, const CArray<double, 2>& data);
37  template void CSourceFilter::streamData<3>(CDate date, const CArray<double, 3>& data);
[932]38  template void CSourceFilter::streamData<4>(CDate date, const CArray<double, 4>& data);
39  template void CSourceFilter::streamData<5>(CDate date, const CArray<double, 5>& data);
40  template void CSourceFilter::streamData<6>(CDate date, const CArray<double, 6>& data);
41  template void CSourceFilter::streamData<7>(CDate date, const CArray<double, 7>& data);
[638]42
[643]43  void CSourceFilter::streamDataFromServer(CDate date, const std::map<int, CArray<double, 1> >& data)
[638]44  {
[756]45    date = date + offset; // this is a temporary solution, it should be part of a proper temporal filter
46
[638]47    CDataPacketPtr packet(new CDataPacket);
[643]48    packet->date = date;
49    packet->timestamp = date;
[638]50    packet->status = CDataPacket::NO_ERROR;
51
[1021]52    // if (data.size() != grid->storeIndex_toSrv.size())
53    if (data.size() != grid->storeIndex_fromSrv.size())
[643]54      ERROR("CSourceFilter::streamDataFromServer(CDate date, const std::map<int, CArray<double, 1> >& data)",
[638]55            << "Incoherent data received from servers,"
[1021]56            << " expected " << grid->storeIndex_fromSrv.size() << " chunks but " << data.size() << " were given.");
[638]57
58    packet->data.resize(grid->storeIndex_client.numElements());
59    std::map<int, CArray<double, 1> >::const_iterator it, itEnd = data.end();
60    for (it = data.begin(); it != itEnd; it++)
61    {
[1021]62      // CArray<int,1>& index = grid->storeIndex_toSrv[it->first];
63      CArray<int,1>& index = grid->storeIndex_fromSrv[it->first];
[638]64      for (int n = 0; n < index.numElements(); n++)
65        packet->data(index(n)) = it->second(n);
66    }
67
[1021]68    onOutputReady(packet);
[638]69  }
70
[643]71  void CSourceFilter::signalEndOfStream(CDate date)
[638]72  {
73    CDataPacketPtr packet(new CDataPacket);
[643]74    packet->date = date;
75    packet->timestamp = date;
[638]76    packet->status = CDataPacket::END_OF_STREAM;
[1021]77    onOutputReady(packet);
[638]78  }
79} // namespace xios
Note: See TracBrowser for help on using the repository browser.