diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/Make/files b/applications/utilities/mesh/conversion/foamToStarMesh/Make/files new file mode 100644 index 0000000000..72c388a0b8 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToStarMesh/Make/files @@ -0,0 +1,3 @@ +foamToStarMesh.C + +EXE = $(FOAM_APPBIN)/foamToStarMesh diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/Make/options b/applications/utilities/mesh/conversion/foamToStarMesh/Make/options new file mode 100644 index 0000000000..1567290170 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToStarMesh/Make/options @@ -0,0 +1,6 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/conversion/lnInclude + +EXE_LIBS = \ + -lconversion diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C new file mode 100644 index 0000000000..fc970cd748 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C @@ -0,0 +1,171 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Application + foamToStarMesh + +Description + Reads an OpenFOAM mesh and writes a pro-STAR (v4) bnd/cel/vrt format. + +Usage + - foamToStarMesh [OPTION] \n + Reads an OpenFOAM mesh and writes a pro-STAR (v4) bnd/cel/vrt format. + + @param -noBnd \n + Suppress writing the @c .bnd file + + @param -scale \\n + Specify an alternative geometry scaling factor. + The default is @b 1000 (scale @em [m] to @em [mm]). + + @param -surface \n + Extract the surface of the volume mesh only. + This can be useful, for example, for surface morphing in an external + package. + + @param -tri \n + Extract a triangulated surface. + The @b -surface options is implicitly selected. + + +Note + The cellTable information available in the files + @c constant/cellTable and @c constant/polyMesh/cellTableId + will be used if available. Otherwise the cellZones are used when + creating the cellTable information. + +See Also + Foam::cellTable, Foam::meshWriter and Foam::meshWriters::STARCD + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "Time.H" +#include "polyMesh.H" +#include "STARCDMeshWriter.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::validOptions.insert("scale", "scale"); + argList::validOptions.insert("noBnd", ""); + argList::validOptions.insert("tri", ""); + argList::validOptions.insert("surface", ""); + +# include "addTimeOptions.H" +# include "setRootCase.H" +# include "createTime.H" + // Get times list + instantList Times = runTime.times(); + + // set startTime and endTime depending on -time and -latestTime options +# include "checkTimeOptions.H" + runTime.setTime(Times[startTime], startTime); + + bool surfaceOnly = false; + if (args.options().found("surface") or args.options().found("tri")) + { + surfaceOnly = true; + } + + fileName exportName = meshWriter::defaultMeshName; + if (surfaceOnly) + { + exportName = meshWriter::defaultSurfaceName; + } + + if (args.options().found("case")) + { + exportName += '-' + args.globalCaseName(); + } + + // default: rescale from [m] to [mm] + scalar scaleFactor = 1000; + if (args.options().found("scale")) + { + scaleFactor = readScalar(IStringStream(args.options()["scale"])()); + if (scaleFactor <= 0) + { + scaleFactor = 1; + } + } + +# include "createPolyMesh.H" + + // bool firstCheck = true; + + for (label timeI = startTime; timeI < endTime; ++timeI) + { + runTime.setTime(Times[timeI], timeI); + +# include "getTimeIndex.H" + + polyMesh::readUpdateState state = mesh.readUpdate(); + + if (timeI == startTime || state != polyMesh::UNCHANGED) + { + meshWriters::STARCD writer(mesh, scaleFactor); + + if (args.options().found("noBnd")) + { + writer.noBoundary(); + } + + fileName meshName(exportName); + if (state != polyMesh::UNCHANGED) + { + meshName += '_' + runTime.timeName(); + } + + if (surfaceOnly) + { + if (args.options().found("tri")) + { + writer.writeSurface(meshName, true); + } + else + { + writer.writeSurface(meshName); + } + } + else + { + writer.write(meshName); + } + } + + Info<< nl << endl; + } + + Info<< "End\n" << endl; + + return 0; +} + +// ************************************************************************* // diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/getTimeIndex.H b/applications/utilities/mesh/conversion/foamToStarMesh/getTimeIndex.H new file mode 100644 index 0000000000..85a92405dd --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToStarMesh/getTimeIndex.H @@ -0,0 +1,51 @@ +// Read time index from */uniform/time, but treat 0 and constant specially + + word timeName = "0"; + + if + ( + runTime.timeName() != "constant" + && runTime.timeName() != "0" + ) + { + IOobject io + ( + "time", + runTime.timeName(), + "uniform", + runTime, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE, + false + ); + + if (io.headerOk()) + { + IOdictionary timeObject + ( + IOobject + ( + "time", + runTime.timeName(), + "uniform", + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + + label index; + timeObject.lookup("index") >> index; + timeName = Foam::name(index); + } + else + { + timeName = runTime.timeName(); + // Info<< "skip ... missing entry " << io.objectPath() << endl; + // continue; + } + } + + Info<< "\nTime [" << timeName << "] = " << runTime.timeName() << nl; + diff --git a/applications/utilities/mesh/conversion/star4ToFoam/Make/files b/applications/utilities/mesh/conversion/star4ToFoam/Make/files new file mode 100644 index 0000000000..19355fafdd --- /dev/null +++ b/applications/utilities/mesh/conversion/star4ToFoam/Make/files @@ -0,0 +1,3 @@ +star4ToFoam.C + +EXE = $(FOAM_APPBIN)/star4ToFoam diff --git a/applications/utilities/mesh/conversion/star4ToFoam/Make/options b/applications/utilities/mesh/conversion/star4ToFoam/Make/options new file mode 100644 index 0000000000..1567290170 --- /dev/null +++ b/applications/utilities/mesh/conversion/star4ToFoam/Make/options @@ -0,0 +1,6 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/conversion/lnInclude + +EXE_LIBS = \ + -lconversion diff --git a/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C b/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C new file mode 100644 index 0000000000..a92e70913f --- /dev/null +++ b/applications/utilities/mesh/conversion/star4ToFoam/star4ToFoam.C @@ -0,0 +1,113 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Application + star4ToFoam + +Description + Converts a Star-CD (v4) pro-STAR mesh into OpenFOAM format. + +Usage + - star4ToFoam [OPTION] ccmMesh\n + convert pro-STAR mesh to OpenFOAM + + @param -ascii \n + Write in ASCII format instead of binary + + @param -scale \\n + Specify an alternative geometry scaling factor. + The default is @b 0.001 (scale @em [mm] to @em [m]). + + @param -solids \n + Treat any solid cells present just like fluid cells. + The default is to discard them. + +Note + - baffles are written as interfaces for later use + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "Time.H" +#include "STARCDMeshReader.H" +#include "OFstream.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::validArgs.append("pro-STAR prefix"); + argList::validOptions.insert("ascii", ""); + argList::validOptions.insert("scale", "scale"); + argList::validOptions.insert("solids", ""); + + argList args(argc, argv); + Time runTime(args.rootPath(), args.caseName()); + stringList const& params = args.additionalArgs(); + + // default rescale from [mm] to [m] + scalar scaleFactor = 0.001; + if (args.options().found("scale")) + { + scaleFactor = readScalar(IStringStream(args.options()["scale"])()); + if (scaleFactor <= 0) + { + scaleFactor = 1; + } + } + + if (args.options().found("solids")) + { + meshReaders::STARCD::keepSolids = true; + } + + // default to binary output, unless otherwise specified + IOstream::streamFormat format = IOstream::BINARY; + if (args.options().found("ascii")) + { + format = IOstream::ASCII; + } + + // increase the precision of the points data + IOstream::defaultPrecision(10); + + // remove extensions and/or trailing '.' + fileName prefix = fileName(params[0]).lessExt(); + + meshReaders::STARCD reader(prefix, runTime, scaleFactor); + + autoPtr mesh = reader.mesh(runTime); + reader.writeMesh(mesh, format); + + + Info<< "\nEnd\n" << endl; + + return 0; +} + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/Make/options b/applications/utilities/postProcessing/dataConversion/foamToEnsight/Make/options index 0652ffc646..823dae1ba7 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/Make/options +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/Make/options @@ -5,5 +5,5 @@ EXE_INC = \ EXE_LIBS = \ -lfiniteVolume \ - -llagrangian \ - + -llagrangian + diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C index 3fa1495a90..7dac6294e6 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/foamToEnsight.C @@ -24,6 +24,15 @@ License Description Translates FOAM data to EnSight format + +Usage + - foamToEnsight [OPTION] \n + Translates OpenFOAM data to Ensight format + + @param -ascii \n + Write Ensight data in ASCII format instead of "C Binary" + +Note Parallel support for cloud data is not supported \*---------------------------------------------------------------------------*/ @@ -74,16 +83,16 @@ bool inFileNameList int main(int argc, char *argv[]) { argList::validOptions.insert("patches", "patch list"); - argList::validOptions.insert("binary", "" ); + argList::validOptions.insert("ascii", "" ); # include "addTimeOptions.H" # include "setRootCase.H" // Check options - bool binary = false; - if (args.options().found("binary")) + bool binary = true; + if (args.options().found("ascii")) { - binary = true; + binary = false; } # include "createTime.H" diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/files b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/files new file mode 100644 index 0000000000..739c971551 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/files @@ -0,0 +1,3 @@ +foamToEnsightParts.C + +EXE = $(FOAM_APPBIN)/foamToEnsightParts diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/options b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/options new file mode 100644 index 0000000000..518c2a0099 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/Make/options @@ -0,0 +1,9 @@ +EXE_INC = \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -I$(LIB_SRC)/lagrangian/basic/lnInclude \ + -I$(LIB_SRC)/conversion/lnInclude + +EXE_LIBS = \ + -lfiniteVolume \ + -llagrangian \ + -lconversion diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasLagrangian.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasLagrangian.H new file mode 100644 index 0000000000..18f9ddf805 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasLagrangian.H @@ -0,0 +1,19 @@ +// check for lagrangian/positions information in the final directory + +bool hasLagrangian = false; +if (timeDirs.size() > 1) +{ + IOobject io + ( + "positions", + timeDirs[timeDirs.size() - 1].name(), + "lagrangian", + mesh, + IOobject::NO_READ + ); + + if (io.headerOk()) + { + hasLagrangian = true; + } +} diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasMovingMesh.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasMovingMesh.H new file mode 100644 index 0000000000..a9367daf8e --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasMovingMesh.H @@ -0,0 +1,20 @@ +// check for "points" in all of the result directories + +bool hasMovingMesh = false; +if (timeDirs.size() > 1) +{ + hasMovingMesh = true; + for (label i=0; i < timeDirs.size() && hasMovingMesh; ++i) + { + IOobject io + ( + "points", + timeDirs[i].name(), + polyMesh::meshSubDir, + mesh, + IOobject::NO_READ + ); + + hasMovingMesh = io.headerOk(); + } +} diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasSprayField.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasSprayField.H new file mode 100644 index 0000000000..e6601f7191 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasSprayField.H @@ -0,0 +1,15 @@ +// check that the spray variable is present for this time +// +bool hasSprayField = true; +{ + IOobject ioHeader + ( + fieldName, + mesh.time().timeName(), + "lagrangian", + mesh, + IOobject::NO_READ + ); + + hasSprayField = ioHeader.headerOk(); +} diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasValidField.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasValidField.H new file mode 100644 index 0000000000..9973a7a5fb --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/checkHasValidField.H @@ -0,0 +1,23 @@ +// check that the variable is present for all times +// +bool hasValidField = true; +{ + for (label i=0; i < timeDirs.size() && hasValidField; ++i) + { + if (fieldName.size() > 2 && fieldName(fieldName.size() - 2, 2) == "_0") + { + hasValidField = false; + break; + } + + IOobject ioHeader + ( + fieldName, + timeDirs[i].name(), + mesh, + IOobject::NO_READ + ); + + hasValidField = ioHeader.headerOk(); + } +} diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightCaseTimes.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightCaseTimes.H new file mode 100644 index 0000000000..ab7f4de531 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightCaseTimes.H @@ -0,0 +1,91 @@ +// write time values to case file +{ + scalar timeCorrection = 0; + if (timeDirs[0].value() < 0) + { + timeCorrection = - timeDirs[0].value(); + Info<< "Correcting time values. Adding " << timeCorrection << endl; + } + + caseFile.setf(ios_base::scientific, ios_base::floatfield); + caseFile.precision(5); + + // time set 1 - geometry and volume fields + if (fieldFileNumbers.size()) + { + caseFile + << "time set: " << 1 << nl + << "number of steps: " << fieldFileNumbers.size() << nl + << "filename numbers:" << nl; + + label count = 0; + forAll (fieldFileNumbers, i) + { + caseFile + << " " << setw(12) << fieldFileNumbers[i]; + + if (++count % 6 == 0) + { + caseFile << nl; + } + } + + caseFile + << nl << "time values:" << nl; + + count = 0; + forAll (fieldFileNumbers, i) + { + caseFile + << " " << setw(12) + << timeIndices[fieldFileNumbers[i]] + timeCorrection; + + if (++count % 6 == 0) + { + caseFile << nl; + } + } + caseFile << nl << nl; + } + + // time set 2 - lagrangian fields + if (hasLagrangian && sprayFileNumbers.size()) + { + caseFile + << "time set: " << 2 << nl + << "number of steps: " << sprayFileNumbers.size() << nl + << "filename numbers:" << nl; + + label count = 0; + forAll (sprayFileNumbers, i) + { + caseFile + << " " << setw(12) << sprayFileNumbers[i]; + + if (++count % 6 == 0) + { + caseFile << nl; + } + } + + caseFile + << nl << "time values:" << nl; + + count = 0; + forAll (sprayFileNumbers, i) + { + caseFile + << " " << setw(12) + << timeIndices[sprayFileNumbers[i]] + timeCorrection; + + if (++count % 6 == 0) + { + caseFile << nl; + } + } + caseFile << nl << nl; + } + + + caseFile << "# end" << nl; +} diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.C b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.C new file mode 100644 index 0000000000..a1b459c4a1 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.C @@ -0,0 +1,233 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + $Date: 2008/04/02 11:37:10 $ +\*---------------------------------------------------------------------------*/ + +#include "ensightOutputFunctions.H" + +#include "passiveParticle.H" +#include "Cloud.H" +#include "IOField.H" +#include "volFields.H" +#include "surfaceFields.H" + +#include "OFstream.H" +#include "IOmanip.H" + +namespace Foam +{ + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +template +void ensightCaseEntry +( + OFstream& caseFile, + const IOobject& fieldObject, + const fileName& dataMask, + bool measured +) +{ + caseFile.setf(ios_base::left); + + if (measured) + { + caseFile + << pTraits::typeName + << " per measured node: 2 " + << setw(15) + << ("s" + fieldObject.name()).c_str() + << " " + << (dataMask/"lagrangian"/fieldObject.name()).c_str() + << nl; + } + else + { + caseFile + << pTraits::typeName + << " per element: " + << setw(15) << fieldObject.name() + << " " + << (dataMask/fieldObject.name()).c_str() + << nl; + } +} + + +void ensightParticlePositions +( + const polyMesh& mesh, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +) +{ + Cloud parcels(mesh); + + fileName lagrangianDir = subDir/"lagrangian"; + fileName postFileName = lagrangianDir/"positions"; + + // the ITER/lagrangian subdirectory must exist + mkDir(dataDir/lagrangianDir); + ensightFile os(dataDir/postFileName, format); + + // tag binary format (just like geometry files) + os.writeBinaryHeader(); + os.write(postFileName); + os.newline(); + os.write("particle coordinates"); + os.newline(); + os.write(parcels.size(), 8); // unusual width + os.newline(); + + // binary write is Ensight6 - first ids, then positions + if (format == IOstream::BINARY) + { + forAll (parcels, i) + { + os.write(i+1); + } + + forAllIter(Cloud, parcels, elmnt) + { + const vector& p = elmnt().position(); + + os.write(p.x()); + os.write(p.y()); + os.write(p.z()); + } + } + else + { + label nParcels = 0; + + forAllIter(Cloud, parcels, elmnt) + { + const vector& p = elmnt().position(); + + os.write(++nParcels, 8); // unusual width + os.write(p.x()); + os.write(p.y()); + os.write(p.z()); + os.newline(); + } + } +} + + + +template +void ensightSprayField +( + const IOobject& fieldObject, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +) +{ + Info<< " " << fieldObject.name() << flush; + + fileName lagrangianDir = subDir/"lagrangian"; + fileName postFileName = lagrangianDir/fieldObject.name(); + + string title = postFileName + " with " + pTraits::typeName + " values"; + + ensightFile os(dataDir/postFileName, format); + os.write(title); + os.newline(); + + IOField field(fieldObject); + + // 6 values per line + label count = 0; + + forAll(field, i) + { + Type val = field[i]; + + if (mag(val) < 1.0e-90) + { + val = pTraits::zero; + } + + for (direction cmpt=0; cmpt < pTraits::nComponents; cmpt++) + { + os.write( component(val, cmpt) ); + } + + count += pTraits::nComponents; + + if (count % 6 == 0) + { + os.newline(); + } + } + + // add final newline if required + if (count % 6) + { + os.newline(); + } +} + + +//- write generalized field components +template +void ensightVolField +( + const ensightParts& partsList, + const IOobject& fieldObject, + const fvMesh& mesh, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +) +{ + Info<< " " << fieldObject.name() << flush; + + fileName postFileName = subDir/fieldObject.name(); + + ensightFile os(dataDir/postFileName, format); + os.write(postFileName); + os.newline(); + + // ie, volField + partsList.writeField + ( + os, + GeometricField + ( + fieldObject, + mesh + ) + ); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // end namespace Foam + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.H new file mode 100644 index 0000000000..e2f5ef2860 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/ensightOutputFunctions.H @@ -0,0 +1,100 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + + miscellaneous collection of functions and template related + to Ensight data + +SourceFiles + ensightOutputFunctions.C + +\*---------------------------------------------------------------------------*/ + +#ifndef ensightOutputFunctions_H +#define ensightOutputFunctions_H + +#include "ensightFile.H" +#include "polyMesh.H" +#include "IOobject.H" + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +void ensightCaseEntry +( + OFstream& caseFile, + const IOobject& fieldObject, + const fileName& dataMask, + bool measured = false +); + + +void ensightParticlePositions +( + const polyMesh& mesh, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +); + + +//- write spray parcels +template +void ensightSprayField +( + const IOobject& fieldObject, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +); + +//- write generalized field components +template +void ensightVolField +( + const ensightParts& partsList, + const IOobject& fieldObject, + const fvMesh& mesh, + const fileName& dataDir, + const fileName& subDir, + IOstream::streamFormat format +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // end namespace Foam + +#ifdef NoRepository +# include "ensightOutputFunctions.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C new file mode 100644 index 0000000000..65588d7dc8 --- /dev/null +++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/foamToEnsightParts.C @@ -0,0 +1,499 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. + \\/ 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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Application + foamToEnsightParts + +Description + Translates OpenFOAM data to Ensight format. + An Ensight part is created for each cellZone and patch. + +Usage + - foamToEnsightParts [OPTION] \n + Translates OpenFOAM data to Ensight format + + @param -ascii \n + Write Ensight data in ASCII format instead of "C Binary" + + @param -zeroTime \n + Include the often incomplete initial conditions. + +Note + - no parallel data. + - writes to @a Ensight directory to avoid collisions with foamToEnsight. + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "timeSelector.H" + +#include "volFields.H" +#include "OFstream.H" +#include "IOmanip.H" +#include "IOobjectList.H" +#include "scalarIOField.H" +#include "tensorIOField.H" + +#include "ensightParts.H" +#include "ensightOutputFunctions.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Main program: + +int main(int argc, char *argv[]) +{ + // with -constant and -zeroTime + timeSelector::addOptions(true, false); + argList::noParallel(); + argList::validOptions.insert("ascii", ""); + + const label nTypes = 2; + const word fieldTypes[] = + { + volScalarField::typeName, + volVectorField::typeName + }; + + const label nSprayFieldTypes = 2; + const word sprayFieldTypes[] = + { + scalarIOField::typeName, + vectorIOField::typeName + }; + +# include "setRootCase.H" +# include "createTime.H" + + // get times list + instantList timeDirs = timeSelector::select0(runTime, args); + + // default to binary output, unless otherwise specified + IOstream::streamFormat format = IOstream::BINARY; + if (args.options().found("ascii")) + { + format = IOstream::ASCII; + } + + fileName ensightDir = args.rootPath()/args.globalCaseName()/"Ensight"; + fileName dataDir = ensightDir/"data"; + fileName caseFileName = "Ensight.case"; + fileName dataMask = fileName("data")/ensightFile::mask(); + + // Ensight and Ensight/data directories must exist + if (dir(ensightDir)) + { + rmDir(ensightDir); + } + mkDir(ensightDir); + mkDir(dataDir); + +# include "createMesh.H" + // Construct the list of ensight parts for the entire mesh + ensightParts partsList(mesh); + + // write summary information + { + OFstream partsInfoFile(ensightDir/"partsInfo"); + + partsInfoFile + << "// summary of ensight parts" << nl << nl; + partsList.writeSummary(partsInfoFile); + } + +# include "checkHasMovingMesh.H" +# include "checkHasLagrangian.H" + + // only take the objects that exists at the end of the calculation + IOobjectList objects(mesh, timeDirs[timeDirs.size()-1].name()); + IOobjectList sprayObjects(mesh, timeDirs[timeDirs.size()-1].name(), "lagrangian"); + + // write single geometry or one per time step + fileName geometryFileName("geometry"); + if (hasMovingMesh) + { + geometryFileName = dataMask/geometryFileName; + } + + // the case file is always ASCII + Info << "write case: " << caseFileName.c_str() << endl; + + OFstream caseFile(ensightDir/caseFileName, IOstream::ASCII); + caseFile.setf(ios_base::left); + caseFile + << "FORMAT" << nl + << setw(16) << "type:" << "ensight gold" << nl << nl + << "GEOMETRY" << nl + << setw(16) << "model: 1" << geometryFileName.c_str() << nl; + + if (hasLagrangian) + { + caseFile + << setw(16) << "measured: 2" + << fileName(dataMask/"lagrangian"/"positions").c_str() << nl; + } + caseFile + << nl << "VARIABLE" << nl; + + label nFieldTime = timeDirs.size(); + if (nFieldTime < 0) + { + nFieldTime = 0; + } + + List