File: FieldMaster.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 (154 lines) | stat: -rw-r--r-- 4,678 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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/////////////////////////////////////////////////////////////
//                                                         //
// 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 "FieldMaster.h"
#include "field_const.h"

//--- IO includes ---
#include <iostream>
#include <sstream>

using std::cerr;
using std::cout;
using std::endl;
using std::ostringstream;

int AFieldMaster::s_field_count=0;

/*!
  construct AFieldMaster

  \param comm the TML communicator to be used
  \param fieldname the name of the field to be saved
  \param filename the name of the output file
  \param savetype the output file format.  Recognized formats: DX, POV
  \param t0 first timestep to be saved
  \param tend last timestep to be saved

  \param dt save every dt timesteps
*/
AFieldMaster::AFieldMaster(TML_Comm* comm,const string& fieldname,const string& filename,const string& savetype,int t0,int tend,int dt)
{
  cout << "constructing FieldMaster for field " << fieldname << endl;
  m_comm=comm;
  m_field_name=fieldname;
  m_file_name=filename;
  m_t0=t0;
  m_tend=tend;
  m_dt=dt;
  m_save_count=0;
  m_id=s_field_count;
  s_field_count++;
  if(savetype=="DX"){
    m_write_type=WRITE_TYPE_DX;
  } else if(savetype=="POV"){
    m_write_type=WRITE_TYPE_POV;
  } else if(savetype=="SILO"){
    m_write_type=WRITE_TYPE_SILO;
  } else if(savetype=="SUM"){
    m_write_type=WRITE_TYPE_SUM;
  } else if(savetype=="MAX"){
    m_write_type=WRITE_TYPE_MAX;
  } else if(savetype=="RAW_SERIES"){
    m_write_type=WRITE_TYPE_RAW_SERIES;
  } else if(savetype=="RAW2"){
    m_write_type= WRITE_TYPE_RAW2;
  } else if(savetype=="RAW"){
    m_write_type=WRITE_TYPE_RAW;
  } else if(savetype=="RAW_WITH_ID"){
    m_write_type=WRITE_TYPE_RAW_WITH_ID;
  }else if(savetype=="RAW_WITH_POS_ID"){
    m_write_type=WRITE_TYPE_RAW_WITH_POS_ID;
  } else {
    cerr
      << "AFieldMaster: unknown output file format '"
      << savetype
      << "', defaulting to DX" << endl;
  }
}

bool AFieldMaster::needSave(int t)
{
  return (((t-m_t0) % m_dt)==0) && (t>=m_t0) && (t<=m_tend);
}

/*!
  make filename for current save

  \return the filename
*/
string AFieldMaster::makeFilename()
{
  ostringstream fn;
  string suffix;

  switch (m_write_type){
  case WRITE_TYPE_DX : suffix=".dx"; break;
  case WRITE_TYPE_POV : suffix=".pov"; break;
  case WRITE_TYPE_SILO : suffix=".silo"; break;
  case WRITE_TYPE_RAW2 : suffix=".dat"; break;
  case WRITE_TYPE_RAW : suffix=".dat"; break;
  case WRITE_TYPE_RAW_WITH_ID : suffix=".dat"; break;
  case WRITE_TYPE_RAW_WITH_POS_ID : suffix=".dat"; break;
  default : cerr << "AFieldMaster: wrong m_write_type in makeFilename" << endl; // can't happen
  }
  fn << m_file_name << "." << m_save_count << suffix; 
  m_save_count++;

  return fn.str();
}

#if HAVE_SILO
DBfile* AFieldMaster::openSiloFile(bool& exists)
{
  //generate filename
  string fn = makeFilename();

  DBfile* dbfile = NULL;

  // check if file exists and append data if so
  if (DBInqFile(fn.c_str()) > 0) {
    exists = true;
    // open existing SILO file, try HDF5 format first
    dbfile = DBOpen(fn.c_str(), DB_HDF5, DB_APPEND);
    if (!dbfile)
      dbfile = DBOpen(fn.c_str(), DB_PDB, DB_APPEND);
  } else {
    exists = false;
    // create new SILO file, prefer HDF5 format if available
    dbfile = DBCreate(fn.c_str(), DB_CLOBBER, DB_LOCAL, NULL, DB_HDF5);
    if (!dbfile)
      dbfile = DBCreate(fn.c_str(), DB_CLOBBER, DB_LOCAL, NULL, DB_PDB);
  }
  return dbfile;
}
#endif

/*!
  call the actual write function, depending on m_write_type
*/
void AFieldMaster::write()
{
  switch (m_write_type){
  case WRITE_TYPE_DX : writeAsDX(); break;
  case WRITE_TYPE_POV : writeAsPOV(); break;
  case WRITE_TYPE_SILO : writeAsSILO(); break;
  case WRITE_TYPE_SUM : writeAsSUM(); break;
  case WRITE_TYPE_MAX : writeAsMAX(); break;
  case WRITE_TYPE_RAW_SERIES : writeAsRAW_SERIES(); break;
  case WRITE_TYPE_RAW : writeAsRAW(); break;
  case WRITE_TYPE_RAW2 : writeAsRAW2(); break;
  case WRITE_TYPE_RAW_WITH_ID : writeAsRawWithID(); break;
  case WRITE_TYPE_RAW_WITH_POS_ID : writeAsRawWithPosID(); break;
  default : cerr << "AFieldMaster: wrong m_write_type in write" << endl; 
  }
}