diff --git a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C index 7e4363ffb0583d847bbbbf6e150225a9fcff3914..cd51599ca1013e4a4cf1ba7188a9cfc895cda2ee 100644 --- a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C +++ b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C @@ -31,6 +31,14 @@ Description Mainly used to convert binary mesh/field files to ASCII. + Problem: any zero-size List written binary gets written as '0'. When + reading the file as a dictionary this is interpreted as a label. This + is (usually) not a problem when doing patch fields since these get the + 'uniform', 'nonuniform' prefix. However zone contents are labelLists + not labelFields and these go wrong. For now hacked a solution where + we detect the keywords in zones and redo the dictionary entries + to be labelLists. + \*---------------------------------------------------------------------------*/ #include "argList.H" @@ -56,6 +64,82 @@ namespace Foam } +// Hack to do zones which have Lists in them. See above. +bool writeZones(const word& name, Time& runTime) +{ + IOobject io + ( + name, + runTime.timeName(), + polyMesh::meshSubDir, + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ); + + bool writeOk = false; + + if (io.headerOk()) + { + Info<< " Reading " << io.headerClassName() + << " : " << name << endl; + + // Switch off type checking (for reading e.g. faceZones as + // generic list of dictionaries). + const word oldTypeName = IOPtrList<entry>::typeName; + const_cast<word&>(IOPtrList<entry>::typeName) = word::null; + + IOPtrList<entry> meshObject(io); + + forAll(meshObject, i) + { + if (meshObject[i].isDict()) + { + dictionary& d = meshObject[i].dict(); + + if (d.found("faceLabels")) + { + d.set("faceLabels", labelList(d.lookup("faceLabels"))); + } + + if (d.found("flipMap")) + { + d.set("flipMap", boolList(d.lookup("flipMap"))); + } + + if (d.found("cellLabels")) + { + d.set("cellLabels", labelList(d.lookup("cellLabels"))); + } + + if (d.found("pointLabels")) + { + d.set("pointLabels", labelList(d.lookup("pointLabels"))); + } + } + } + + const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName; + // Fake type back to what was in field + const_cast<word&>(meshObject.type()) = io.headerClassName(); + + Info<< " Writing " << name << endl; + + // Force writing as ascii + writeOk = meshObject.regIOobject::writeObject + ( + IOstream::ASCII, + IOstream::currentVersion, + runTime.writeCompression() + ); + } + + return writeOk; +} + + + // Main program: int main(int argc, char *argv[]) @@ -76,9 +160,19 @@ int main(int argc, char *argv[]) writeMeshObject<labelIOList>("neighbour", runTime); writeMeshObject<faceIOList>("faces", runTime); writeMeshObject<pointIOField>("points", runTime); - writeMeshObject<IOPtrList<entry> >("cellZones", runTime); - writeMeshObject<IOPtrList<entry> >("faceZones", runTime); - writeMeshObject<IOPtrList<entry> >("pointZones", runTime); + writeMeshObject<labelIOList>("pointProcAddressing", runTime); + writeMeshObject<labelIOList>("faceProcAddressing", runTime); + writeMeshObject<labelIOList>("cellProcAddressing", runTime); + writeMeshObject<labelIOList>("boundaryProcAddressing", runTime); + + if (runTime.writeFormat() == IOstream::ASCII) + { + // Only do zones when converting from binary to ascii + // The other way gives problems since working on dictionary level. + writeZones("cellZones", runTime); + writeZones("faceZones", runTime); + writeZones("pointZones", runTime); + } // Get list of objects from the database IOobjectList objects(runTime, runTime.timeName());