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();
}
|