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

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

Grid: Avoid some heap allocations and do various cleanups.

File size: 2.2 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(CDate date, const CArray<double, N>& data)
17  {
18    CDataPacketPtr packet(new CDataPacket);
19    packet->date = date;
20    packet->timestamp = date;
21    packet->status = CDataPacket::NO_ERROR;
22
23    packet->data.resize(grid->storeIndex_client.numElements());
24    grid->inputField(data, packet->data);
25
26    deliverOuput(packet);
27  }
28
29  template void CSourceFilter::streamData<1>(CDate date, const CArray<double, 1>& data);
30  template void CSourceFilter::streamData<2>(CDate date, const CArray<double, 2>& data);
31  template void CSourceFilter::streamData<3>(CDate date, const CArray<double, 3>& data);
32
33  void CSourceFilter::streamDataFromServer(CDate date, const std::map<int, CArray<double, 1> >& data)
34  {
35    CDataPacketPtr packet(new CDataPacket);
36    packet->date = date;
37    packet->timestamp = date;
38    packet->status = CDataPacket::NO_ERROR;
39
40    if (data.size() != grid->storeIndex_toSrv.size())
41      ERROR("CSourceFilter::streamDataFromServer(CDate date, const std::map<int, CArray<double, 1> >& data)",
42            << "Incoherent data received from servers,"
43            << " expected " << grid->storeIndex_toSrv.size() << " chunks but " << data.size() << " were given.");
44
45    packet->data.resize(grid->storeIndex_client.numElements());
46    std::map<int, CArray<double, 1> >::const_iterator it, itEnd = data.end();
47    for (it = data.begin(); it != itEnd; it++)
48    {
49      CArray<int,1>& index = grid->storeIndex_toSrv[it->first];
50
51      for (int n = 0; n < index.numElements(); n++)
52        packet->data(index(n)) = it->second(n);
53    }
54
55    deliverOuput(packet);
56  }
57
58  void CSourceFilter::signalEndOfStream(CDate date)
59  {
60    CDataPacketPtr packet(new CDataPacket);
61    packet->date = date;
62    packet->timestamp = date;
63    packet->status = CDataPacket::END_OF_STREAM;
64    deliverOuput(packet);
65  }
66} // namespace xios
Note: See TracBrowser for help on using the repository browser.