source: XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/temporal_transform_filter.cpp @ 2230

Last change on this file since 2230 was 2195, checked in by yushan, 3 years ago

workflow graph : enable temporal splitting filter

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.8 KB
Line 
1#include "temporal_transform_filter.hpp"
2#include "workflow_graph.hpp"
3
4namespace xios
5{
6
7  CTemporalTransformFilter::CTemporalTransformFilter(CGarbageCollector& gc, int slots, CGridAlgorithm* algo, int nrecords, bool detectMissingValues, double defaultValue)
8  : CTransformFilter(gc, slots, algo, detectMissingValues, defaultValue), nrecords_(nrecords), graphCycleCompleted(true)
9  {
10  }
11
12  void CTemporalTransformFilter::buildWorkflowGraph(std::vector<CDataPacketPtr> data)
13  {
14    if(this->graphEnabled )
15    {
16      if(!data[0]->graphPackage)
17      {
18        data[0]->graphPackage = new CGraphDataPackage;
19      }
20     
21      if(graphCycleCompleted)
22      { 
23        this->graphPackage->filterId = CWorkflowGraph::getNodeSize();
24        CWorkflowGraph::addNode("Temporal splitting filter", 7, false, 0, data[0]);
25        graphCycleCompleted = false;
26      }
27     
28      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
29      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
30     
31      CWorkflowGraph::addEdge(data[0]->graphPackage->fromFilter, this->graphPackage->filterId, data[0]);
32      data[0]->graphPackage->fromFilter = this->graphPackage->filterId;
33      data[0]->graphPackage->currentField = this->graphPackage->inFields[0];
34      std::rotate(this->graphPackage->inFields.begin(), this->graphPackage->inFields.begin() + 1, this->graphPackage->inFields.end());
35    }
36
37  }
38 
39  CDataPacketPtr CTemporalTransformFilter::apply(std::vector<CDataPacketPtr> data)
40  {
41    if (data[0]->status == CDataPacket::NO_ERROR)
42    {
43      buildWorkflowGraph(data);
44      if (record_==0) tmpData_.resize(nrecords_) ;
45      algorithm_->apply(data[0]->data, tmpData_[record_]);
46      record_++ ;
47      if (record_==nrecords_)
48      {
49        size_t size=0 ;
50        for(auto& it : tmpData_) size += it.numElements() ;
51        // for now, no auxilliairy field
52        CDataPacketPtr packet(new CDataPacket);
53        packet->date = data[0]->date;
54        packet->timestamp = data[0]->timestamp;
55        packet->status = data[0]->status;
56        packet->data.resize(size) ;
57        packet->graphPackage = data[0]->graphPackage;
58        double* out = packet->data.dataFirst() ;
59        for(auto& it : tmpData_) 
60        {
61          size = it.numElements() ; 
62          double* tmp = it.dataFirst() ;
63          for(size_t i=0 ; i<size ; i++, out++, tmp++) *out=*tmp ;   
64        }
65        tmpData_.clear() ;
66        record_=0 ;
67        graphCycleCompleted = true;
68        return packet ;
69      }
70      else return nullptr ;
71    }
72    else // error
73    {
74      CDataPacketPtr packet(new CDataPacket);
75      packet->date = data[0]->date;
76      packet->timestamp = data[0]->timestamp;
77      packet->status = data[0]->status;
78      return packet ;
79    }   
80  }
81}
Note: See TracBrowser for help on using the repository browser.