VtkWriter.cc 6.75 KB
Newer Older
1
#include <stdio.h>
2
3
#include <string>
#include <fstream>
Thomas Witkowski's avatar
Thomas Witkowski committed
4
#include <sstream>
Peter Gottschling's avatar
Peter Gottschling committed
5
#include <cmath>
6
7
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/convenience.hpp>
Thomas Witkowski's avatar
Thomas Witkowski committed
8
#include <boost/lexical_cast.hpp>
9

Thomas Witkowski's avatar
Thomas Witkowski committed
10
11
12
#ifdef HAVE_PARALLEL_DOMAIN_AMDIS
#include <mpi.h>
#endif
Thomas Witkowski's avatar
Thomas Witkowski committed
13

14
15
16
17
18
19
20
21
#include "VtkWriter.h"
#include "DataCollector.h"
#include "DOFVector.h"
#include "SurfaceRegion_ED.h"
#include "ElementRegion_ED.h"

namespace AMDiS { 

Thomas Witkowski's avatar
Thomas Witkowski committed
22
  int VtkWriter::writeFile(std::string name)
23
  {
24
    FUNCNAME("VtkWriter::writeFile()");
25
    
26
27
28
29
    boost::iostreams::filtering_ostream file;
    switch (compress) {
    case GZIP:
      file.push(boost::iostreams::gzip_compressor());
30
      name.append(".gz");
31
32
33
      break;
    case BZIP2:
      file.push(boost::iostreams::bzip2_compressor());
34
      name.append(".bz2");
35
36
37
      break;
    default:
      break;
38
39
40
41
42
43
44
    }
    {
      //boost::iostreams seems not to truncate the file
      std::ofstream swapfile(name.c_str(), std::ios::out | std::ios::trunc);
      swapfile.close();
    }
    file.push(boost::iostreams::file_descriptor_sink(name, std::ios::trunc)); 
45
    writeFileToStream(file);
46

47
#if 0
48

Thomas Witkowski's avatar
Thomas Witkowski committed
49
    std::ofstream file;
Thomas Witkowski's avatar
Thomas Witkowski committed
50
51
    file.open(name.c_str());
    TEST_EXIT(file.is_open())("Cannot open file %s for writing\n", name.c_str());
52
    writeFileToStream(file);    
53
    file.close();
54

Thomas Witkowski's avatar
Thomas Witkowski committed
55
#endif
56
      
57
    return 0;
58
59
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
60
61
62
63

  void VtkWriter::writeParallelFile(std::string name, int nRanks,
				    std::string fnPrefix, std::string fnPostfix)
  {
64
65
66
67
68
69
70
    boost::iostreams::filtering_ostream file;
    {
      //boost::iostreams seems not to truncate the file
      std::ofstream swapfile(name.c_str(), std::ios::out | std::ios::trunc);
      swapfile.close();
    }
    file.push(boost::iostreams::file_descriptor_sink(name, std::ios::trunc)); 
Thomas Witkowski's avatar
Thomas Witkowski committed
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

    file << "<?xml version=\"1.0\"?>\n";
    file << "<VTKFile type=\"PUnstructuredGrid\">\n";
    file << "  <PUnstructuredGrid GhostLevel=\"0\">\n";
    file << "    <PPoints>\n"
	 << "      <PDataArray type=\"Float32\" NumberOfComponents=\"3\" format=\"ascii\"/>\n"
	 << "    </PPoints>\n";
    file << "    <PCells>\n"
	 << "      <PDataArray type=\"Int32\" Name=\"offsets\"/>\n"
	 << "      <PDataArray type=\"UInt8\" Name=\"types\"/>\n"
	 << "      <PDataArray type=\"Int32\" Name=\"connectivity\"/>\n"
	 << "    </PCells>\n";
    file << "    <PPointData>\n";

    for (int i = 0; i < static_cast<int>(dataCollector->size()); i++)
      file << "      <PDataArray type=\"Float32\" Name=\"value" 
	   << i << "\" format=\"ascii\"/>\n";

    file << "    </PPointData>\n";

    for (int i = 0; i < nRanks; i++) {
      std::stringstream oss;
      oss << fnPrefix << "-p" << i << "-" << fnPostfix;
      boost::filesystem::path filepath(oss.str());
      file << "    <Piece Source=\"" 
	   << boost::filesystem::basename(filepath)
	   << boost::filesystem::extension(filepath) << "\"/>\n";
      
    }

    file << "  </PUnstructuredGrid>\n";
    file << "</VTKFile>\n";
  }


Thomas Witkowski's avatar
Thomas Witkowski committed
106
107
  int VtkWriter::updateAnimationFile(std::string valueFilename,
				     std::vector< std::string > *paraViewAnimationFrames,
108
				     std::string animationFilename)
109
110
111
112
  {
    size_t found = valueFilename.find_last_of("/\\");
    paraViewAnimationFrames->push_back(valueFilename.substr(found + 1));

113
114
115
116
117
118
119
    boost::iostreams::filtering_ostream file;
    {
      //boost::iostreams seems not to truncate the file
      std::ofstream swapfile(animationFilename.c_str(), std::ios::out | std::ios::trunc);
      swapfile.close();
    }
    file.push(boost::iostreams::file_descriptor_sink(animationFilename, std::ios::trunc)); 
120

Thomas Witkowski's avatar
Thomas Witkowski committed
121
122
123
    file << "<?xml version=\"1.0\"?>\n";
    file << "<VTKFile type=\"Collection\" version=\"0.1\" >"  << "\n";
    file << "<Collection>\n";
124
125

    int counter = 0;
Thomas Witkowski's avatar
Thomas Witkowski committed
126
    std::vector< std::string >::iterator it;
127
128
129
130
    for (it = paraViewAnimationFrames->begin(); 
	 it < paraViewAnimationFrames->end(); 
	 ++it, counter++) {
      file << "<DataSet timestep=\"" << counter
Thomas Witkowski's avatar
Thomas Witkowski committed
131
	   << "\" part=\"0\" file=\"" << (*it) << "\"/>\n";      
132
133
    }

Thomas Witkowski's avatar
Thomas Witkowski committed
134
135
    file << "</Collection>\n";
    file << "</VTKFile>\n";
136
137
138

    return 0;
  }
139

140

141
  void VtkWriter::writeFile(DOFVector<double> *values, 
142
143
			    std::string filename,
			    bool writeParallel)
144
  {
145
146
147
148
149
150
151
152
    FUNCNAME("VtkWriter::writeFile()");

    DataCollector dc(values->getFeSpace(), values);
    std::vector<DataCollector*> dcList(0);
    dcList.push_back(&dc);
    writeFile(dcList,filename,writeParallel);
  }

153
154

  void VtkWriter::writeFile(std::vector<DOFVector<double>* > &values,
155
156
			    std::string filename,
			    bool writeParallel)
157
  {
158
159
160
161
162
163
164
165
    std::vector<DataCollector*> dcList(0);
    for (unsigned int i = 0; i < values.size(); i++)
      dcList.push_back(new DataCollector(values[i]->getFeSpace(), values[i]));	
    writeFile(dcList, filename, writeParallel);
    for (unsigned int i = 0; i < values.size(); i++)
      delete dcList[i];	
  }

166

167
  void VtkWriter::writeFile(WorldVector<DOFVector<double>* > &values,
168
169
			    std::string filename,
			    bool writeParallel)
170
  {
171
172
173
174
175
176
177
178
    std::vector<DataCollector*> dcList(0);
    for (int i = 0; i < values.getSize(); i++)
      dcList.push_back(new DataCollector(values[i]->getFeSpace(), values[i]));	
    writeFile(dcList, filename, writeParallel);
    for (int i = 0; i < values.getSize(); i++)
      delete dcList[i];	
  }

179
180

  void VtkWriter::writeFile(DOFVector<WorldVector<double> > *values,
181
182
			    std::string filename,
			    bool writeParallel)
183
  {
184
185
186
187
188
189
190
191
    WorldVector<DOFVector<double>*> valuesWV;
    for (int i =0 ; i < valuesWV.getSize(); i++)
      valuesWV[i] = new DOFVector<double>(values->getFeSpace(), "valuesWV_i");
    transform(values, &valuesWV);
    writeFile(valuesWV, filename, writeParallel);
    for (int i = 0; i < valuesWV.getSize(); i++)
      delete valuesWV[i];
  }
192

193
  
194
  void VtkWriter::writeFile(SystemVector *values, 
195
196
			    std::string filename,
			    bool writeParallel)
197
  {
198
199
200
201
202
203
204
205
206
207
    std::vector<DataCollector*> dcList(0);
    for (int i = 0; i < values->getSize(); i++)
      dcList.push_back(new DataCollector(values->getDOFVector(i)->getFeSpace(), 
					 values->getDOFVector(i)));    
    writeFile(dcList, filename, writeParallel);
    for (unsigned i = 0; i < dcList.size(); i++)
      delete dcList[i];    
  }
  
  
208
  void VtkWriter::writeFile(std::vector<DataCollector*> &dcList,
209
210
			    std::string filename,
			    bool writeParallel)
211
  {
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
    VtkWriter writer(&dcList);
    
#ifdef HAVE_PARALLEL_DOMAIN_AMDIS
    if (writeParallel) {
      using boost::lexical_cast;
      
      int sPos = filename.find(".vtu");
      TEST_EXIT(sPos >= 0)("Failed to find file postfix!\n");
      std::string name = filename.substr(0, sPos);
      
      if (MPI::COMM_WORLD.Get_rank() == 0)
	writer.writeParallelFile(name + ".pvtu", MPI::COMM_WORLD.Get_size(), name, ".vtu");    
      
      filename = name + "-p" + lexical_cast<std::string>(MPI::COMM_WORLD.Get_rank()) + "-.vtu";
    }
#endif
    writer.writeFile(filename);
  }
230
}