void Foam::domainDecomposition::addInterProcFace ( const label facei, const label ownerProc, const label nbrProc, List<Map<label> >& nbrToInterPatch, List<DynamicList<DynamicList<label> > >& interPatchFaces ) const { Map<label>::iterator patchIter = nbrToInterPatch[ownerProc].find(nbrProc); // Introduce turning index only for internal faces (are duplicated). label ownerIndex = facei+1; label nbrIndex = -(facei+1); if (patchIter != nbrToInterPatch[ownerProc].end()) { // Existing interproc patch. Add to both sides. label toNbrProcPatchI = patchIter(); interPatchFaces[ownerProc][toNbrProcPatchI].append(ownerIndex); if (isInternalFace(facei)) { label toOwnerProcPatchI = nbrToInterPatch[nbrProc][ownerProc]; interPatchFaces[nbrProc][toOwnerProcPatchI].append(nbrIndex); } } else { // Create new interproc patches. label toNbrProcPatchI = nbrToInterPatch[ownerProc].size(); nbrToInterPatch[ownerProc].insert(nbrProc, toNbrProcPatchI); DynamicList<label> oneFace; oneFace.append(ownerIndex); interPatchFaces[ownerProc].append(oneFace); if (isInternalFace(facei)) { label toOwnerProcPatchI = nbrToInterPatch[nbrProc].size(); nbrToInterPatch[nbrProc].insert(ownerProc, toOwnerProcPatchI); oneFace.clear(); oneFace.append(nbrIndex); interPatchFaces[nbrProc].append(oneFace); } } }
void Foam::meshTriangulation::getFaces ( const primitiveMesh& mesh, const boolList& includedCell, boolList& faceIsCut, label& nFaces, label& nInternalFaces ) { // All faces to be triangulated. faceIsCut.setSize(mesh.nFaces()); faceIsCut = false; nFaces = 0; nInternalFaces = 0; forAll(includedCell, cellI) { // Include faces of cut cells only. if (includedCell[cellI]) { const labelList& cFaces = mesh.cells()[cellI]; forAll(cFaces, i) { label faceI = cFaces[i]; if (!faceIsCut[faceI]) { // First visit of face. nFaces++; faceIsCut[faceI] = true; // See if would become internal or external face if (isInternalFace(mesh, includedCell, faceI)) { nInternalFaces++; } } } } }
void Foam::simpleEngineTopoFvMesh::addZonesAndModifiers() { // Add the zones and mesh modifiers to operate piston and valve motion if ( pointZones().size() > 0 || faceZones().size() > 0 || cellZones().size() > 0 ) { Info<< "void Foam::simpleEngineTopoFvMesh::addZonesAndModifiers() : " << "Zones and modifiers already present. Skipping." << endl; if (topoChanger_.size() == 0) { FatalErrorIn ( "void simpleEngineTopoFvMesh::addZonesAndModifiers()" ) << "Mesh modifiers not read properly" << abort(FatalError); } return; } Info<< "Time = " << engineTime_.theta() << endl << "Adding zones to the engine mesh" << endl; List<pointZone*> pz(nValves()); List<faceZone*> fz(6*nValves() + 1); List<cellZone*> cz(0); label nPointZones = 0; label nFaceZones = 0; for (label valveI = 0; valveI < nValves(); valveI++) { // If both sides of the interface exist, add sliding interface // for a valve if ( valves_[valveI].curtainInCylinderPatchID().active() && valves_[valveI].curtainInPortPatchID().active() ) { Info<< "Adding sliding interface zones for curtain of valve " << valveI + 1 << endl; pz[nPointZones] = new pointZone ( "cutPointsV" + Foam::name(valveI + 1), labelList(0), nPointZones, pointZones() ); nPointZones++; const polyPatch& cylCurtain = boundaryMesh() [valves_[valveI].curtainInCylinderPatchID().index()]; labelList cylCurtainLabels(cylCurtain.size(), cylCurtain.start()); forAll (cylCurtainLabels, i) { cylCurtainLabels[i] += i; } fz[nFaceZones] = new faceZone ( "curtainCylZoneV" + Foam::name(valveI + 1), cylCurtainLabels, boolList(cylCurtainLabels.size(), false), nFaceZones, faceZones() ); nFaceZones++; const polyPatch& portCurtain = boundaryMesh() [valves_[valveI].curtainInPortPatchID().index()]; labelList portCurtainLabels ( portCurtain.size(), portCurtain.start() ); forAll (portCurtainLabels, i) { portCurtainLabels[i] += i; } fz[nFaceZones] = new faceZone ( "curtainPortZoneV" + Foam::name(valveI + 1), portCurtainLabels, boolList(portCurtainLabels.size(), false), nFaceZones, faceZones() ); nFaceZones++; // Add empty zone for cut faces fz[nFaceZones] = new faceZone ( "cutFaceZoneV" + Foam::name(valveI + 1), labelList(0), boolList(0, false), nFaceZones, faceZones() ); nFaceZones++; // Create a detach zone if ( valves_[valveI].detachInCylinderPatchID().active() && valves_[valveI].detachInPortPatchID().active() && valves_[valveI].detachFaces().size() > 0 ) { Info<< "Adding detach boundary for valve " << valveI + 1 << endl; const vectorField& areas = Sf().internalField(); const labelList& df = valves_[valveI].detachFaces(); boolList flip(df.size(), false); const vector& pistonAxis = piston().cs().axis(); forAll (df, dfI) { if (isInternalFace(df[dfI])) { if ((areas[df[dfI]] & pistonAxis) > 0) { flip[dfI] = true; } } else { FatalErrorIn ( "void simpleEngineTopoFvMesh::" "addZonesAndModifiers()" ) << "found boundary face in valve detach definition" << " for valve " << valveI + 1 << ". This is not allowed. Detach faces: " << df << " nInternalFaces: " << nInternalFaces() << abort(FatalError); } } // Add detach face zone fz[nFaceZones] = new faceZone ( "detachFaceZoneV" + Foam::name(valveI + 1), df, flip, nFaceZones, faceZones() ); nFaceZones++; } }
bool Foam::polyMesh::checkFaceSkewness ( const pointField& points, const vectorField& fCtrs, const vectorField& fAreas, const vectorField& cellCtrs, const bool report, const bool detailedReport, labelHashSet* setPtr ) const { if (debug) { Info<< "bool polyMesh::checkFaceSkewnesss(" << "const bool, labelHashSet*) const: " << "checking face skewness" << endl; } const labelList& own = faceOwner(); const labelList& nei = faceNeighbour(); // Warn if the skew correction vector is more than skewWarning times // larger than the face area vector tmp<scalarField> tskew = polyMeshTools::faceSkewness ( *this, points, fCtrs, fAreas, cellCtrs ); const scalarField& skew = tskew(); scalar maxSkew = max(skew); label nWarnSkew = 0; // Statistics only for all faces except slave coupled faces PackedBoolList isMasterFace(syncTools::getMasterFaces(*this)); forAll(skew, faceI) { // Check if the skewness vector is greater than the PN vector. // This does not cause trouble but is a good indication of a poor mesh. if (skew[faceI] > skewThreshold_) { if (setPtr) { setPtr->insert(faceI); } if (detailedReport && nWarnSkew == 0) { // Non-orthogonality greater than 90 deg if (isInternalFace(faceI)) { WarningIn ( "polyMesh::checkFaceSkewnesss" "(const pointField&, const bool) const" ) << "Severe skewness " << skew[faceI] << " for face " << faceI << " between cells " << own[faceI] << " and " << nei[faceI]; } else { WarningIn ( "polyMesh::checkFaceSkewnesss" "(const pointField&, const bool) const" ) << "Severe skewness " << skew[faceI] << " for boundary face " << faceI << " on cell " << own[faceI]; } } if (isMasterFace[faceI]) { nWarnSkew++; } } } reduce(maxSkew, maxOp<scalar>()); reduce(nWarnSkew, sumOp<label>()); if (nWarnSkew > 0) { if (debug || report) { Info<< " ***Max skewness = " << maxSkew << ", " << nWarnSkew << " highly skew faces detected" " which may impair the quality of the results" << endl; } return true; } else { if (debug || report) { Info<< " Max skewness = " << maxSkew << " OK." << endl; } return false; } }