From ad3c8f6decf14ee0a2f6a0caa11134bd3e3e12f4 Mon Sep 17 00:00:00 2001 From: Henry Weller <http://cfd.direct> Date: Tue, 10 May 2016 10:06:19 +0100 Subject: [PATCH] writeVTK: New functionObject to write fields is VTK format Description This functionObject writes objects registered to the database in VTK format using the foamToVTK library. Currently only the writing of the cell-values of volFields is supported but support for other field types, patch fields, Lagrangian data etc. will be added. Example of function object specification: \verbatim writeVTK1 { type writeVTK; functionObjectLibs ("libIOFunctionObjects.so"); ... objectNames (obj1 obj2); } \endverbatim \heading Function object usage \table Property | Description | Required | Default value type | type name: writeVTK | yes | objectNames | objects to write | yes | \endtable --- .../dataConversion/foamToVTK/foamToVTK.C | 12 +- .../foamToVTK/foamToVTK/Make/files | 3 + .../foamToVTK/foamToVTK/writeVTK/IOwriteVTK.H | 49 +++++ .../foamToVTK/foamToVTK/writeVTK/controlDict | 81 +++++++ .../foamToVTK/foamToVTK/writeVTK/writeVTK.C | 175 ++++++++++++++++ .../foamToVTK/foamToVTK/writeVTK/writeVTK.H | 197 ++++++++++++++++++ .../writeVTK/writeVTKFunctionObject.C | 46 ++++ .../writeVTK/writeVTKFunctionObject.H | 54 +++++ .../foamToVTK/writeVTK/writeVTKTemplates.C | 61 ++++++ 9 files changed, 672 insertions(+), 6 deletions(-) create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/IOwriteVTK.H create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/controlDict create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.C create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.H create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.C create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.H create mode 100644 applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKTemplates.C diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C index 3698b2e954..f490f220df 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C @@ -27,13 +27,13 @@ Application Description Legacy VTK file format writer. - - handles volScalar, volVector, pointScalar, pointVector, surfaceScalar + - Handles volFields, pointFields, surfaceScalarField, surfaceVectorField fields. - - mesh topo changes. - - both ascii and binary. - - single time step writing. - - write subset only. - - automatic decomposition of cells; polygons on boundary undecomposed since + - Mesh topo changes. + - Both ascii and binary. + - Single time step writing. + - Write subset only. + - Automatic decomposition of cells; polygons on boundary undecomposed since handled by vtk. Usage diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/Make/files b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/Make/files index 9dee50c90d..c0df3f1993 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/Make/files +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/Make/files @@ -9,4 +9,7 @@ writeSurfFields.C vtkMesh.C vtkTopo.C +writeVTK/writeVTK.C +writeVTK/writeVTKFunctionObject.C + LIB = $(FOAM_LIBBIN)/libfoamToVTK diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/IOwriteVTK.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/IOwriteVTK.H new file mode 100644 index 0000000000..71851a258a --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/IOwriteVTK.H @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedef + Foam::IOwriteVTK + +Description + Instance of the generic IOOutputFilter for writeVTK. + +\*---------------------------------------------------------------------------*/ + +#ifndef IOwriteVTK_H +#define IOwriteVTK_H + +#include "writeVTK.H" +#include "IOOutputFilter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + typedef IOOutputFilter<writeVTK> IOwriteVTK; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/controlDict b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/controlDict new file mode 100644 index 0000000000..fdb8d149c2 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/controlDict @@ -0,0 +1,81 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// So we get a decent warning if we have multiple functionObject entries +// with the same name. +#inputMode error; + +application icoFoam; + +startFrom startTime; + +startTime 0; + +stopAt endTime; + +endTime 0.5; + +deltaT 0.005; + +writeControl timeStep; + +writeInterval 20; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression uncompressed; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable yes; + +functions +{ + writeVTK + { + type writeVTK; + + // Where to load it from + functionObjectLibs ("libfoamToVTK.so"); + + // When to write: + // timeStep (with optional outputInterval) + // outputTime (with optional outputInterval) + // adjustableTime + // runTime + // clockTime + // cpuTime + outputControl outputTime; + + // Write every writeInterval (only valid for timeStemp, outputTime) + outputInterval 1; + + // Interval of time (valid for adjustableTime, runTime, clockTime, + // cpuTime) + writeInterval 1; + + // Objects to write + objectNames (); + } +} + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.C new file mode 100644 index 0000000000..8e9e3bcdf6 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.C @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "writeVTK.H" +#include "dictionary.H" +#include "Time.H" +#include "vtkMesh.H" +#include "internalWriter.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace functionObjects +{ + defineTypeNameAndDebug(writeVTK, 0); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::functionObjects::writeVTK::writeVTK +( + const word& name, + const objectRegistry& obr, + const dictionary& dict, + const bool loadFromFiles +) +: + name_(name), + obr_(obr), + objectNames_() +{ + read(dict); +} + + +bool Foam::functionObjects::writeVTK::viable +( + const word& name, + const objectRegistry& obr, + const dictionary& dict, + const bool loadFromFiles +) +{ + // Construction is viable if the available mesh is an fvMesh + return isA<fvMesh>(obr); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::functionObjects::writeVTK::~writeVTK() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::functionObjects::writeVTK::read(const dictionary& dict) +{ + dict.lookup("objectNames") >> objectNames_; +} + + +void Foam::functionObjects::writeVTK::execute() +{} + + +void Foam::functionObjects::writeVTK::end() +{} + + +void Foam::functionObjects::writeVTK::timeSet() +{} + + +void Foam::functionObjects::writeVTK::write() +{ + Info<< type() << " " << name_ << " output:" << nl; + + fvMesh& mesh = const_cast<fvMesh&>(refCast<const fvMesh>(obr_)); + + const Time& runTime = mesh.time(); + + Info<< "Time: " << runTime.timeName() << endl; + + word timeDesc = runTime.timeName(); + + // VTK/ directory in the case + fileName fvPath(runTime.path()/"VTK"); + + mkDir(fvPath); + + string vtkName = runTime.caseName(); + + if (Pstream::parRun()) + { + // Strip off leading casename, leaving just processor_DDD ending. + string::size_type i = vtkName.rfind("processor"); + + if (i != string::npos) + { + vtkName = vtkName.substr(i); + } + } + + // Create file and write header + fileName vtkFileName + ( + fvPath/vtkName + + "_" + + timeDesc + + ".vtk" + ); + + Info<< " Internal : " << vtkFileName << endl; + + vtkMesh vMesh(mesh); + + // Write mesh + internalWriter writer(vMesh, false, vtkFileName); + + UPtrList<const volScalarField> vsf(lookupFields<volScalarField>()); + UPtrList<const volVectorField> vvf(lookupFields<volVectorField>()); + UPtrList<const volSphericalTensorField> vsptf + ( + lookupFields<volSphericalTensorField>() + ); + UPtrList<const volSymmTensorField> vstf(lookupFields<volSymmTensorField>()); + UPtrList<const volTensorField> vtf(lookupFields<volTensorField>()); + + // Write header for cellID and volFields + writeFuns::writeCellDataHeader + ( + writer.os(), + vMesh.nFieldCells(), + 1 + vsf.size() + vvf.size() + vsptf.size() + vstf.size() + vtf.size() + ); + + // Write cellID field + writer.writeCellIDs(); + + // Write volFields + writer.write(vsf); + writer.write(vvf); + writer.write(vsptf); + writer.write(vstf); + writer.write(vtf); +} + + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.H new file mode 100644 index 0000000000..dad936a9e4 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTK.H @@ -0,0 +1,197 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Class + Foam::functionObjects::writeVTK + +Group + grpUtilitiesFunctionObjects + +Description + This functionObject writes objects registered to the database in VTK format + using the foamToVTK library. + + Currently only the writing of the cell-values of volFields is supported but + support for other field types, patch fields, Lagrangian data etc. will be + added. + + Example of function object specification: + \verbatim + writeVTK1 + { + type writeVTK; + functionObjectLibs ("libIOFunctionObjects.so"); + ... + objectNames (obj1 obj2); + } + \endverbatim + + \heading Function object usage + \table + Property | Description | Required | Default value + type | type name: writeVTK | yes | + objectNames | objects to write | yes | + \endtable + +SeeAlso + Foam::functionObject + Foam::OutputFilterFunctionObject + +SourceFiles + writeVTK.C + IOwriteVTK.H + +\*---------------------------------------------------------------------------*/ + +#ifndef functionObjects_writeVTK_H +#define functionObjects_writeVTK_H + +#include "wordReList.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// Forward declaration of classes +class objectRegistry; +class dictionary; +class polyMesh; +class mapPolyMesh; + +namespace functionObjects +{ + +/*---------------------------------------------------------------------------*\ + Class writeVTK Declaration +\*---------------------------------------------------------------------------*/ + +class writeVTK +{ + // Private data + + //- Name of this set of writeVTK + word name_; + + //- Refererence to Db + const objectRegistry& obr_; + + //- Names of objects + wordReList objectNames_; + + + // Private Member Functions + + template<class GeoField> + UPtrList<const GeoField> lookupFields() const; + + //- Disallow default bitwise copy construct + writeVTK(const writeVTK&); + + //- Disallow default bitwise assignment + void operator=(const writeVTK&); + + +public: + + //- Runtime type information + TypeName("writeVTK"); + + + // Constructors + + //- Construct for given objectRegistry and dictionary. + // Allow the possibility to load fields from files + writeVTK + ( + const word& name, + const objectRegistry&, + const dictionary&, + const bool loadFromFiles = false + ); + + //- Return true if the construction of this functionObject is viable + // i.e. the prerequisites for construction are available + static bool viable + ( + const word& name, + const objectRegistry&, + const dictionary&, + const bool loadFromFiles = false + ); + + + //- Destructor + virtual ~writeVTK(); + + + // Member Functions + + //- Return name of the writeVTK + virtual const word& name() const + { + return name_; + } + + //- Read the writeVTK data + virtual void read(const dictionary&); + + //- Execute, currently does nothing + virtual void execute(); + + //- Execute at the final time-loop, currently does nothing + virtual void end(); + + //- Called when time was set at the end of the Time::operator++ + virtual void timeSet(); + + //- Write the writeVTK + virtual void write(); + + //- Update for changes of mesh + virtual void updateMesh(const mapPolyMesh&) + {} + + //- Update for changes of mesh + virtual void movePoints(const polyMesh&) + {} +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace functionObjects +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "writeVTKTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.C new file mode 100644 index 0000000000..804d7156b7 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.C @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "writeVTKFunctionObject.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineNamedTemplateTypeNameAndDebug + ( + writeVTKFunctionObject, + 0 + ); + + addToRunTimeSelectionTable + ( + functionObject, + writeVTKFunctionObject, + dictionary + ); +} + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.H new file mode 100644 index 0000000000..7033928ccb --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKFunctionObject.H @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +Typedef + Foam::writeVTKFunctionObject + +Description + FunctionObject wrapper around writeVTK to allow them to be + created via the functions entry within controlDict. + +SourceFiles + writeVTKFunctionObject.C + +\*---------------------------------------------------------------------------*/ + +#ifndef writeVTKFunctionObject_H +#define writeVTKFunctionObject_H + +#include "writeVTK.H" +#include "OutputFilterFunctionObject.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + typedef OutputFilterFunctionObject<functionObjects::writeVTK> + writeVTKFunctionObject; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKTemplates.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKTemplates.C new file mode 100644 index 0000000000..e46f0333d4 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK/writeVTK/writeVTKTemplates.C @@ -0,0 +1,61 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "writeVTK.H" +#include "objectRegistry.H" +#include "DynamicList.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template<class GeoField> +Foam::UPtrList<const GeoField> +Foam::functionObjects::writeVTK::lookupFields() const +{ + DynamicList<word> allNames(obr_.toc().size()); + forAll(objectNames_, i) + { + wordList names(obr_.names<GeoField>(objectNames_[i])); + + if (names.size()) + { + allNames.append(names); + } + } + + UPtrList<const GeoField> fields(allNames.size()); + + forAll(allNames, i) + { + const GeoField& field = obr_.lookupObject<GeoField>(allNames[i]); + Info<< " Writing " << GeoField::typeName + << " field " << field.name() << endl; + fields.set(i, &field); + } + + return fields; +} + + +// ************************************************************************* // -- GitLab