diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C index aff6d2d585..b3813f22c3 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C @@ -28,7 +28,7 @@ Group grpPostProcessingUtilities Description - Legacy VTK file format writer. + VTK file format writer. - Handles volFields, pointFields, surfaceScalarField, surfaceVectorField fields. @@ -46,6 +46,9 @@ Usage - \par -ascii Write VTK data in ASCII format instead of binary. + - \par -xml + Write VTK data in XML format instead of legacy format + - \par -mesh \ Use a different mesh name (instead of -region) @@ -243,6 +246,11 @@ foamVtkOutput::outputOptions getOutputOptions(const argList& args) { foamVtkOutput::outputOptions opts; + if (args.optionFound("xml")) + { + opts.ascii(args.optionFound("ascii")); + } + else { opts.legacy(true); @@ -335,6 +343,11 @@ int main(int argc, char *argv[]) "write in ASCII format instead of binary" ); argList::addBoolOption + ( + "xml", + "write VTK xml instead of legacy format" + ); + argList::addBoolOption ( "poly", "write polyhedral cells without tet/pyramid decomposition" @@ -902,6 +915,8 @@ int main(int argc, char *argv[]) writer.endPointData(); } + + writer.writeFooter(); } //--------------------------------------------------------------------- @@ -1041,6 +1056,8 @@ int main(int argc, char *argv[]) writer.endPointData(); } + + writer.writeFooter(); } else { @@ -1118,6 +1135,8 @@ int main(int argc, char *argv[]) writer.endPointData(); } } + + writer.writeFooter(); } } @@ -1190,6 +1209,8 @@ int main(int argc, char *argv[]) writer.write(sVectorFld); writer.endCellData(); + + writer.writeFooter(); } } @@ -1288,6 +1309,8 @@ int main(int argc, char *argv[]) writer.writeIOField(tensorNames); writer.endParcelData(); + + writer.writeFooter(); } else { @@ -1304,6 +1327,8 @@ int main(int argc, char *argv[]) writer.beginParcelData(0); writer.endParcelData(); + + writer.writeFooter(); } } diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C index c01cd0b9a4..4101672b69 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamVtkLagrangianWriter.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -27,6 +27,134 @@ License #include "Cloud.H" #include "passiveParticle.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::foamVtkOutput::lagrangianWriter::beginPiece() +{ + if (!legacy_) + { + if (useVerts_) + { + format() + .openTag(vtkFileTag::PIECE) + ( "NumberOfPoints", nParcels_ ) + ( "NumberOfVerts", nParcels_ ) + .closeTag(); + } + else + { + format() + .openTag(vtkFileTag::PIECE) + ( "NumberOfPoints", nParcels_ ) + .closeTag(); + } + } +} + + +void Foam::foamVtkOutput::lagrangianWriter::writePoints() +{ + Cloud parcels(mesh_, cloudName_, false); + nParcels_ = parcels.size(); + + const uint64_t payLoad = (nParcels_ * 3 * sizeof(float)); + + if (legacy_) + { + legacy::beginPoints(os_, nParcels_); + } + else + { + beginPiece(); // Tricky - hide in here + + format().tag(vtkFileTag::POINTS) + .openDataArray(vtkFileTag::POINTS) + .closeTag(); + } + + format().writeSize(payLoad); + + forAllConstIters(parcels, iter) + { + const point& pt = iter().position(); + + foamVtkOutput::write(format(), pt); + } + format().flush(); + + if (!legacy_) + { + format() + .endDataArray() + .endTag(vtkFileTag::POINTS); + } +} + + +void Foam::foamVtkOutput::lagrangianWriter::writeVertsLegacy() +{ + os_ << "VERTICES " << nParcels_ << ' ' << 2*nParcels_ << nl; + + // legacy has cells + connectivity together + // count the number of vertices referenced + + for (label i=0; i < nParcels_; ++i) + { + format().write(1); // Number of vertices for this cell (==1) + format().write(i); + } + format().flush(); +} + + +void Foam::foamVtkOutput::lagrangianWriter::writeVerts() +{ + format().tag(vtkFileTag::VERTS); + + // Same payload throughout + const uint64_t payLoad = (nParcels_ * sizeof(label)); + + // + // 'connectivity' + // = linear mapping onto points + // + { + format().openDataArray