void Foam::patchInjectionBase::updateMesh(const polyMesh& mesh) { // Set/cache the injector cells const polyPatch& patch = mesh.boundaryMesh()[patchId_]; const pointField& points = patch.points(); cellOwners_ = patch.faceCells(); // Triangulate the patch faces and create addressing DynamicList<label> triToFace(2*patch.size()); DynamicList<scalar> triMagSf(2*patch.size()); DynamicList<face> triFace(2*patch.size()); DynamicList<face> tris(5); // Set zero value at the start of the tri area list triMagSf.append(0.0); forAll(patch, facei) { const face& f = patch[facei]; tris.clear(); f.triangles(points, tris); forAll(tris, i) { triToFace.append(facei); triFace.append(tris[i]); triMagSf.append(tris[i].mag(points)); } }
void Foam::momentOfInertia::massPropertiesSolid ( const triSurface& surf, scalar density, scalar& mass, vector& cM, tensor& J ) { triFaceList faces(surf.size()); forAll(surf, i) { faces[i] = triFace(surf[i]); }
forAll(cFaces, cFacei) { label facei = cFaces[cFacei]; const face& f = mesh_.faces()[facei]; // Check pyramids cut forAll(f, fp) { if ((pVals_[f[fp]] < iso_) != cellLower) { edgeCut = true; break; } } if (edgeCut) { break; } label fp0 = tetBasePtIs_[facei]; // Fall back for problem decompositions if (fp0 < 0) { fp0 = 0; } label fp = f.fcIndex(fp0); for (label i = 2; i < f.size(); i++) { label nextFp = f.fcIndex(fp); if (isTriCut(triFace(f[fp0], f[fp], f[nextFp]), pVals_)) { edgeCut = true; break; } fp = nextFp; } if (edgeCut) { break; } }
void Foam::MeshedSurface<triFace>::transcribe(MeshedSurface<face>& surf) { // first triangulate surf.triangulate(); this->storedPoints().transfer(surf.storedPoints()); this->storedZones().transfer(surf.storedZones()); // transcribe from face -> triFace List<face>& origFaces = surf.storedFaces(); List<triFace> newFaces(origFaces.size()); forAll(origFaces, facei) { newFaces[facei] = triFace ( static_cast<const labelUList&>(origFaces[facei]) ); }
bool Foam::fileFormats::NASsurfaceFormat<Face>::read ( const fileName& filename ) { const bool mustTriangulate = this->isTri(); this->clear(); IFstream is(filename); if (!is.good()) { FatalErrorIn ( "fileFormats::NASsurfaceFormat::read(const fileName&)" ) << "Cannot read file " << filename << exit(FatalError); } // Nastran index of points DynamicList<label> pointId; DynamicList<point> dynPoints; DynamicList<Face> dynFaces; DynamicList<label> dynZones; DynamicList<label> dynSizes; Map<label> lookup; // assume the types are not intermixed // leave faces that didn't have a group in 0 bool sorted = true; label zoneI = 0; // Name for face group Map<word> nameLookup; // Ansa tags. Denoted by $ANSA_NAME. // These will appear just before the first use of a type. // We read them and store the PSHELL types which are used to name // the zones. label ansaId = -1; word ansaType, ansaName; // A single warning per unrecognized command HashSet<word> unhandledCmd; while (is.good()) { string line; is.getLine(line); // Ansa extension if (line.substr(0, 10) == "$ANSA_NAME") { string::size_type sem0 = line.find (';', 0); string::size_type sem1 = line.find (';', sem0+1); string::size_type sem2 = line.find (';', sem1+1); if ( sem0 != string::npos && sem1 != string::npos && sem2 != string::npos ) { ansaId = readLabel ( IStringStream(line.substr(sem0+1, sem1-sem0-1))() ); ansaType = line.substr(sem1+1, sem2-sem1-1); string rawName; is.getLine(rawName); if (rawName[rawName.size()-1] == '\r') { rawName = rawName.substr(1, rawName.size()-2); } else { rawName = rawName.substr(1, rawName.size()-1); } string::stripInvalid<word>(rawName); ansaName = rawName; // Info<< "ANSA tag for NastranID:" << ansaId // << " of type " << ansaType // << " name " << ansaName << endl; } } // Hypermesh extension // $HMNAME COMP 1"partName" if ( line.substr(0, 12) == "$HMNAME COMP" && line.find ('"') != string::npos ) { label groupId = readLabel ( IStringStream(line.substr(16, 16))() ); IStringStream lineStream(line.substr(32)); string rawName; lineStream >> rawName; string::stripInvalid<word>(rawName); word groupName(rawName); nameLookup.insert(groupId, groupName); // Info<< "group " << groupId << " => " << groupName << endl; } // Skip empty or comment if (line.empty() || line[0] == '$') { continue; } // Check if character 72 is continuation if (line.size() > 72 && line[72] == '+') { line = line.substr(0, 72); while (true) { string buf; is.getLine(buf); if (buf.size() > 72 && buf[72] == '+') { line += buf.substr(8, 64); } else { line += buf.substr(8, buf.size()-8); break; } } } // Read first word IStringStream lineStream(line); word cmd; lineStream >> cmd; if (cmd == "CTRIA3") { triFace fTri; label groupId = readLabel(IStringStream(line.substr(16,8))()); fTri[0] = readLabel(IStringStream(line.substr(24,8))()); fTri[1] = readLabel(IStringStream(line.substr(32,8))()); fTri[2] = readLabel(IStringStream(line.substr(40,8))()); // Convert groupID into zoneId Map<label>::const_iterator fnd = lookup.find(groupId); if (fnd != lookup.end()) { if (zoneI != fnd()) { // pshell types are intermixed sorted = false; } zoneI = fnd(); } else { zoneI = dynSizes.size(); lookup.insert(groupId, zoneI); dynSizes.append(0); // Info<< "zone" << zoneI << " => group " << groupId <<endl; } dynFaces.append(fTri); dynZones.append(zoneI); dynSizes[zoneI]++; } else if (cmd == "CQUAD4") { face fQuad(4); UList<label>& f = static_cast<UList<label>&>(fQuad); label groupId = readLabel(IStringStream(line.substr(16,8))()); fQuad[0] = readLabel(IStringStream(line.substr(24,8))()); fQuad[1] = readLabel(IStringStream(line.substr(32,8))()); fQuad[2] = readLabel(IStringStream(line.substr(40,8))()); fQuad[3] = readLabel(IStringStream(line.substr(48,8))()); // Convert groupID into zoneId Map<label>::const_iterator fnd = lookup.find(groupId); if (fnd != lookup.end()) { if (zoneI != fnd()) { // pshell types are intermixed sorted = false; } zoneI = fnd(); } else { zoneI = dynSizes.size(); lookup.insert(groupId, zoneI); dynSizes.append(0); // Info<< "zone" << zoneI << " => group " << groupId <<endl; } if (mustTriangulate) { dynFaces.append(triFace(f[0], f[1], f[2])); dynFaces.append(triFace(f[0], f[2], f[3])); dynZones.append(zoneI); dynZones.append(zoneI); dynSizes[zoneI] += 2; } else { dynFaces.append(Face(f)); dynZones.append(zoneI); dynSizes[zoneI]++; } } else if (cmd == "GRID") { label index = readLabel(IStringStream(line.substr(8,8))()); scalar x = parseNASCoord(line.substr(24, 8)); scalar y = parseNASCoord(line.substr(32, 8)); scalar z = parseNASCoord(line.substr(40, 8)); pointId.append(index); dynPoints.append(point(x, y, z)); } else if (cmd == "GRID*") { // Long format is on two lines with '*' continuation symbol // on start of second line. // Typical line (spaces compacted) // GRID* 126 0 -5.55999875E+02 -5.68730474E+02 // * 2.14897901E+02 label index = readLabel(IStringStream(line.substr(8,16))()); scalar x = parseNASCoord(line.substr(40, 16)); scalar y = parseNASCoord(line.substr(56, 16)); is.getLine(line); if (line[0] != '*') { FatalErrorIn ( "fileFormats::NASsurfaceFormat::read(const fileName&)" ) << "Expected continuation symbol '*' when reading GRID*" << " (double precision coordinate) format" << nl << "Read:" << line << nl << "File:" << is.name() << " line:" << is.lineNumber() << exit(FatalError); } scalar z = parseNASCoord(line.substr(8, 16)); pointId.append(index); dynPoints.append(point(x, y, z)); } else if (cmd == "PSHELL") { // pshell type for zone names with the Ansa extension label groupId = readLabel(IStringStream(line.substr(8,8))()); if (groupId == ansaId && ansaType == "PSHELL") { nameLookup.insert(ansaId, ansaName); // Info<< "group " << groupId << " => " << ansaName << endl; } } else if (unhandledCmd.insert(cmd)) { Info<< "Unhandled Nastran command " << line << nl << "File:" << is.name() << " line:" << is.lineNumber() << endl; } }
forAll(faceLst, faceI) { label e0Label, e1Label, e2Label; label zoneI = 0; line = this->getLineNoComment(is); { IStringStream lineStream(line); lineStream >> e0Label >> e1Label >> e2Label; // Optional zone number: read first, then check state on stream if (lineStream) { label num; lineStream >> num; if (!lineStream.bad()) { zoneI = num; if (maxZone < zoneI) { maxZone = zoneI; } } } } // Determine ordering of edges e0, e1 // common: common vertex, shared by e0 and e1 // e0Far: vertex on e0 which is not common // e1Far: vertex on e1 which is not common const edge& e0 = edges[e0Label - 1]; const edge& e1 = edges[e1Label - 1]; const edge& e2 = edges[e2Label - 1]; label common01 = e0.commonVertex(e1); if (common01 == -1) { FatalErrorIn ( "fileFormats::GTSsurfaceFormat::read(const fileName&)" ) << "Edges 0 and 1 of triangle " << faceI << " do not share a point.\n" << " edge0:" << e0 << nl << " edge1:" << e1 << exit(FatalError); } label e0Far = e0.otherVertex(common01); label e1Far = e1.otherVertex(common01); label common12 = e1.commonVertex(e2); if (common12 == -1) { FatalErrorIn ( "fileFormats::GTSsurfaceFormat::read(const fileName&)" ) << "Edges 1 and 2 of triangle " << faceI << " do not share a point.\n" << " edge1:" << e1 << nl << " edge2:" << e2 << exit(FatalError); } label e2Far = e2.otherVertex(common12); // Does edge2 sit between edge1 and 0? if (common12 != e1Far || e2Far != e0Far) { FatalErrorIn ( "fileFormats::GTSsurfaceFormat::read(const fileName&)" ) << "Edges of triangle " << faceI << " reference more than three points.\n" << " edge0:" << e0 << nl << " edge1:" << e1 << nl << " edge2:" << e2 << nl << exit(FatalError); } faceLst[faceI] = triFace(e0Far, common01, e1Far); zoneIds[faceI] = zoneI; }