Added line number counting, more accommodating point parsing and updated

handling of "uniform", "mixed" and "polygonal" face lists.  Now converts
.cas files as well as .msh files.
This commit is contained in:
henry
2008-11-18 14:57:44 +00:00
parent a622a9a0ec
commit 7c0048e878

View File

@ -54,7 +54,10 @@ using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Scalae factor used to scale points (optional command line argument)
// Line number
label lineNo = 1;
// Scale factor used to scale points (optional command line argument)
scalar scaleFactor = 1.0;
label dimensionOfGrid = 0;
@ -131,8 +134,6 @@ one_space [ \t\f]
space {one_space}*
some_space {one_space}+
cspace ","{space}
nl (\n|\r)
spaceNl ({space}|{nl})*
alpha [_[:alpha:]]
digit [[:digit:]]
@ -146,7 +147,7 @@ quote \"
dash "-"
dotColonDash [.:-]
schemeSpecialInitial [!$%&*/\\:<=>?~_^#.@]
schemeSpecialInitial [!$%&*/\\:<=>?~_^#.@']
schemeSpecialSubsequent [.+-]
schemeSymbol (({some_space}|{alpha}|{quote}|{schemeSpecialInitial})({alpha}|{quote}|{digit}|{schemeSpecialInitial}|{schemeSpecialSubsequent})*)
@ -187,23 +188,23 @@ time ({digit}{digit}":"{digit}{digit}":"{digit}{digit})
versionNumber ({digit}|".")*
header {spaceNl}"(1"{space}
dimension {spaceNl}"(2"{space}
points {spaceNl}"(10"{space}
faces {spaceNl}"(13"{space}
cells {spaceNl}"(12"{space}
zoneVariant1 {spaceNl}"(39"{space}
zoneVariant2 {spaceNl}"(45"{space}
faceTree {spaceNl}"(59"{space}
header {space}"(1"{space}
dimension {space}"(2"{space}
points {space}"(10"{space}
faces {space}"(13"{space}
cells {space}"(12"{space}
zoneVariant1 {space}"(39"{space}
zoneVariant2 {space}"(45"{space}
faceTree {space}"(59"{space}
comment "0"{space}
unknownPeriodicFace "17"{space}
periodicFace "18"{space}
cellTree "58"{space}
faceParents "61"{space}
ignoreBlocks ("4"|"37"|"38"|"41"|"60"|"64"){space}
ignoreBlocks ("4"|"37"|"38"|"40"|"41"|"60"|"64"){space}
redundantBlock {spaceNl}({comment}|{unknownPeriodicFace}|{periodicFace}|{cellTree}|{faceParents}|{ignoreBlocks}){space}
redundantBlock {space}({comment}|{unknownPeriodicFace}|{periodicFace}|{cellTree}|{faceParents}|{ignoreBlocks}){space}
endOfSection {space}")"{space}
@ -290,7 +291,7 @@ endOfSection {space}")"{space}
BEGIN(readPointHeader);
}
<readPointHeader>{spaceNl}{lbrac}{space}"0"{space}"1"{space} {
<readPointHeader>{space}{lbrac}{space}"0"{space}"1"{space} {
BEGIN(readNumberOfPoints);
}
@ -302,7 +303,7 @@ endOfSection {space}")"{space}
// Ignore rest of stream
}
<readPointHeader>{spaceNl}{lbrac} {
<readPointHeader>{space}{lbrac} {
BEGIN(readPointGroupData);
}
@ -342,7 +343,7 @@ endOfSection {space}")"{space}
BEGIN(readPointData);
}
<readPointData>{spaceNl}{lbrac}{spaceNl} {
<readPointData>{space}{lbrac}{space} {
Info<< ". Reading points..." << flush;
cmpt = 0;
yy_push_state(readScalarList);
@ -350,20 +351,33 @@ endOfSection {space}")"{space}
<readScalarList>{signedInteger}{space} {
points[pointi][cmpt++] = scaleFactor*atol(YYText());
}
<readScalarList>{scalar}{space} {
points[pointi][cmpt++] = scaleFactor*atof(YYText());
}
<readScalarList>{spaceNl} {
if (cmpt == pointGroupNumberOfComponents)
{
if (pointGroupNumberOfComponents == 2)
{
points[pointi].z() = 0.0;
}
cmpt = 0;
pointi++;
}
}
<readScalarList>{scalar}{space} {
points[pointi][cmpt++] = scaleFactor*atof(YYText());
if (cmpt == pointGroupNumberOfComponents)
{
if (pointGroupNumberOfComponents == 2)
{
points[pointi].z() = 0.0;
}
cmpt = 0;
pointi++;
}
}
<readScalarList>{endOfSection} {
Info<< "done." << endl;
@ -372,12 +386,13 @@ endOfSection {space}")"{space}
if (pointi != pointGroupEndIndex[pointGroupEndIndex.size()-1]+1)
{
Warning
<< "Problem with reading points: "
<< "start index: "
<< "Problem with reading points: " << nl
<< " start index: "
<< pointGroupStartIndex[pointGroupStartIndex.size()-1]
<< " end index: "
<< pointGroupEndIndex[pointGroupEndIndex.size()-1]
<< " last points read: " << pointi << endl;
<< " last points read: " << pointi << nl
<< " on line " << lineNo << endl;
}
yy_pop_state();
@ -387,7 +402,7 @@ endOfSection {space}")"{space}
BEGIN(readFaceHeader);
}
<readFaceHeader>{spaceNl}{lbrac}{space}"0"{space}"1"{space} {
<readFaceHeader>{space}{lbrac}{space}"0"{space}"1"{space} {
BEGIN(readNumberOfFaces);
}
@ -403,7 +418,7 @@ endOfSection {space}")"{space}
// Type and element type not read
}
<readFaceHeader>{spaceNl}{lbrac} {
<readFaceHeader>{space}{lbrac} {
BEGIN(readFaceGroupData);
}
@ -431,12 +446,12 @@ endOfSection {space}")"{space}
<< faceGroupEndIndex[faceGroupEndIndex.size()-1] << flush;
}
<readNumberOfFaces,readFaceGroupData>{spaceNl}{endOfSection} {
<readNumberOfFaces,readFaceGroupData>{space}{endOfSection} {
BEGIN(readFaceData);
}
<readFaceData>{spaceNl}{lbrac} {
if (faceGroupElementType == 0)
<readFaceData>{space}{lbrac} {
if (faceGroupElementType == 0 || faceGroupElementType > 4)
{
Info<< ". Reading mixed faces..." << flush;
yy_push_state(readFacesMixed);
@ -448,7 +463,7 @@ endOfSection {space}")"{space}
}
}
<readFacesMixed>{spaceNl}{hexLabelList} {
<readFacesMixed>{space}{hexLabelList} {
face& curFaceLabels = faces[facei];
// set size of label list
@ -465,7 +480,7 @@ endOfSection {space}")"{space}
facei++;
}
<readFacesUniform>{spaceNl}{hexLabelList} {
<readFacesUniform>{space}{hexLabelList} {
face& curFaceLabels = faces[facei];
// Set size of label list.
@ -484,19 +499,20 @@ endOfSection {space}")"{space}
facei++;
}
<readFacesMixed,readFacesUniform>{spaceNl}{endOfSection} {
<readFacesMixed,readFacesUniform>{space}{endOfSection} {
Info<< "done." << endl;
// check read of fluentFaces
if (facei != faceGroupEndIndex[faceGroupEndIndex.size()-1]+1)
{
Warning
<< "Problem with reading fluentFaces: "
<< "start index: "
<< "Problem with reading fluentFaces: " << nl
<< " start index: "
<< faceGroupStartIndex[faceGroupStartIndex.size()-1]
<< " end index: "
<< faceGroupEndIndex[faceGroupEndIndex.size()-1]
<< " last fluentFaces read: " << facei << endl;
<< " last fluentFaces read: " << facei << nl
<< " on line " << lineNo << endl;
}
yy_pop_state();
@ -507,7 +523,7 @@ endOfSection {space}")"{space}
BEGIN(readCellHeader);
}
<readCellHeader>{spaceNl}{lbrac}{space}"0"{space}"1"{space} {
<readCellHeader>{space}{lbrac}{space}"0"{space}"1"{space} {
BEGIN(readNumberOfCells);
}
@ -516,7 +532,7 @@ endOfSection {space}")"{space}
Info<< "Number of cells: " << nCells << endl;
}
<readCellHeader>{spaceNl}{lbrac} {
<readCellHeader>{space}{lbrac} {
BEGIN(readCellGroupData);
}
@ -526,7 +542,8 @@ endOfSection {space}")"{space}
// non-standard cell definition from Tgrid, which misses the type label.
Warning
<< "Tgrid syntax problem: " << YYText() << endl;
<< "Tgrid syntax problem: " << YYText() << nl
<< " on line " << lineNo << endl;
// read cell zone-ID, start and end-label
cellGroupZoneID.append(strtol(YYText(), &endPtr, 16));
@ -580,7 +597,7 @@ endOfSection {space}")"{space}
BEGIN(readCellData);
}
<readCellData>{spaceNl}{lbrac} {
<readCellData>{space}{lbrac} {
// Quickly scan to the end of the cell data block and discard
register int c;
while ((c = yyinput()) != 0 && c != ')')
@ -601,7 +618,7 @@ endOfSection {space}")"{space}
BEGIN(readZoneHeader);
}
<readZoneHeader>{spaceNl}{lbrac} {
<readZoneHeader>{space}{lbrac} {
BEGIN(readZoneGroupData);
}
@ -623,17 +640,18 @@ endOfSection {space}")"{space}
BEGIN(readZoneData);
}
<readZoneData>{spaceNl}{lbrac} {
<readZoneData>{space}{lbrac} {
Info<< ". Reading zone data..." << flush;
yy_push_state(readZoneBlock);
}
<readZoneBlock>{spaceNl}{schemeSymbolList} {
<readZoneBlock>{space}{schemeSymbolList} {
}
<readZoneBlock>{lbrac} {
Warning
<< "Found unknown block in zone: " << YYText() << endl;
//Warning
// << "Found unknown block in zone: " << YYText() << nl
// << " on line " << lineNo << endl;
yy_push_state(ignoreBlock);
}
@ -646,7 +664,7 @@ endOfSection {space}")"{space}
/* ------ Reading end of section and others ------ */
<readHeader,readDimension,readPointData,readFaceData,readCellData,readZoneData>{spaceNl}{endOfSection} {
<readHeader,readDimension,readPointData,readFaceData,readCellData,readZoneData>{space}{endOfSection} {
BEGIN(INITIAL);
}
@ -655,7 +673,8 @@ endOfSection {space}")"{space}
{lbrac}{label} {
Warning
<< "Found unknown block of type: "
<< Foam::string(YYText())(1, YYLeng()-1) << endl;
<< Foam::string(YYText())(1, YYLeng()-1) << nl
<< " on line " << lineNo << endl;
yy_push_state(ignoreBlock);
}
@ -664,40 +683,47 @@ endOfSection {space}")"{space}
yy_push_state(ignoreBlock);
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{quote}{text}{quote} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{quote}{text}{quote} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{schemeSymbol} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{schemeSymbol} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{lbrac} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{lbrac} {
yy_push_state(ignoreEmbeddedBlock);
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{endOfSection} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{endOfSection} {
yy_pop_state();
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{labelList} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{labelList} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{hexLabelList} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{hexLabelList} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{scalarList} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{scalarList} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{schemeSymbolList} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{schemeSymbolList} {
}
<ignoreBlock,ignoreEmbeddedBlock>{spaceNl}{text} {
<ignoreBlock,ignoreEmbeddedBlock>{space}{text} {
}
/* ------ Ignore remaining space and \n s. ------ */
/* ------ Count newlines. ------ */
<*>{some_space}|\n|\r {
<*>\n {
lineNo++;
}
/* ------ Ignore remaining space. ------ */
<*>{some_space}|\r {
}
@ -706,7 +732,8 @@ endOfSection {space}")"{space}
<*>. {
// This is a catch all.
FatalErrorIn("fluentMeshToFoam::lexer")
<< "Do not understand characters: " << YYText()
<< "Do not understand characters: " << YYText() << nl
<< " on line " << lineNo
<< exit(FatalError);
}
@ -882,11 +909,8 @@ int main(int argc, char *argv[])
// Check the face groups for boundary patches, baffles and faceZones
// ignoring the interior zones in ignoreCellGroups
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
label nPatches = 0;
labelList patchIDs(faceGroupZoneID.size());
label nFaceZones = 0;
labelList faceZoneIDs(faceGroupZoneID.size());
DynamicList<label> patchIDs(faceGroupZoneID.size());
DynamicList<label> faceZoneIDs(faceGroupZoneID.size());
forAll(faceGroupZoneID, fgi)
{
@ -900,13 +924,13 @@ int main(int argc, char *argv[])
// Check the first element of neighbour for boundary group
if (neighbour[start] == -1 || fluentGroupToFoamPatch.found(type))
{
patchIDs[nPatches++] = fgi;
patchIDs.append(fgi);
}
else
{
if (!ignoreFaceGroups.found(groupName[faceGroupZoneID[fgi] ]))
if (!ignoreFaceGroups.found(groupName[faceGroupZoneID[fgi]]))
{
faceZoneIDs[nFaceZones++] = fgi;
faceZoneIDs.append(fgi);
}
}
}
@ -928,20 +952,32 @@ int main(int argc, char *argv[])
}
else
{
FatalErrorIn(args.executable())
if (neighbour[start] == -1)
{
// Boundary face in unknown group. Create a patch for it.
groupType.insert(zoneID, "unknown");
groupName.insert(zoneID, "FaceGroup" + Foam::name(zoneID));
patchIDs.append(fgi);
Info<< "Created patch " << fgi << " for unknown FaceGroup "
<< zoneID << '.' << endl;
}
else
{
WarningIn(args.executable())
<< "Unknown FaceGroup " << zoneID << " not in a zone"
<< exit(FatalError);
<< endl;
}
}
}
patchIDs.setSize(nPatches);
faceZoneIDs.setSize(nFaceZones);
patchIDs.shrink();
faceZoneIDs.shrink();
// Add empty patches
// ~~~~~~~~~~~~~~~~~
List<polyPatch*> newPatches(nPatches);
List<polyPatch*> newPatches(patchIDs.size());
HashSet<word> patchNames;
forAll(patchIDs, patchi)
@ -1024,7 +1060,7 @@ int main(int argc, char *argv[])
}
// Face zones
mesh.faceZones().setSize(nFaceZones);
mesh.faceZones().setSize(faceZoneIDs.size());
HashSet<word> faceZoneNames;
forAll(faceZoneIDs, faceZonei)
@ -1098,6 +1134,8 @@ int main(int argc, char *argv[])
}
bool doneWarning = false;
// Add faceZone faces
forAll(faceZoneIDs, faceZonei)
{
@ -1112,6 +1150,22 @@ int main(int argc, char *argv[])
<< endl;
for (label facei = start; facei <= end; facei++)
{
if (owner[facei] >= nCells || neighbour[facei] >= nCells)
{
if (!doneWarning)
{
WarningIn(args.executable())
<< "Ignoring internal face " << facei
<< " on FaceZone " << zoneID
<< " since owner " << owner[facei] << " or neighbour "
<< neighbour[facei] << " outside range of cells 0.."
<< nCells-1 << endl
<< " Suppressing future warnings." << endl;
doneWarning = true;
}
}
else
{
meshMod.addFace
(
@ -1126,6 +1180,7 @@ int main(int argc, char *argv[])
faceZonei, // zoneID
false // zoneFlip
);
}
// Mark face as being done
owner[facei] = -1;
@ -1146,6 +1201,22 @@ int main(int argc, char *argv[])
<< endl;
for (label facei = start; facei <= end; facei++)
{
if (owner[facei] >= nCells || neighbour[facei] >= nCells)
{
if (!doneWarning)
{
WarningIn(args.executable())
<< "Ignoring patch face " << facei
<< " on FaceZone " << zoneID
<< " since owner " << owner[facei] << " or neighbour "
<< neighbour[facei] << " outside range of cells 0.."
<< nCells-1 << endl
<< " Suppressing future warnings." << endl;
doneWarning = true;
}
}
else
{
meshMod.addFace
(
@ -1178,7 +1249,7 @@ int main(int argc, char *argv[])
false // zoneFlip
);
}
}
// Mark face as being done
owner[facei] = -1;
}
@ -1198,6 +1269,21 @@ int main(int argc, char *argv[])
<< exit(FatalError);
}
if (owner[facei] >= nCells || neighbour[facei] >= nCells)
{
if (!doneWarning)
{
WarningIn(args.executable())
<< "Ignoring internal face " << facei
<< " since owner " << owner[facei] << " or neighbour "
<< neighbour[facei] << " outside range of cells 0.."
<< nCells-1 << endl
<< " Suppressing future warnings." << endl;
doneWarning = true;
}
}
else
{
meshMod.addFace
(
faces[facei],
@ -1213,6 +1299,7 @@ int main(int argc, char *argv[])
);
}
}
}
// Reclaim storage
faces.setSize(0);