$treeview $search $mathjax
|
Palabos
Version 1.1
$projectbrief
|
$projectbrief
|
$searchbox |
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
1.6.3
1.6.3