1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 I-Deas unv format mesh conversion.
29 - face groups (2452(Cubit), 2467)
31 Works without but then puts all faces in defaultFaces patch.
33 \*---------------------------------------------------------------------------*/
39 #include "cellModeller.H"
42 #include "DynamicList.H"
45 #include "MeshedSurfaces.H"
49 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
54 inline unsigned Hash<face>::operator()(const face& t, unsigned seed) const
56 return Hasher(t.cdata(),t.size()*sizeof(label), seed);
60 inline unsigned Hash<face>::operator()(const face& t) const
62 return Hash<face>::operator()(t, 0);
65 const string SEPARATOR(" -1");
67 bool isSeparator(const string& line)
69 return line.substr(0, 6) == SEPARATOR;
73 // Reads past -1 and reads element type
74 label readTag(IFstream& is)
93 tag = line.substr(0, 6);
95 } while (tag == SEPARATOR);
97 return readLabel(IStringStream(tag)());
101 // Reads and prints header
102 void readHeader(IFstream& is)
110 if (isSeparator(line))
123 void skipSection(IFstream& is)
125 Info<< "Skipping section at line " << is.lineNumber() << '.' << endl;
133 if (isSeparator(line))
141 scalar readUnvScalar(const string& unvString)
145 s.replaceAll("d", "E");
146 s.replaceAll("D", "E");
148 return readScalar(IStringStream(s)());
152 // Reads unit section
162 Info<< "Starting reading units at line " << is.lineNumber() << '.' << endl;
167 label l = readLabel(IStringStream(line.substr(0, 10))());
168 Info<< "l:" << l << endl;
170 string units(line.substr(10, 20));
171 Info<< "units:" << units << endl;
173 label unitType = readLabel(IStringStream(line.substr(30, 10))());
174 Info<< "unitType:" << unitType << endl;
179 lengthScale = readUnvScalar(line.substr(0, 25));
180 forceScale = readUnvScalar(line.substr(25, 25));
181 tempScale = readUnvScalar(line.substr(50, 25));
184 tempOffset = readUnvScalar(line.substr(0, 25));
186 Info<< "Unit factors:" << nl
187 << " Length scale : " << lengthScale << nl
188 << " Force scale : " << forceScale << nl
189 << " Temperature scale : " << tempScale << nl
190 << " Temperature offset : " << tempOffset << nl
195 // Reads points section. Read region as well?
199 DynamicList<point>& points, // coordinates
200 DynamicList<label>& unvPointID // unv index
203 Info<< "Starting reading points at line " << is.lineNumber() << '.' << endl;
205 static bool hasWarned = false;
212 label pointI = readLabel(IStringStream(line.substr(0, 10))());
218 else if (pointI != points.size()+1 && !hasWarned)
224 "readPoints(IFstream&, label&, DynamicList<point>"
225 ", DynamicList<label>&)",
227 ) << "Points not in order starting at point " << pointI
228 //<< " at line " << is.lineNumber()
229 //<< abort(FatalError);
235 pt[0] = readUnvScalar(line.substr(0, 25));
236 pt[1] = readUnvScalar(line.substr(25, 25));
237 pt[2] = readUnvScalar(line.substr(50, 25));
239 unvPointID.append(pointI);
246 Info<< "Read " << points.size() << " points." << endl;
251 DynamicList<label>& indizes,
256 if (indizes.size() < (cellI+1))
258 indizes.setSize(cellI+1,-1);
260 indizes[cellI] = val;
263 // Reads cells section. Read region as well? Not handled yet but should just
264 // be a matter of reading corresponding to boundaryFaces the correct property
265 // and sorting it later on.
269 DynamicList<cellShape>& cellVerts,
270 DynamicList<label>& cellMaterial,
271 DynamicList<label>& boundaryFaceIndices,
272 DynamicList<face>& boundaryFaces,
273 DynamicList<label>& cellCorrespondence,
274 DynamicList<label>& unvPointID // unv index
277 Info<< "Starting reading cells at line " << is.lineNumber() << '.' << endl;
279 // Invert point numbering.
280 label maxUnvPoint = 0;
281 forAll(unvPointID, pointI)
283 maxUnvPoint = max(maxUnvPoint, unvPointID[pointI]);
285 labelList unvToFoam(invert(maxUnvPoint+1, unvPointID));
288 const cellModel& hex = *(cellModeller::lookup("hex"));
289 const cellModel& prism = *(cellModeller::lookup("prism"));
290 const cellModel& tet = *(cellModeller::lookup("tet"));
292 labelHashSet skippedElements;
294 labelHashSet foundFeType;
301 if (isSeparator(line))
306 label cellI, feID, physProp, matProp, colour, nNodes;
308 IStringStream lineStr(line);
310 >> cellI >> feID >> physProp >> matProp >> colour >> nNodes;
312 if (foundFeType.insert(feID))
314 Info<< "First occurrence of element type " << feID
315 << " for cell " << cellI << " at line "
316 << is.lineNumber() << endl;
325 else if (feID == 171)
330 else if (feID == 41 || feID == 91)
332 // Triangle. Save - used for patching later on.
336 IStringStream lineStr(line);
338 >> cVerts[0] >> cVerts[1] >> cVerts[2];
339 boundaryFaces.append(cVerts);
340 boundaryFaceIndices.append(cellI);
342 else if (feID == 44 || feID == 94)
344 // Quad. Save - used for patching later on.
348 IStringStream lineStr(line);
350 >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
351 boundaryFaces.append(cVerts);
352 boundaryFaceIndices.append(cellI);
354 else if (feID == 111)
360 IStringStream lineStr(line);
362 >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
364 cellVerts.append(cellShape(tet, cVerts, true));
365 cellMaterial.append(physProp);
366 addAndExtend(cellCorrespondence,cellI,cellMaterial.size()-1);
368 if (cellVerts.last().size() != cVerts.size())
370 Info<< "Line:" << is.lineNumber()
371 << " element:" << cellI
373 << " collapsed from " << cVerts << nl
374 << " to:" << cellVerts.last()
378 else if (feID == 112)
384 IStringStream lineStr(line);
386 >> cVerts[0] >> cVerts[1] >> cVerts[2]
387 >> cVerts[3] >> cVerts[4] >> cVerts[5];
389 cellVerts.append(cellShape(prism, cVerts, true));
390 cellMaterial.append(physProp);
391 addAndExtend(cellCorrespondence,cellI,cellMaterial.size()-1);
393 if (cellVerts.last().size() != cVerts.size())
395 Info<< "Line:" << is.lineNumber()
396 << " element:" << cellI
398 << " collapsed from " << cVerts << nl
399 << " to:" << cellVerts.last()
403 else if (feID == 115)
409 IStringStream lineStr(line);
411 >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3]
412 >> cVerts[4] >> cVerts[5] >> cVerts[6] >> cVerts[7];
414 cellVerts.append(cellShape(hex, cVerts, true));
415 cellMaterial.append(physProp);
416 addAndExtend(cellCorrespondence,cellI,cellMaterial.size()-1);
418 if (cellVerts.last().size() != cVerts.size())
420 Info<< "Line:" << is.lineNumber()
421 << " element:" << cellI
423 << " collapsed from " << cVerts << nl
424 << " to:" << cellVerts.last()
428 else if (feID == 118)
436 IStringStream lineStr(line);
438 >> cVerts[0] >> dummy >> cVerts[1] >> dummy >> cVerts[2];
442 IStringStream lineStr(line);
443 lineStr >> dummy>> cVerts[3];
446 cellVerts.append(cellShape(tet, cVerts, true));
447 cellMaterial.append(physProp);
448 addAndExtend(cellCorrespondence,cellI,cellMaterial.size()-1);
450 if (cellVerts.last().size() != cVerts.size())
452 Info<< "Line:" << is.lineNumber()
453 << " element:" << cellI
455 << " collapsed from " << cVerts << nl
456 << " to:" << cellVerts.last()
462 if (skippedElements.insert(feID))
464 IOWarningIn("readCells(IFstream&, label&)", is)
465 << "Cell type " << feID << " not supported" << endl;
467 is.getLine(line); // Do nothing
472 cellMaterial.shrink();
473 boundaryFaces.shrink();
474 boundaryFaceIndices.shrink();
475 cellCorrespondence.shrink();
477 Info<< "Read " << cellVerts.size() << " cells"
478 << " and " << boundaryFaces.size() << " boundary faces." << endl;
485 DynamicList<word>& patchNames,
486 DynamicList<labelList>& patchFaceIndices
489 Info<< "Starting reading patches at line " << is.lineNumber() << '.'
497 if (isSeparator(line))
502 IStringStream lineStr(line);
503 label group, constraintSet, restraintSet, loadSet, dofSet,
504 tempSet, contactSet, nFaces;
506 >> group >> constraintSet >> restraintSet >> loadSet
507 >> dofSet >> tempSet >> contactSet >> nFaces;
510 word groupName = string::validate<word>(line);
512 Info<< "For group " << group
513 << " named " << groupName
514 << " trying to read " << nFaces << " patch face indices."
517 labelList groupIndices(nFaces);
518 label groupType = -1;
521 while (nFaces < groupIndices.size())
524 IStringStream lineStr(line);
526 // Read one (for last face) or two entries from line.
528 if (nFaces == groupIndices.size()-1)
533 for (label i = 0; i < nRead; i++)
535 label tag, nodeLeaf, component;
537 lineStr >> groupType >> tag >> nodeLeaf >> component;
539 groupIndices[nFaces++] = tag;
547 patchNames.append(groupName);
548 patchFaceIndices.append(groupIndices);
552 IOWarningIn("readSets(..)", is)
553 << "When reading patches expect entity type code 8"
554 << nl << " Skipping group code " << groupType
560 patchFaceIndices.shrink();
565 // Read dof set (757)
569 DynamicList<word>& patchNames,
570 DynamicList<labelList>& dofVertices
573 Info<< "Starting reading contraints at line " << is.lineNumber() << '.'
580 IStringStream lineStr(line);
586 IStringStream lineStr(line);
587 patchNames.append(lineStr);
590 Info<< "For DOF set " << group
591 << " named " << patchNames.last()
592 << " trying to read vertex indices."
595 DynamicList<label> vertices;
601 if (isSeparator(line))
606 IStringStream lineStr(line);
610 vertices.append(pointI);
613 Info<< "For DOF set " << group
614 << " named " << patchNames.last()
615 << " read " << vertices.size() << " vertex indices." << endl;
617 dofVertices.append(vertices.shrink());
620 dofVertices.shrink();
624 // Returns -1 or group that all of the vertices of f are in,
625 label findPatch(const List<labelHashSet>& dofGroups, const face& f)
627 forAll(dofGroups, patchI)
629 if (dofGroups[patchI].found(f[0]))
631 bool allInGroup = true;
633 // Check rest of face
634 for (label fp = 1; fp < f.size(); fp++)
636 if (!dofGroups[patchI].found(f[fp]))
655 int main(int argc, char *argv[])
657 argList::noParallel();
658 argList::validArgs.append(".unv file");
659 argList::addBoolOption
662 "dump boundary faces as boundaryFaces.obj (for debugging)"
665 # include "setRootCase.H"
666 # include "createTime.H"
668 const fileName ideasName = args[1];
669 IFstream inFile(ideasName);
673 FatalErrorIn(args.executable())
674 << "Cannot open file " << ideasName
679 // Switch on additional debug info
680 const bool verbose = false; //true;
682 // Unit scale factors
683 scalar lengthScale = 1;
684 scalar forceScale = 1;
685 scalar tempScale = 1;
686 scalar tempOffset = 0;
689 DynamicList<point> points;
690 // Original unv point label
691 DynamicList<label> unvPointID;
694 DynamicList<cellShape> cellVerts;
695 DynamicList<label> cellMat;
696 DynamicList<label> cellCorrespondence;
699 DynamicList<label> boundaryFaceIndices;
700 DynamicList<face> boundaryFaces;
702 // Patch names and patchFace indices.
703 DynamicList<word> patchNames;
704 DynamicList<labelList> patchFaceIndices;
705 DynamicList<labelList> dofVertIndices;
708 while (inFile.good())
710 label tag = readTag(inFile);
717 Info<< "Processing tag:" << tag << endl;
737 readPoints(inFile, points, unvPointID);
773 Info<< "Skipping tag " << tag << " on line "
774 << inFile.lineNumber() << endl;
782 // Invert point numbering.
783 label maxUnvPoint = 0;
784 forAll(unvPointID, pointI)
786 maxUnvPoint = max(maxUnvPoint, unvPointID[pointI]);
788 labelList unvToFoam(invert(maxUnvPoint+1, unvPointID));
791 // Renumber vertex numbers on cells
793 forAll(cellVerts, cellI)
800 static_cast<labelList&>(cellVerts[cellI])
804 if (findIndex(foamVerts, -1) != -1)
806 FatalErrorIn(args.executable())
808 << " unv vertices " << cellVerts[cellI]
809 << " has some undefined vertices " << foamVerts
810 << abort(FatalError);
813 // Bit nasty: replace vertex list.
814 cellVerts[cellI].transfer(foamVerts);
817 // Renumber vertex numbers on boundaryFaces
819 forAll(boundaryFaces, bFaceI)
821 labelList foamVerts(renumber(unvToFoam, boundaryFaces[bFaceI]));
823 if (findIndex(foamVerts, -1) != -1)
825 FatalErrorIn(args.executable())
826 << "Boundary face " << bFaceI
827 << " unv vertices " << boundaryFaces[bFaceI]
828 << " has some undefined vertices " << foamVerts
829 << abort(FatalError);
832 // Bit nasty: replace vertex list.
833 boundaryFaces[bFaceI].transfer(foamVerts);
838 // Patchify = create patchFaceVerts for use in cellShape construction
839 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
841 // Works in one of two modes. Either has read boundaryFaces which
842 // just need to be sorted according to patch. Or has read point constraint
843 // sets (dofVertIndices).
845 List<faceList> patchFaceVerts;
847 labelList own(boundaryFaces.size(), -1);
848 labelList nei(boundaryFaces.size(), -1);
849 HashTable<label, label> faceToCell[2];
852 HashTable<label, face, Hash<face> > faceToFaceID(boundaryFaces.size());
853 forAll(boundaryFaces, faceI)
855 SortableList<label> sortedVerts(boundaryFaces[faceI]);
856 faceToFaceID.insert(face(sortedVerts), faceI);
859 forAll(cellVerts, cellI)
861 faceList faces = cellVerts[cellI].faces();
864 SortableList<label> sortedVerts(faces[i]);
865 HashTable<label, face, Hash<face> >::const_iterator fnd =
866 faceToFaceID.find(face(sortedVerts));
868 if (fnd != faceToFaceID.end())
871 int stat = face::compare(faces[i], boundaryFaces[faceI]);
875 // Same orientation. Cell is owner.
880 // Opposite orientation. Cell is neighbour.
890 if (own[faceI] == -1 && nei[faceI] != -1)
892 // Boundary face with incorrect orientation
893 boundaryFaces[faceI] = boundaryFaces[faceI].reverseFace();
894 Swap(own[faceI], nei[faceI]);
900 Info << "Found " << nReverse << " reversed boundary faces out of "
901 << boundaryFaces.size() << endl;
908 if (own[faceI] != -1 && nei[faceI] != -1)
916 Info << "Of " << boundaryFaces.size() << " so-called"
917 << " boundary faces " << cnt << " belong to two cells "
918 << "and are therefore internal" << endl;
922 HashTable<labelList,word> cellZones;
923 HashTable<labelList,word> faceZones;
924 List<bool> isAPatch(patchNames.size(),true);
926 if (dofVertIndices.size())
928 // Use the vertex constraints to patch. Is of course bit dodgy since
929 // face goes on patch if all its vertices are on a constraint.
930 // Note: very inefficient since goes through all faces (including
931 // internal ones) twice. Should do a construct without patches
932 // and then repatchify.
934 Info<< "Using " << dofVertIndices.size()
935 << " DOF sets to detect boundary faces."<< endl;
937 // Renumber vertex numbers on contraints
938 forAll(dofVertIndices, patchI)
940 inplaceRenumber(unvToFoam, dofVertIndices[patchI]);
944 // Build labelHashSet of points per dofGroup/patch
945 List<labelHashSet> dofGroups(dofVertIndices.size());
947 forAll(dofVertIndices, patchI)
949 const labelList& foamVerts = dofVertIndices[patchI];
953 dofGroups[patchI].insert(foamVerts[i]);
957 List<DynamicList<face> > dynPatchFaces(dofVertIndices.size());
959 forAll(cellVerts, cellI)
961 const cellShape& shape = cellVerts[cellI];
963 const faceList shapeFaces(shape.faces());
965 forAll(shapeFaces, i)
967 label patchI = findPatch(dofGroups, shapeFaces[i]);
971 dynPatchFaces[patchI].append(shapeFaces[i]);
977 patchFaceVerts.setSize(dynPatchFaces.size());
979 forAll(dynPatchFaces, patchI)
981 patchFaceVerts[patchI].transfer(dynPatchFaces[patchI]);
986 // Use the boundary faces.
988 // Construct the patch faces by sorting the boundaryFaces according to
990 patchFaceVerts.setSize(patchFaceIndices.size());
992 Info<< "Sorting boundary faces according to group (patch)" << endl;
994 // make sure that no face is used twice on the boundary
995 // (possible for boundary-only faceZones)
996 labelHashSet alreadyOnBoundary;
998 // Construct map from boundaryFaceIndices
999 Map<label> boundaryFaceToIndex(boundaryFaceIndices.size());
1001 forAll(boundaryFaceIndices, i)
1003 boundaryFaceToIndex.insert(boundaryFaceIndices[i], i);
1006 forAll(patchFaceVerts, patchI)
1008 Info << patchI << ": " << patchNames[patchI] << " is " << flush;
1010 faceList& patchFaces = patchFaceVerts[patchI];
1011 const labelList& faceIndices = patchFaceIndices[patchI];
1013 patchFaces.setSize(faceIndices.size());
1015 bool duplicateFaces = false;
1018 forAll(patchFaces, i)
1020 if (boundaryFaceToIndex.found(faceIndices[i]))
1022 label bFaceI = boundaryFaceToIndex[faceIndices[i]];
1024 if (own[bFaceI] != -1 && nei[bFaceI] == -1)
1026 patchFaces[cnt] = boundaryFaces[bFaceI];
1028 if (alreadyOnBoundary.found(bFaceI))
1030 duplicateFaces = true;
1036 if (cnt != patchFaces.size() || duplicateFaces)
1038 isAPatch[patchI] = false;
1042 if (cnt != patchFaces.size())
1044 WarningIn(args.executable())
1045 << "For patch " << patchI << " there were "
1046 << patchFaces.size()-cnt
1047 << " faces not used because they seem"
1048 << " to be internal. "
1049 << "This seems to be a face or a cell-zone"
1054 WarningIn(args.executable())
1056 << patchI << " has faces that are already "
1057 << " in use on other boundary-patches,"
1058 << " Assuming faceZoneset." << endl;
1062 patchFaces.setSize(0); // Assume that this is no patch at all
1064 if (cellCorrespondence[faceIndices[0]] >= 0)
1066 Info << "cellZone" << endl;
1067 labelList theCells(faceIndices.size());
1068 forAll(faceIndices, i)
1070 if (cellCorrespondence[faceIndices[0]] < 0)
1072 FatalErrorIn(args.executable())
1073 << "The face index " << faceIndices[i]
1074 << " was not found amongst the cells."
1075 << " This kills the theory that "
1076 << patchNames[patchI] << " is a cell zone"
1078 << abort(FatalError);
1080 theCells[i] = cellCorrespondence[faceIndices[i]];
1082 cellZones.insert(patchNames[patchI], theCells);
1086 Info << "faceZone" << endl;
1087 labelList theFaces(faceIndices.size());
1088 forAll(faceIndices, i)
1090 theFaces[i] = boundaryFaceToIndex[faceIndices[i]];
1092 faceZones.insert(patchNames[patchI],theFaces);
1097 Info << "patch" << endl;
1099 forAll(patchFaces, i)
1101 label bFaceI = boundaryFaceToIndex[faceIndices[i]];
1102 alreadyOnBoundary.insert(bFaceI);
1108 pointField polyPoints;
1109 polyPoints.transfer(points);
1111 // Length scaling factor
1112 polyPoints /= lengthScale;
1115 // For debugging: dump boundary faces as OBJ surface mesh
1116 if (args.optionFound("dump"))
1118 Info<< "Writing boundary faces to OBJ file boundaryFaces.obj"
1121 // Create globally numbered surface
1122 meshedSurface rawSurface
1124 xferCopy(polyPoints),
1125 xferCopyTo< faceList >(boundaryFaces)
1128 // Write locally numbered surface
1131 xferCopy(rawSurface.localPoints()),
1132 xferCopy(rawSurface.localFaces())
1133 ).write(runTime.path()/"boundaryFaces.obj");
1137 Info<< "\nConstructing mesh with non-default patches of size:" << nl;
1138 DynamicList<word> usedPatchNames;
1139 DynamicList<faceList> usedPatchFaceVerts;
1141 forAll(patchNames, patchI)
1143 if (isAPatch[patchI])
1145 Info<< " " << patchNames[patchI] << '\t'
1146 << patchFaceVerts[patchI].size() << nl;
1147 usedPatchNames.append(patchNames[patchI]);
1148 usedPatchFaceVerts.append(patchFaceVerts[patchI]);
1151 usedPatchNames.shrink();
1152 usedPatchFaceVerts.shrink();
1163 polyMesh::defaultRegion,
1167 xferMove(polyPoints),
1169 usedPatchFaceVerts, // boundaryFaces,
1170 usedPatchNames, // boundaryPatchNames,
1171 wordList(patchNames.size(), polyPatch::typeName), // boundaryPatchTypes,
1172 "defaultFaces", // defaultFacesName
1173 polyPatch::typeName, // defaultFacesType,
1174 wordList(0) // boundaryPatchPhysicalTypes
1178 if (faceZones.size() > 0 || cellZones.size() > 0)
1180 Info << "Adding cell and face zones" << endl;
1182 List<pointZone*> pZones(0);
1183 List<faceZone*> fZones(faceZones.size());
1184 List<cellZone*> cZones(cellZones.size());
1186 if (cellZones.size() > 0)
1188 forAll(cellZones.toc(), cnt)
1190 word name = cellZones.toc()[cnt];
1191 Info<< " Cell Zone " << name << " " << tab
1192 << cellZones[name].size() << endl;
1194 cZones[cnt] = new cellZone
1203 if (faceZones.size() > 0)
1205 const labelList& own = mesh.faceOwner();
1206 const labelList& nei = mesh.faceNeighbour();
1207 const pointField& centers = mesh.faceCentres();
1208 const pointField& points = mesh.points();
1210 forAll(faceZones.toc(), cnt)
1212 word name = faceZones.toc()[cnt];
1213 const labelList& oldIndizes = faceZones[name];
1214 labelList indizes(oldIndizes.size());
1216 Info<< " Face Zone " << name << " " << tab
1217 << oldIndizes.size() << endl;
1221 const label old = oldIndizes[i];
1223 label c1 = -1, c2 = -1;
1224 if (faceToCell[0].found(old))
1226 c1 = faceToCell[0][old];
1228 if (faceToCell[1].found(old))
1230 c2 = faceToCell[1][old];
1240 // Boundary face is part of the faceZone
1245 const face& f = boundaryFaces[old];
1246 if (mag(centers[j]- f.centre(points)) < SMALL)
1260 (c1 == own[j] && c2 == nei[j])
1261 || (c2 == own[j] && c1 == nei[j])
1269 assert(noveau > -1);
1270 indizes[i] = noveau;
1272 fZones[cnt] = new faceZone
1274 faceZones.toc()[cnt],
1276 boolList(indizes.size(),false),
1282 mesh.addZones(pZones, fZones, cZones);
1289 Info<< "End\n" << endl;
1295 // ************************************************************************* //