2010-05-12 13:27:55 +00:00
|
|
|
/*---------------------------------------------------------------------------*\
|
|
|
|
========= |
|
2013-12-11 16:09:41 +00:00
|
|
|
\\ / F ield | foam-extend: Open Source CFD
|
2010-05-12 13:27:55 +00:00
|
|
|
\\ / O peration |
|
2013-12-11 16:09:41 +00:00
|
|
|
\\ / A nd | For copyright notice see file Copyright
|
2010-05-12 13:27:55 +00:00
|
|
|
\\/ M anipulation |
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
License
|
2013-12-11 16:09:41 +00:00
|
|
|
This file is part of foam-extend.
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2013-12-11 16:09:41 +00:00
|
|
|
foam-extend is free software: you can redistribute it and/or modify it
|
2010-05-12 13:27:55 +00:00
|
|
|
under the terms of the GNU General Public License as published by the
|
2013-12-11 16:09:41 +00:00
|
|
|
Free Software Foundation, either version 3 of the License, or (at your
|
2010-05-12 13:27:55 +00:00
|
|
|
option) any later version.
|
|
|
|
|
2013-12-11 16:09:41 +00:00
|
|
|
foam-extend 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.
|
2010-05-12 13:27:55 +00:00
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2013-12-11 16:09:41 +00:00
|
|
|
along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
2010-05-12 13:27:55 +00:00
|
|
|
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
#include "ensightField.H"
|
|
|
|
#include "fvMesh.H"
|
|
|
|
#include "volFields.H"
|
|
|
|
#include "OFstream.H"
|
|
|
|
#include "IOmanip.H"
|
|
|
|
#include "itoa.H"
|
|
|
|
#include "ensightWriteBinary.H"
|
|
|
|
|
|
|
|
using namespace Foam;
|
|
|
|
|
|
|
|
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
|
|
|
|
|
|
|
|
void writeData(const scalarField& sf, OFstream& ensightFile)
|
|
|
|
{
|
|
|
|
forAll(sf, i)
|
|
|
|
{
|
|
|
|
if (mag( sf[i] ) >= scalar(floatScalarVSMALL))
|
|
|
|
{
|
|
|
|
ensightFile << setw(12) << sf[i] << nl;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ensightFile << setw(12) << scalar(0) << nl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
scalarField map
|
|
|
|
(
|
|
|
|
const Field<Type>& vf,
|
|
|
|
const labelList& map,
|
|
|
|
const label cmpt
|
|
|
|
)
|
|
|
|
{
|
|
|
|
scalarField mf(map.size());
|
|
|
|
|
|
|
|
forAll(map, i)
|
|
|
|
{
|
|
|
|
mf[i] = component(vf[map[i]], cmpt);
|
|
|
|
}
|
|
|
|
|
|
|
|
return mf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
scalarField map
|
|
|
|
(
|
|
|
|
const Field<Type>& vf,
|
|
|
|
const labelList& map1,
|
|
|
|
const labelList& map2,
|
|
|
|
const label cmpt
|
|
|
|
)
|
|
|
|
{
|
|
|
|
scalarField mf(map1.size() + map2.size());
|
|
|
|
|
|
|
|
forAll(map1, i)
|
|
|
|
{
|
|
|
|
mf[i] = component(vf[map1[i]], cmpt);
|
|
|
|
}
|
|
|
|
|
|
|
|
label offset = map1.size();
|
|
|
|
|
|
|
|
forAll(map2, i)
|
|
|
|
{
|
|
|
|
mf[i + offset] = component(vf[map2[i]], cmpt);
|
|
|
|
}
|
|
|
|
|
|
|
|
return mf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void writeAllData
|
|
|
|
(
|
|
|
|
const char* key,
|
|
|
|
const Field<Type>& vf,
|
|
|
|
const labelList& prims,
|
|
|
|
const label nPrims,
|
|
|
|
OFstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nPrims)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile << key << nl;
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeData(map(vf, prims, cmpt), ensightFile);
|
|
|
|
|
|
|
|
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
|
|
|
{
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField data(fromSlave);
|
|
|
|
writeData(data, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(vf, prims, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void writeAllDataBinary
|
|
|
|
(
|
|
|
|
const char* key,
|
|
|
|
const Field<Type>& vf,
|
|
|
|
const labelList& prims,
|
|
|
|
const label nPrims,
|
|
|
|
std::ofstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nPrims)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
writeEnsDataBinary(key,ensightFile);
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeEnsDataBinary(map(vf, prims, cmpt), ensightFile);
|
|
|
|
|
|
|
|
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
|
|
|
{
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField data(fromSlave);
|
|
|
|
writeEnsDataBinary(data, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(vf, prims, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void writeAllFaceData
|
|
|
|
(
|
|
|
|
const char* key,
|
|
|
|
const labelList& prims,
|
|
|
|
const label nPrims,
|
|
|
|
const Field<Type>& pf,
|
|
|
|
const labelList& patchProcessors,
|
|
|
|
OFstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nPrims)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile << key << nl;
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeData(map(pf, prims, cmpt), ensightFile);
|
|
|
|
|
|
|
|
forAll (patchProcessors, i)
|
|
|
|
{
|
|
|
|
if (patchProcessors[i] != 0)
|
|
|
|
{
|
|
|
|
label slave = patchProcessors[i];
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField pf(fromSlave);
|
|
|
|
|
|
|
|
writeData(pf, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(pf, prims, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void writeAllFaceDataBinary
|
|
|
|
(
|
|
|
|
const char* key,
|
|
|
|
const labelList& prims,
|
|
|
|
const label nPrims,
|
|
|
|
const Field<Type>& pf,
|
|
|
|
const labelList& patchProcessors,
|
|
|
|
std::ofstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nPrims)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
writeEnsDataBinary(key,ensightFile);
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeEnsDataBinary(map(pf, prims, cmpt), ensightFile);
|
|
|
|
|
|
|
|
forAll (patchProcessors, i)
|
|
|
|
{
|
|
|
|
if (patchProcessors[i] != 0)
|
|
|
|
{
|
|
|
|
label slave = patchProcessors[i];
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField pf(fromSlave);
|
|
|
|
|
|
|
|
writeEnsDataBinary(pf, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(pf, prims, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
bool writePatchField
|
|
|
|
(
|
|
|
|
const Foam::Field<Type>& pf,
|
|
|
|
const Foam::label patchi,
|
2010-08-26 14:22:03 +00:00
|
|
|
const Foam::label ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
const Foam::faceSets& boundaryFaceSet,
|
|
|
|
const Foam::ensightMesh::nFacePrimitives& nfp,
|
|
|
|
const Foam::labelList& patchProcessors,
|
|
|
|
Foam::OFstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nfp.nTris || nfp.nQuads || nfp.nPolys)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile
|
|
|
|
<< "part" << nl
|
2010-08-26 14:22:03 +00:00
|
|
|
<< setw(10) << ensightPatchI << nl;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
writeAllFaceData
|
|
|
|
(
|
|
|
|
"tria3",
|
|
|
|
boundaryFaceSet.tris,
|
|
|
|
nfp.nTris,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllFaceData
|
|
|
|
(
|
|
|
|
"quad4",
|
|
|
|
boundaryFaceSet.quads,
|
|
|
|
nfp.nQuads,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllFaceData
|
|
|
|
(
|
|
|
|
"nsided",
|
|
|
|
boundaryFaceSet.polys,
|
|
|
|
nfp.nPolys,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
bool writePatchFieldBinary
|
|
|
|
(
|
|
|
|
const Foam::Field<Type>& pf,
|
|
|
|
const Foam::label patchi,
|
2010-08-26 14:22:03 +00:00
|
|
|
const Foam::label ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
const Foam::faceSets& boundaryFaceSet,
|
|
|
|
const Foam::ensightMesh::nFacePrimitives& nfp,
|
|
|
|
const Foam::labelList& patchProcessors,
|
|
|
|
std::ofstream& ensightFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (nfp.nTris || nfp.nQuads || nfp.nPolys)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
writeEnsDataBinary("part",ensightFile);
|
2010-08-26 14:22:03 +00:00
|
|
|
writeEnsDataBinary(ensightPatchI,ensightFile);
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
writeAllFaceDataBinary
|
|
|
|
(
|
|
|
|
"tria3",
|
|
|
|
boundaryFaceSet.tris,
|
|
|
|
nfp.nTris,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllFaceDataBinary
|
|
|
|
(
|
|
|
|
"quad4",
|
|
|
|
boundaryFaceSet.quads,
|
|
|
|
nfp.nQuads,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllFaceDataBinary
|
|
|
|
(
|
|
|
|
"nsided",
|
|
|
|
boundaryFaceSet.polys,
|
|
|
|
nfp.nPolys,
|
|
|
|
pf,
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void writePatchField
|
|
|
|
(
|
|
|
|
const Foam::word& fieldName,
|
|
|
|
const Foam::Field<Type>& pf,
|
|
|
|
const Foam::word& patchName,
|
|
|
|
const Foam::ensightMesh& eMesh,
|
|
|
|
const Foam::fileName& postProcPath,
|
|
|
|
const Foam::word& prepend,
|
|
|
|
const Foam::label timeIndex,
|
|
|
|
Foam::Ostream& ensightCaseFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
const Time& runTime = eMesh.mesh().time();
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
|
|
|
const wordList& allPatchNames = eMesh.allPatchNames();
|
|
|
|
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
2010-05-12 13:27:55 +00:00
|
|
|
const HashTable<ensightMesh::nFacePrimitives>&
|
|
|
|
nPatchPrims = eMesh.nPatchPrims();
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
label ensightPatchI = eMesh.patchPartOffset();
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
label patchi = -1;
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
forAll(allPatchNames, i)
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
if (allPatchNames[i] == patchName)
|
|
|
|
{
|
|
|
|
patchi = i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
ensightPatchI++;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
const labelList& patchProcessors = allPatchProcs[patchi];
|
2010-05-12 13:27:55 +00:00
|
|
|
|
|
|
|
word pfName = patchName + '.' + fieldName;
|
|
|
|
|
|
|
|
word timeFile = prepend + itoa(timeIndex);
|
|
|
|
|
|
|
|
OFstream *ensightFilePtr = NULL;
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
if (timeIndex == 0)
|
|
|
|
{
|
|
|
|
ensightCaseFile.setf(ios_base::left);
|
|
|
|
|
|
|
|
ensightCaseFile
|
|
|
|
<< pTraits<Type>::typeName
|
|
|
|
<< " per element: 1 "
|
|
|
|
<< setw(15) << pfName
|
|
|
|
<< (' ' + prepend + "***." + pfName).c_str()
|
|
|
|
<< nl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// set the filename of the ensight file
|
|
|
|
fileName ensightFileName(timeFile + "." + pfName);
|
|
|
|
ensightFilePtr = new OFstream
|
|
|
|
(
|
|
|
|
postProcPath/ensightFileName,
|
2010-09-22 18:13:13 +00:00
|
|
|
ios_base::out|ios_base::trunc,
|
2010-05-12 13:27:55 +00:00
|
|
|
runTime.writeFormat(),
|
|
|
|
runTime.writeVersion(),
|
|
|
|
runTime.writeCompression()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
OFstream& ensightFile = *ensightFilePtr;
|
|
|
|
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile << pTraits<Type>::typeName << nl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (patchi >= 0)
|
|
|
|
{
|
|
|
|
writePatchField
|
|
|
|
(
|
|
|
|
pf,
|
|
|
|
patchi,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
boundaryFaceSets[patchi],
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
faceSets nullFaceSets;
|
|
|
|
|
|
|
|
writePatchField
|
|
|
|
(
|
|
|
|
Field<Type>(),
|
|
|
|
-1,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
nullFaceSets,
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
delete ensightFilePtr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
|
2010-05-12 13:27:55 +00:00
|
|
|
template<class Type>
|
|
|
|
void ensightFieldAscii
|
|
|
|
(
|
|
|
|
const Foam::IOobject& fieldObject,
|
|
|
|
const Foam::ensightMesh& eMesh,
|
|
|
|
const Foam::fileName& postProcPath,
|
|
|
|
const Foam::word& prepend,
|
|
|
|
const Foam::label timeIndex,
|
|
|
|
Foam::Ostream& ensightCaseFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
Info<< "Converting field " << fieldObject.name() << endl;
|
|
|
|
|
|
|
|
word timeFile = prepend + itoa(timeIndex);
|
|
|
|
|
|
|
|
const fvMesh& mesh = eMesh.mesh();
|
|
|
|
const Time& runTime = mesh.time();
|
|
|
|
|
|
|
|
const cellSets& meshCellSets = eMesh.meshCellSets();
|
|
|
|
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
2010-08-26 14:22:03 +00:00
|
|
|
const wordList& allPatchNames = eMesh.allPatchNames();
|
|
|
|
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
2010-05-12 13:27:55 +00:00
|
|
|
const wordHashSet& patchNames = eMesh.patchNames();
|
|
|
|
const HashTable<ensightMesh::nFacePrimitives>&
|
|
|
|
nPatchPrims = eMesh.nPatchPrims();
|
|
|
|
|
|
|
|
const labelList& tets = meshCellSets.tets;
|
|
|
|
const labelList& pyrs = meshCellSets.pyrs;
|
|
|
|
const labelList& prisms = meshCellSets.prisms;
|
|
|
|
const labelList& wedges = meshCellSets.wedges;
|
|
|
|
const labelList& hexes = meshCellSets.hexes;
|
|
|
|
const labelList& polys = meshCellSets.polys;
|
|
|
|
|
|
|
|
OFstream *ensightFilePtr = NULL;
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
// set the filename of the ensight file
|
|
|
|
fileName ensightFileName(timeFile + "." + fieldObject.name());
|
|
|
|
ensightFilePtr = new OFstream
|
|
|
|
(
|
|
|
|
postProcPath/ensightFileName,
|
2010-09-22 18:13:13 +00:00
|
|
|
ios_base::out|ios_base::trunc,
|
2010-05-12 13:27:55 +00:00
|
|
|
runTime.writeFormat(),
|
|
|
|
runTime.writeVersion(),
|
|
|
|
runTime.writeCompression()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
OFstream& ensightFile = *ensightFilePtr;
|
|
|
|
|
|
|
|
GeometricField<Type, fvPatchField, volMesh> vf(fieldObject, mesh);
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
if (patchNames.empty())
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
if (timeIndex == 0)
|
|
|
|
{
|
|
|
|
ensightCaseFile.setf(ios_base::left);
|
|
|
|
|
|
|
|
ensightCaseFile
|
|
|
|
<< pTraits<Type>::typeName
|
|
|
|
<< " per element: 1 "
|
|
|
|
<< setw(15) << vf.name()
|
|
|
|
<< (' ' + prepend + "***." + vf.name()).c_str()
|
|
|
|
<< nl;
|
|
|
|
}
|
|
|
|
|
|
|
|
ensightFile
|
|
|
|
<< pTraits<Type>::typeName << nl
|
|
|
|
<< "part" << nl
|
|
|
|
<< setw(10) << 1 << nl;
|
|
|
|
|
|
|
|
ensightFile.setf(ios_base::scientific, ios_base::floatfield);
|
|
|
|
ensightFile.precision(5);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (meshCellSets.nHexesWedges)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile << "hexa8" << nl;
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeData
|
|
|
|
(
|
|
|
|
map(vf, hexes, wedges, cmpt),
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
|
|
|
{
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField data(fromSlave);
|
|
|
|
writeData(data, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(vf, hexes, wedges, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
writeAllData("penta6", vf, prisms, meshCellSets.nPrisms, ensightFile);
|
|
|
|
writeAllData("pyramid5", vf, pyrs, meshCellSets.nPyrs, ensightFile);
|
|
|
|
writeAllData("tetra4", vf, tets, meshCellSets.nTets, ensightFile);
|
|
|
|
writeAllData("nfaced", vf, polys, meshCellSets.nPolys, ensightFile);
|
|
|
|
}
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
label ensightPatchI = eMesh.patchPartOffset();
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
forAll(allPatchNames, patchi)
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
const word& patchName = allPatchNames[patchi];
|
|
|
|
const labelList& patchProcessors = allPatchProcs[patchi];
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
if (patchNames.empty() || patchNames.found(patchName))
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
if (mesh.boundary()[patchi].size())
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
|
|
|
if
|
|
|
|
(
|
|
|
|
writePatchField
|
|
|
|
(
|
|
|
|
vf.boundaryField()[patchi],
|
|
|
|
patchi,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
boundaryFaceSets[patchi],
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI++;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else if (Pstream::master())
|
|
|
|
{
|
|
|
|
faceSets nullFaceSet;
|
|
|
|
|
|
|
|
if
|
|
|
|
(
|
|
|
|
writePatchField
|
|
|
|
(
|
|
|
|
Field<Type>(),
|
|
|
|
-1,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
nullFaceSet,
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI++;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
delete ensightFilePtr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template<class Type>
|
|
|
|
void ensightFieldBinary
|
|
|
|
(
|
|
|
|
const Foam::IOobject& fieldObject,
|
|
|
|
const Foam::ensightMesh& eMesh,
|
|
|
|
const Foam::fileName& postProcPath,
|
|
|
|
const Foam::word& prepend,
|
|
|
|
const Foam::label timeIndex,
|
|
|
|
Foam::Ostream& ensightCaseFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
Info<< "Converting field (binary) " << fieldObject.name() << endl;
|
|
|
|
|
|
|
|
word timeFile = prepend + itoa(timeIndex);
|
|
|
|
|
|
|
|
const fvMesh& mesh = eMesh.mesh();
|
|
|
|
//const Time& runTime = mesh.time();
|
|
|
|
|
|
|
|
const cellSets& meshCellSets = eMesh.meshCellSets();
|
|
|
|
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
2010-08-26 14:22:03 +00:00
|
|
|
const wordList& allPatchNames = eMesh.allPatchNames();
|
|
|
|
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
2010-05-12 13:27:55 +00:00
|
|
|
const wordHashSet& patchNames = eMesh.patchNames();
|
|
|
|
const HashTable<ensightMesh::nFacePrimitives>&
|
|
|
|
nPatchPrims = eMesh.nPatchPrims();
|
|
|
|
|
|
|
|
const labelList& tets = meshCellSets.tets;
|
|
|
|
const labelList& pyrs = meshCellSets.pyrs;
|
|
|
|
const labelList& prisms = meshCellSets.prisms;
|
|
|
|
const labelList& wedges = meshCellSets.wedges;
|
|
|
|
const labelList& hexes = meshCellSets.hexes;
|
|
|
|
const labelList& polys = meshCellSets.polys;
|
|
|
|
|
|
|
|
std::ofstream *ensightFilePtr = NULL;
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
// set the filename of the ensight file
|
|
|
|
fileName ensightFileName(timeFile + "." + fieldObject.name());
|
|
|
|
ensightFilePtr = new std::ofstream
|
|
|
|
(
|
|
|
|
(postProcPath/ensightFileName).c_str(),
|
|
|
|
ios_base::out | ios_base::binary | ios_base::trunc
|
|
|
|
);
|
|
|
|
// Check on file opened?
|
|
|
|
}
|
|
|
|
|
|
|
|
std::ofstream& ensightFile = *ensightFilePtr;
|
|
|
|
|
|
|
|
GeometricField<Type, fvPatchField, volMesh> vf(fieldObject, mesh);
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
if (patchNames.empty())
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
if (timeIndex == 0)
|
|
|
|
{
|
|
|
|
ensightCaseFile.setf(ios_base::left);
|
|
|
|
|
|
|
|
ensightCaseFile
|
|
|
|
<< pTraits<Type>::typeName
|
|
|
|
<< " per element: 1 "
|
|
|
|
<< setw(15) << vf.name()
|
|
|
|
<< (' ' + prepend + "***." + vf.name()).c_str()
|
|
|
|
<< nl;
|
|
|
|
}
|
|
|
|
|
|
|
|
writeEnsDataBinary(pTraits<Type>::typeName,ensightFile);
|
|
|
|
writeEnsDataBinary("part",ensightFile);
|
|
|
|
writeEnsDataBinary(1,ensightFile);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (meshCellSets.nHexesWedges)
|
|
|
|
{
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
writeEnsDataBinary("hexa8",ensightFile);
|
|
|
|
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
writeEnsDataBinary
|
|
|
|
(
|
|
|
|
map(vf, hexes, wedges, cmpt),
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
|
|
|
{
|
|
|
|
IPstream fromSlave(Pstream::scheduled, slave);
|
|
|
|
scalarField data(fromSlave);
|
|
|
|
writeEnsDataBinary(data, ensightFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
|
|
|
{
|
|
|
|
OPstream toMaster(Pstream::scheduled, Pstream::masterNo());
|
|
|
|
toMaster<< map(vf, hexes, wedges, cmpt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
writeAllDataBinary
|
|
|
|
(
|
|
|
|
"penta6",
|
|
|
|
vf,
|
|
|
|
prisms,
|
|
|
|
meshCellSets.nPrisms,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllDataBinary
|
|
|
|
(
|
|
|
|
"pyramid5",
|
|
|
|
vf,
|
|
|
|
pyrs,
|
|
|
|
meshCellSets.nPyrs,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllDataBinary
|
|
|
|
(
|
|
|
|
"tetra4",
|
|
|
|
vf,
|
|
|
|
tets,
|
|
|
|
meshCellSets.nTets,
|
|
|
|
ensightFile
|
|
|
|
);
|
|
|
|
|
|
|
|
writeAllDataBinary
|
|
|
|
(
|
|
|
|
"nfaced",
|
|
|
|
vf,
|
|
|
|
polys,
|
|
|
|
meshCellSets.nPolys,
|
|
|
|
ensightFile
|
|
|
|
);
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
label ensightPatchI = eMesh.patchPartOffset();
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
forAll(allPatchNames, patchi)
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
const word& patchName = allPatchNames[patchi];
|
|
|
|
const labelList& patchProcessors = allPatchProcs[patchi];
|
2010-05-12 13:27:55 +00:00
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
if (patchNames.empty() || patchNames.found(patchName))
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
if (mesh.boundary()[patchi].size())
|
2010-05-12 13:27:55 +00:00
|
|
|
{
|
|
|
|
if
|
|
|
|
(
|
|
|
|
writePatchFieldBinary
|
|
|
|
(
|
|
|
|
vf.boundaryField()[patchi],
|
|
|
|
patchi,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
boundaryFaceSets[patchi],
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI++;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else if (Pstream::master())
|
|
|
|
{
|
|
|
|
faceSets nullFaceSet;
|
|
|
|
|
|
|
|
if
|
|
|
|
(
|
|
|
|
writePatchFieldBinary
|
|
|
|
(
|
|
|
|
Field<Type>(),
|
|
|
|
-1,
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI,
|
2010-05-12 13:27:55 +00:00
|
|
|
nullFaceSet,
|
|
|
|
nPatchPrims.find(patchName)(),
|
|
|
|
patchProcessors,
|
|
|
|
ensightFile
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
2010-08-26 14:22:03 +00:00
|
|
|
ensightPatchI++;
|
2010-05-12 13:27:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Pstream::master())
|
|
|
|
{
|
|
|
|
ensightFile.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-26 14:22:03 +00:00
|
|
|
|
2010-05-12 13:27:55 +00:00
|
|
|
template<class Type>
|
|
|
|
void ensightField
|
|
|
|
(
|
|
|
|
const Foam::IOobject& fieldObject,
|
|
|
|
const Foam::ensightMesh& eMesh,
|
|
|
|
const Foam::fileName& postProcPath,
|
|
|
|
const Foam::word& prepend,
|
|
|
|
const Foam::label timeIndex,
|
|
|
|
const bool binary,
|
|
|
|
Foam::Ostream& ensightCaseFile
|
|
|
|
)
|
|
|
|
{
|
|
|
|
if (binary)
|
|
|
|
{
|
|
|
|
ensightFieldBinary<Type>
|
|
|
|
(
|
|
|
|
fieldObject,
|
|
|
|
eMesh,
|
|
|
|
postProcPath,
|
|
|
|
prepend,
|
|
|
|
timeIndex,
|
|
|
|
ensightCaseFile
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ensightFieldAscii<Type>
|
|
|
|
(
|
|
|
|
fieldObject,
|
|
|
|
eMesh,
|
|
|
|
postProcPath,
|
|
|
|
prepend,
|
|
|
|
timeIndex,
|
|
|
|
ensightCaseFile
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ************************************************************************* //
|