$treeview $search $mathjax
Palabos  Version 1.1
$projectbrief
$projectbrief
$searchbox

vtkDataOutput.hh

Go to the documentation of this file.
00001 /* This file is part of the Palabos library.
00002  *
00003  * Copyright (C) 2011 FlowKit Sarl
00004  * Avenue de Chailly 23
00005  * 1012 Lausanne, Switzerland
00006  * E-mail contact: contact@flowkit.com
00007  *
00008  * The most recent release of Palabos can be downloaded at 
00009  * <http://www.palabos.org/>
00010  *
00011  * The library Palabos is free software: you can redistribute it and/or
00012  * modify it under the terms of the GNU Affero General Public License as
00013  * published by the Free Software Foundation, either version 3 of the
00014  * License, or (at your option) any later version.
00015  *
00016  * The library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Affero General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Affero General Public License
00022  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00023 */
00024 
00025 #ifndef VTK_DATA_OUTPUT_HH
00026 #define VTK_DATA_OUTPUT_HH
00027 
00028 #include "core/globalDefs.h"
00029 #include "parallelism/mpiManager.h"
00030 #include "dataProcessors/dataAnalysisWrapper2D.h"
00031 #include "dataProcessors/dataAnalysisWrapper3D.h"
00032 #include "io/vtkDataOutput.h"
00033 #include "io/serializerIO.h"
00034 
00035 #include <iostream>
00036 #include <iomanip>
00037 #include <fstream>
00038 #include <sstream>
00039 
00040 namespace plb {
00041 
00042 
00044 
00045 template<typename T>
00046 class VtkTypeNames {
00047 public:
00048     static std::string getName();
00049 private:
00050     static std::string getBaseName();
00051 };
00052 
00053 template<typename T>
00054 std::string VtkTypeNames<T>::getName() {
00055     std::stringstream sstream;
00056     sstream << getBaseName();
00057     sstream << 8 * sizeof(T);
00058 
00059     std::string tName;
00060     sstream >> tName;
00061     return tName;
00062 }
00063 
00064 
00066 
00067 template<typename T>
00068 void VtkDataWriter3D::writeDataField(DataSerializer const* serializer,
00069                                      std::string const& name, plint nDim)
00070 {
00071     if (global::mpi().isMainProcessor()) {
00072         (*ostr) << "<DataArray type=\"" << VtkTypeNames<T>::getName()
00073                 << "\" Name=\"" << name
00074                 << "\" format=\"binary\" encoding=\"base64";
00075         if (nDim>1) {
00076             (*ostr) << "\" NumberOfComponents=\"" << nDim;
00077         }
00078         (*ostr) << "\">\n";
00079     }
00080 
00081     // Undocumented requirement of the vtk xml file format:
00082     // in front of every binary blob, base64 or raw-binary, appended or not, 
00083     // there is an UInt32 length indicator, giving the size of the binary blob in bytes;
00084     // when using base64 encoding, that length header must be encoded separately;
00085     // there must be no newline between the encoded length indicator and the encoded data block.
00086 
00087     bool enforceUint=true; // VTK uses "unsigned" to indicate the size of data, even on a 64-bit machine.
00088     serializerToBase64Stream(serializer, ostr, enforceUint);
00089 
00090     if (global::mpi().isMainProcessor()) {
00091         (*ostr) << "\n</DataArray>\n";
00092     }
00093 }
00094 
00095 
00097 
00098 template<typename T>
00099 VtkImageOutput2D<T>::VtkImageOutput2D(std::string fName, double deltaX_)
00100     : fullName ( global::directories().getVtkOutDir() + fName+".vti" ),
00101       vtkOut( fullName ),
00102       deltaX(deltaX_),
00103       offset(T(),T()),
00104       headerWritten( false )
00105 { }
00106 
00107 template<typename T>
00108 VtkImageOutput2D<T>::VtkImageOutput2D(std::string fName, double deltaX_, Array<double,2> offset_)
00109     : fullName ( global::directories().getVtkOutDir() + fName+".vti" ),
00110       vtkOut( fullName ),
00111       deltaX(deltaX_),
00112       offset(offset_),
00113       headerWritten( false )
00114 { }
00115 
00116 template<typename T>
00117 VtkImageOutput2D<T>::~VtkImageOutput2D() {
00118     writeFooter();
00119 }
00120 
00121 template<typename T>
00122 void VtkImageOutput2D<T>::writeHeader(plint nx_, plint ny_) {
00123     if (headerWritten) {
00124         PLB_PRECONDITION(nx == nx_);
00125         PLB_PRECONDITION(ny == ny_);
00126     }
00127     else {
00128         nx = nx_;
00129         ny = ny_;
00130         vtkOut.writeHeader(Box3D(0,nx-1,0,ny-1,0,0), Array<T,3>(offset[0],offset[1],T()), deltaX);
00131         vtkOut.startPiece(Box3D(0,nx-1,0,ny-1,0,0));
00132         headerWritten = true;
00133     }
00134 }
00135 
00136 template<typename T>
00137 void VtkImageOutput2D<T>::writeFooter() {
00138     if (headerWritten) {
00139         vtkOut.endPiece();
00140         vtkOut.writeFooter();
00141         headerWritten = false;
00142     }
00143 }
00144 
00145 template<typename T>
00146 template<typename TConv>
00147 void VtkImageOutput2D<T>::writeData( plint nx, plint ny, plint nDim,
00148                                      DataSerializer const* serializer,
00149                                      std::string const& name )
00150 {
00151     writeHeader(nx, ny);
00152     vtkOut.writeDataField<TConv> (serializer, name, nDim);
00153 }
00154 
00155 template<typename T>
00156 template<typename TConv>
00157 void VtkImageOutput2D<T>::writeData( ScalarField2D<T>& scalarField,
00158                                      std::string scalarFieldName, TConv scalingFactor )
00159 {
00160     std::auto_ptr<ScalarField2D<TConv> > transformedField = copyConvert<T,TConv>(scalarField);
00161     multiplyInPlace(*transformedField, scalingFactor);
00162     writeData<TConv> (
00163             scalarField.getNx(), scalarField.getNy(), 1,
00164             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00165             scalarFieldName );
00166 }
00167 
00168 template<typename T>
00169 template<typename TConv>
00170 void VtkImageOutput2D<T>::writeData( MultiScalarField2D<T>& scalarField,
00171                                      std::string scalarFieldName, TConv scalingFactor )
00172 {
00173     std::auto_ptr<MultiScalarField2D<TConv> > transformedField = copyConvert<T,TConv>(scalarField);
00174     multiplyInPlace(*transformedField, scalingFactor);
00175     writeData<TConv> (
00176             scalarField.getNx(), scalarField.getNy(), 1,
00177             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00178             scalarFieldName );
00179 }
00180 
00181 template<typename T>
00182 template<plint n, typename TConv>
00183 void VtkImageOutput2D<T>::writeData( TensorField2D<T,n>& tensorField,
00184                                      std::string tensorFieldName, TConv scalingFactor )
00185 {
00186     std::auto_ptr<TensorField2D<TConv,n> > transformedField = copyConvert<T,TConv,n>(tensorField);
00187     multiplyInPlace(*transformedField, scalingFactor);
00188     writeData<TConv> (
00189             tensorField.getNx(), tensorField.getNy(), n,
00190             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00191             tensorFieldName );
00192 }
00193 
00194 template<typename T>
00195 template<plint n, typename TConv>
00196 void VtkImageOutput2D<T>::writeData( MultiTensorField2D<T,n>& tensorField,
00197                                      std::string tensorFieldName, TConv scalingFactor )
00198 {
00199     std::auto_ptr<MultiTensorField2D<TConv,n> > transformedField = copyConvert<T,TConv,n>(tensorField);
00200     multiplyInPlace(*transformedField, scalingFactor);
00201     writeData<TConv> (
00202             tensorField.getNx(), tensorField.getNy(), n,
00203             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00204             tensorFieldName );
00205 }
00206 
00207 template<typename T>
00208 template<typename TConv>
00209 void VtkImageOutput2D<T>::writeData( NTensorField2D<T>& nTensorField,
00210                                      std::string nTensorFieldName, TConv scalingFactor )
00211 {
00212     std::auto_ptr<NTensorField2D<TConv> > transformedField = copyConvert<T,TConv>(nTensorField);
00213     multiplyInPlace(*transformedField, scalingFactor);
00214     writeData<TConv> (
00215             nTensorField.getNx(), nTensorField.getNy(), nTensorField.getNdim(),
00216             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00217             nTensorFieldName );
00218 }
00219 
00220 template<typename T>
00221 template<typename TConv>
00222 void VtkImageOutput2D<T>::writeData( MultiNTensorField2D<T>& nTensorField,
00223                                      std::string nTensorFieldName, TConv scalingFactor )
00224 {
00225     std::auto_ptr<MultiNTensorField2D<TConv> > transformedField = copyConvert<T,TConv>(nTensorField);
00226     multiplyInPlace(*transformedField, scalingFactor);
00227     writeData<TConv> (
00228             nTensorField.getNx(), nTensorField.getNy(), nTensorField.getNdim(),
00229             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00230             nTensorFieldName );
00231 }
00232 
00234 
00235 template<typename T>
00236 VtkImageOutput3D<T>::VtkImageOutput3D(std::string fName, double deltaX_)
00237     : fullName ( global::directories().getVtkOutDir() + fName+".vti" ),
00238       vtkOut( fullName ),
00239       deltaX(deltaX_),
00240       offset(T(),T(),T()),
00241       headerWritten( false )
00242 { }
00243 
00244 template<typename T>
00245 VtkImageOutput3D<T>::VtkImageOutput3D(std::string fName, double deltaX_, Array<double,3> offset_)
00246     : fullName ( global::directories().getVtkOutDir() + fName+".vti" ),
00247       vtkOut( fullName ),
00248       deltaX(deltaX_),
00249       offset(offset_),
00250       headerWritten( false )
00251 { }
00252 
00253 template<typename T>
00254 VtkImageOutput3D<T>::~VtkImageOutput3D() {
00255     writeFooter();
00256 }
00257 
00258 template<typename T>
00259 void VtkImageOutput3D<T>::writeHeader(plint nx_, plint ny_, plint nz_) {
00260     writeHeader(Box3D(0, nx_-1, 0, ny_-1, 0, nz_-1));
00261 }
00262 
00263 template<typename T>
00264 void VtkImageOutput3D<T>::writeHeader(Box3D boundingBox_) {
00265     if (headerWritten) {
00266         PLB_PRECONDITION(boundingBox == boundingBox_);
00267     }
00268     else {
00269         boundingBox = boundingBox_;
00270         vtkOut.writeHeader(boundingBox, offset, deltaX);
00271         vtkOut.startPiece(boundingBox);
00272         headerWritten = true;
00273     }
00274 }
00275 
00276 template<typename T>
00277 void VtkImageOutput3D<T>::writeFooter() {
00278     if (headerWritten) {
00279         vtkOut.endPiece();
00280         vtkOut.writeFooter();
00281         headerWritten = false;
00282     }
00283 }
00284 
00285 
00286 template<typename T>
00287 template<typename TConv>
00288 void VtkImageOutput3D<T>::writeData( plint nx, plint ny, plint nz, plint nDim,
00289                                      DataSerializer const* serializer,
00290                                      std::string const& name )
00291 {
00292     writeHeader(nx, ny, nz);
00293     vtkOut.writeDataField<TConv> (serializer, name, nDim);
00294 }
00295 
00296 template<typename T>
00297 template<typename TConv>
00298 void VtkImageOutput3D<T>::writeData( Box3D boundingBox, plint nDim,
00299                                      DataSerializer const* serializer,
00300                                      std::string const& name )
00301 {
00302     writeHeader(boundingBox);
00303     vtkOut.writeDataField<TConv> (serializer, name, nDim);
00304 }
00305 
00306 template<typename T>
00307 template<typename TConv>
00308 void VtkImageOutput3D<T>::writeData( ScalarField3D<T>& scalarField,
00309                                      std::string scalarFieldName, TConv scalingFactor )
00310 {
00311     std::auto_ptr<ScalarField3D<TConv> > transformedField = copyConvert<T,TConv>(scalarField);
00312     multiplyInPlace(*transformedField, scalingFactor);
00313     writeData<TConv> (
00314             scalarField.getNx(), scalarField.getNy(), scalarField.getNz(), 1,
00315             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00316             scalarFieldName );
00317 }
00318 
00319 template<typename T>
00320 template<typename TConv>
00321 void VtkImageOutput3D<T>::writeData( MultiScalarField3D<T>& scalarField,
00322                                      std::string scalarFieldName, TConv scalingFactor )
00323 {
00324     std::auto_ptr<MultiScalarField3D<TConv> > transformedField = copyConvert<T,TConv>(scalarField);
00325     multiplyInPlace(*transformedField, scalingFactor);
00326     writeData<TConv> (
00327             scalarField.getBoundingBox(), 1,
00328             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00329             scalarFieldName );
00330 }
00331 
00332 template<typename T>
00333 template<plint n, typename TConv>
00334 void VtkImageOutput3D<T>::writeData( TensorField3D<T,n>& tensorField,
00335                                      std::string tensorFieldName, TConv scalingFactor )
00336 {
00337     std::auto_ptr<TensorField3D<TConv,n> > transformedField = copyConvert<T,TConv,n>(tensorField);
00338     multiplyInPlace(*transformedField, scalingFactor);
00339     writeData<TConv> (
00340             tensorField.getNx(), tensorField.getNy(), tensorField.getNz(), n,
00341             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00342             tensorFieldName );
00343 }
00344 
00345 template<typename T>
00346 template<plint n, typename TConv>
00347 void VtkImageOutput3D<T>::writeData( MultiTensorField3D<T,n>& tensorField,
00348                                      std::string tensorFieldName, TConv scalingFactor )
00349 {
00350     std::auto_ptr<MultiTensorField3D<TConv,n> > transformedField = copyConvert<T,TConv,n>(tensorField);
00351     multiplyInPlace(*transformedField, scalingFactor);
00352     writeData<TConv> (
00353             tensorField.getBoundingBox(), n,
00354             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00355             tensorFieldName );
00356 }
00357 
00358 template<typename T>
00359 template<typename TConv>
00360 void VtkImageOutput3D<T>::writeData( NTensorField3D<T>& nTensorField,
00361                                      std::string nTensorFieldName, TConv scalingFactor )
00362 {
00363     std::auto_ptr<NTensorField3D<TConv> > transformedField = copyConvert<T,TConv>(nTensorField);
00364     multiplyInPlace(*transformedField, scalingFactor);
00365     writeData<TConv> (
00366             nTensorField.getNx(), nTensorField.getNy(), nTensorField.getNz(), nTensorField.getNdim(),
00367             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00368             nTensorFieldName );
00369 }
00370 
00371 template<typename T>
00372 template<typename TConv>
00373 void VtkImageOutput3D<T>::writeData( MultiNTensorField3D<T>& nTensorField,
00374                                      std::string nTensorFieldName, TConv scalingFactor )
00375 {
00376     std::auto_ptr<MultiNTensorField3D<TConv> > transformedField = copyConvert<T,TConv>(nTensorField);
00377     multiplyInPlace(*transformedField, scalingFactor);
00378     writeData<TConv> (
00379             nTensorField.getBoundingBox(), nTensorField.getNdim(),
00380             transformedField->getBlockSerializer(transformedField->getBoundingBox(), IndexOrdering::backward),
00381             nTensorFieldName );
00382 }
00383 
00384 }  // namespace plb
00385 
00386 #endif  // VTK_DATA_OUTPUT_HH
00387 
00388