source: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/client_to_model_store_filter.cpp @ 1960

Last change on this file since 1960 was 1930, checked in by ymipsl, 4 years ago

Big update on on going work related to data distribution and transfer between clients and servers.
Revisite of the source and store filter using "connectors".

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.5 KB
Line 
1#include "client_to_model_store_filter.hpp"
2#include "context.hpp"
3#include "grid.hpp"
4#include "timer.hpp"
5#include "tracer.hpp"
6
7namespace xios
8{
9  CClientToModelStoreFilter::CClientToModelStoreFilter(CGarbageCollector& gc, CField* field)
10    : CInputPin(gc, 1)
11    , gc_(gc)
12  {
13    context_ = CContext::getCurrent() ;
14    grid_ = field->getGrid() ;
15
16    detectMissingValues_ = (!field->detect_missing_value.isEmpty() && !field->default_value.isEmpty() && field->detect_missing_value == true);
17    hasMissingValue_ = !field->default_value.isEmpty() ;
18    if (hasMissingValue_) missingValue_  = field->default_value ;
19    detectMissingValues_ = (!field->detect_missing_value.isEmpty() && hasMissingValue_);
20  }
21
22  CConstDataPacketPtr CClientToModelStoreFilter::getPacket(Time timestamp)
23  {
24    CTimer timer("CStoreFilter::getPacket");
25//    timer.resume();
26    info(0)<<"ENTERING CStoreFilter::getPacket"<<std::endl ;
27    traceOff() ;
28//    timer.suspend();
29    CConstDataPacketPtr packet;
30    const double timeout = CXios::recvFieldTimeout;
31
32    do
33    {
34      if (canBeTriggered()) trigger(timestamp);
35
36      timer.resume();
37
38      std::map<Time, CDataPacketPtr>::const_iterator it = packets_.find(timestamp);
39      if (it != packets_.end()) packet = it->second;
40      else  context_->eventLoop(); // if the packet is not available yet, check if it can be received
41
42      timer.suspend();
43    } while (!packet && timer.getCumulatedTime() < timeout);
44//    timer.resume();
45    traceOn() ;
46//    timer.suspend();
47
48    if (!packet)
49    {
50      std::map<Time, CDataPacketPtr>::const_iterator it ;
51      info(0)<<"Impossible to get the packet with timestamp = " << timestamp<<std::endl<<"Available timestamp are : "<<std::endl ;
52      for(it=packets_.begin();it!=packets_.end();++it) info(0)<<it->first<<"  ";
53      info(0)<<std::endl ;
54      ERROR("CConstDataPacketPtr CStoreFilter::getPacket(Time timestamp) const",
55            << "Impossible to get the packet with timestamp = " << timestamp);
56    }
57    return packet;
58  }
59
60  template <int N>
61  CDataPacket::StatusCode CClientToModelStoreFilter::getData(Time timestamp, CArray<double, N>& data)
62  {
63    CConstDataPacketPtr packet = getPacket(timestamp);
64
65    if (packet->status == CDataPacket::NO_ERROR)
66    {
67      if (hasMissingValue_) grid_->getWorkflowToModelConnector()->transfer(packet->data, data, missingValue_);
68      else grid_->getWorkflowToModelConnector()->transfer(packet->data, data);
69    }
70    return packet->status;
71  }
72
73  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<1>(Time timestamp, CArray<double, 1>& data);
74  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<2>(Time timestamp, CArray<double, 2>& data);
75  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<3>(Time timestamp, CArray<double, 3>& data);
76  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<4>(Time timestamp, CArray<double, 4>& data);
77  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<5>(Time timestamp, CArray<double, 5>& data);
78  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<6>(Time timestamp, CArray<double, 6>& data);
79  template CDataPacket::StatusCode CClientToModelStoreFilter::getData<7>(Time timestamp, CArray<double, 7>& data);
80
81  void CClientToModelStoreFilter::onInputReady(std::vector<CDataPacketPtr> data)
82  {
83
84    CDataPacketPtr packet;
85    if (detectMissingValues_)
86    {
87      const size_t nbData = data[0]->data.numElements();
88
89      packet = CDataPacketPtr(new CDataPacket);
90      packet->date = data[0]->date;
91      packet->timestamp = data[0]->timestamp;
92      packet->status = data[0]->status;
93      packet->data.resize(nbData);
94      packet->data = data[0]->data;
95
96      for (size_t idx = 0; idx < nbData; ++idx)
97      {
98        if (NumTraits<double>::isNan(packet->data(idx)))
99          packet->data(idx) = missingValue_;
100      }
101
102    }
103
104    else
105    {
106      packet = data[0];
107    }
108
109    packets_.insert(std::make_pair(packet->timestamp, packet));
110    // The packet is always destroyed by the garbage collector
111    // so we register but never unregister
112    gc_.registerObject(this, packet->timestamp);
113
114  }
115
116  bool CClientToModelStoreFilter::mustAutoTrigger() const
117  {
118    return false;
119  }
120
121  bool CClientToModelStoreFilter::isDataExpected(const CDate& date) const
122  {
123    return true;
124  }
125
126  void CClientToModelStoreFilter::invalidate(Time timestamp)
127  {
128    CInputPin::invalidate(timestamp);
129    packets_.erase(packets_.begin(), packets_.lower_bound(timestamp));
130  }
131} // namespace xios
Note: See TracBrowser for help on using the repository browser.