source: XIOS/trunk/src/filter/source_filter.cpp @ 641

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

Add a source filter and two terminal filters.

File size: 2.1 KB
Line 
1#include "source_filter.hpp"
2#include "grid.hpp"
3#include "exception.hpp"
4
5namespace xios
6{
7  CSourceFilter::CSourceFilter(CGrid* grid)
8    : grid(grid)
9  {
10    if (!grid)
11      ERROR("CSourceFilter::CSourceFilter(CGrid* grid)",
12            "Impossible to construct a source filter without providing a grid.");
13  }
14
15  template <int N>
16  void CSourceFilter::streamData(Time timestamp, const CArray<double, N>& data)
17  {
18    CDataPacketPtr packet(new CDataPacket);
19    packet->timestamp = timestamp;
20    packet->status = CDataPacket::NO_ERROR;
21
22    packet->data.resize(grid->storeIndex_client.numElements());
23    grid->inputField(data, packet->data);
24
25    deliverOuput(packet);
26  }
27
28  template void CSourceFilter::streamData<1>(Time timestamp, const CArray<double, 1>& data);
29  template void CSourceFilter::streamData<2>(Time timestamp, const CArray<double, 2>& data);
30  template void CSourceFilter::streamData<3>(Time timestamp, const CArray<double, 3>& data);
31
32  void CSourceFilter::streamDataFromServer(Time timestamp, const std::map<int, CArray<double, 1> >& data)
33  {
34    CDataPacketPtr packet(new CDataPacket);
35    packet->timestamp = timestamp;
36    packet->status = CDataPacket::NO_ERROR;
37
38    if (data.size() != grid->storeIndex_toSrv.size())
39      ERROR("CSourceFilter::streamDataFromServer(Time timestamp, const std::map<int, CArray<double, 1> >& data)",
40            << "Incoherent data received from servers,"
41            << " expected " << grid->storeIndex_toSrv.size() << " chunks but " << data.size() << " were given.");
42
43    packet->data.resize(grid->storeIndex_client.numElements());
44    std::map<int, CArray<double, 1> >::const_iterator it, itEnd = data.end();
45    for (it = data.begin(); it != itEnd; it++)
46    {
47      CArray<int,1>& index = *grid->storeIndex_toSrv[it->first];
48
49      for (int n = 0; n < index.numElements(); n++)
50        packet->data(index(n)) = it->second(n);
51    }
52
53    deliverOuput(packet);
54  }
55
56  void CSourceFilter::signalEndOfStream(Time timestamp)
57  {
58    CDataPacketPtr packet(new CDataPacket);
59    packet->timestamp = timestamp;
60    packet->status = CDataPacket::END_OF_STREAM;
61    deliverOuput(packet);
62  }
63} // namespace xios
Note: See TracBrowser for help on using the repository browser.