File: TriggeredVectorParticleFieldMaster.cpp

package info (click to toggle)
esys-particle 2.3.5%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,132 kB
  • sloc: cpp: 81,480; python: 5,872; makefile: 1,259; sh: 313; perl: 225
file content (122 lines) | stat: -rw-r--r-- 4,338 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2017 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.apache.org/licenses/LICENSE-2.0              //
//                                                         //
/////////////////////////////////////////////////////////////

#include "Fields/TriggeredVectorParticleFieldMaster.h"

TriggeredVectorParticleFieldMaster::TriggeredVectorParticleFieldMaster(TML_Comm* comm,
								       const string& fieldname,
								       const string& filename,
								       const string& savetype,
								       int t0,
								       int tend,
								       int dt,
								       const MaxTrigParams& tp) : 
  VectorParticleFieldMaster(comm,fieldname,filename,savetype,t0,tend,dt)
{
  m_save_map_buffer=new RingBuffer<map<int,Vec3> >(tp.buff_size);
  m_pos_map_buffer=new RingBuffer<map<int,Vec3> >(tp.buff_size);
  m_Trigger=new MaxTrigger(tp.trig_on_value,tp.trig_off_value);
  m_tail_size=tp.tail_size;
  m_is_triggered=false;
  m_is_writing_tail=false;
  m_base_file_name=filename;
  m_file_count=0;
  m_ts=0;
}

TriggeredVectorParticleFieldMaster::TriggeredVectorParticleFieldMaster(TML_Comm* comm,
								       const string& fieldname,
								       const string& filename,
								       const string& savetype,
								       int t0,
								       int tend,
								       int dt,
								       int tag,
								       int mask,
								       const MaxTrigParams& tp) : 
  VectorParticleFieldMaster(comm,fieldname,filename,savetype,t0,tend,dt,tag,mask)
{
  m_save_map_buffer=new RingBuffer<map<int,Vec3> >(tp.buff_size);
  m_pos_map_buffer=new RingBuffer<map<int,Vec3> >(tp.buff_size);
  m_Trigger=new MaxTrigger(tp.trig_on_value,tp.trig_off_value);
  m_tail_size=tp.tail_size;
  m_is_triggered=false;
  m_is_writing_tail=false;
  m_base_file_name=filename;
  m_file_count=0;
  m_ts=0;
}

TriggeredVectorParticleFieldMaster::~TriggeredVectorParticleFieldMaster()
{
  delete m_save_map_buffer;
  delete m_pos_map_buffer;
  delete m_Trigger;
}

void TriggeredVectorParticleFieldMaster::write()
{
  m_ts++;
  // check if already triggered
  if(m_is_triggered){ // write
     // check if in tail
    if(m_is_writing_tail){      // if in tail --> write data, decrement tail counter
      // check if still below limit
      if(m_Trigger->On(m_save_map)){ // if above limit -> back to normal writing mode
	m_is_writing_tail=false;
      } else {
	m_tail_counter--;
      }
      if(m_tail_counter==0){ // if end of tail reached --> unset tail flag
	m_is_triggered=false;
	m_is_writing_tail=false;
      }
    } else {  // if not in tail --> check off_trigger
      if(m_Trigger->Off(m_save_map)){ // if off_trigger --> set tail flag, init tail counter, write data
	std::cout << "trigger off at " << m_file_name << m_ts << std::endl;	
	m_is_writing_tail=true;
	m_tail_counter=m_tail_size;
      }
    }
   VectorParticleFieldMaster::write();
  } else {   // if not yet triggered --> check on_trigger
    if(m_Trigger->On(m_save_map)){
       // if on_trigger --> set flag, write out buffer, write data
      IncrementFilename();
      std::cout << "trigger " << m_file_name << " on at  " << m_ts << std::endl;
      m_is_triggered=true;
      m_is_writing_tail=false;
      m_save_map_buffer->insert(m_save_map);
      m_pos_map_buffer->insert(m_pos_map);
      for(int i=0;i<m_save_map_buffer->size();i++){
	m_save_map=(*m_save_map_buffer)[i];
	m_pos_map=(*m_pos_map_buffer)[i];
	VectorParticleFieldMaster::write();
      }
    } else {  // if not --> put data in buffer
      m_save_map_buffer->insert(m_save_map);
      m_pos_map_buffer->insert(m_pos_map);
    }  
  }
  // cleanup maps
  m_save_map.erase(m_save_map.begin(),m_save_map.end());
  m_pos_map.erase(m_pos_map.begin(),m_pos_map.end());
}

void TriggeredVectorParticleFieldMaster::IncrementFilename()
{
  ostringstream fn;

  m_file_count++;
  fn << m_base_file_name << "." << m_file_count;
  m_file_name=fn.str();
}