void Foam::fvMesh::makeSf() const { if (debug) { InfoInFunction << "Assembling face areas" << endl; } // It is an error to attempt to recalculate // if the pointer is already set if (SfPtr_) { FatalErrorInFunction << "face areas already exist" << abort(FatalError); } SfPtr_ = new slicedSurfaceVectorField ( IOobject ( "S", pointsInstance(), meshSubDir, *this, IOobject::NO_READ, IOobject::NO_WRITE, false ), *this, dimArea, faceAreas() ); }
void Foam::processorCyclicPolyPatch::calcGeometry(PstreamBuffers& pBufs) { // Receive and initialise processorPolyPatch data processorPolyPatch::calcGeometry(pBufs); if (Pstream::parRun()) { // Where do we store the calculated transformation? // - on the processor patch? // - on the underlying cyclic patch? // - or do we not auto-calculate the transformation but // have option of reading it. // Update underlying cyclic halves. Need to do both since only one // half might be present as a processorCyclic. coupledPolyPatch& pp = const_cast<coupledPolyPatch&>(referPatch()); pp.calcGeometry ( *this, faceCentres(), faceAreas(), faceCellCentres(), neighbFaceCentres(), neighbFaceAreas(), neighbFaceCellCentres() ); if (isA<cyclicPolyPatch>(pp)) { const cyclicPolyPatch& cpp = refCast<const cyclicPolyPatch>(pp); const_cast<cyclicPolyPatch&>(cpp.neighbPatch()).calcGeometry ( *this, neighbFaceCentres(), neighbFaceAreas(), neighbFaceCellCentres(), faceCentres(), faceAreas(), faceCellCentres() ); } } }
void Foam::processorPolyPatch::initGeometry(PstreamBuffers& pBufs) { if (Pstream::parRun()) { UOPstream toNeighbProc(neighbProcNo(), pBufs); toNeighbProc << faceCentres() << faceAreas() << faceCellCentres(); } }
void Foam::cyclicACMIPolyPatch::initPatchFaceAreas() const { if (!empty() && faceAreas0_.empty()) { faceAreas0_ = faceAreas(); } const cyclicACMIPolyPatch& nbrACMI = refCast<const cyclicACMIPolyPatch>(this->neighbPatch()); if (!nbrACMI.empty() && nbrACMI.faceAreas0().empty()) { nbrACMI.initPatchFaceAreas(); } }
void Foam::processorPolyPatch::initGeometry() { if (Pstream::parRun()) { OPstream toNeighbProc ( Pstream::blocking, neighbProcNo(), 3*(sizeof(label) + size()*sizeof(vector) + sizeof(scalar)) ); toNeighbProc << faceCentres() << faceAreas() << faceCellCentres(); } }
// Is the point in the cell bool Foam::primitiveMesh::pointInCell(const point& p, label celli) const { const labelList& f = cells()[celli]; const labelList& owner = this->faceOwner(); const vectorField& cf = faceCentres(); const vectorField& Sf = faceAreas(); bool inCell = true; forAll(f, facei) { label nFace = f[facei]; vector proj = p - cf[nFace]; vector normal = Sf[nFace]; if (owner[nFace] != celli) { normal = -normal; } inCell = inCell && ((normal & proj) <= 0); }
void Foam::cyclicACMIPolyPatch::resetAMI ( const AMIPatchToPatchInterpolation::interpolationMethod& ) const { if (owner()) { const polyPatch& nonOverlapPatch = this->nonOverlapPatch(); initPatchFaceAreas(); // reset patch face areas based on original patch for AMI calculation vectorField::subField Sf = faceAreas(); vectorField::subField noSf = nonOverlapPatch.faceAreas(); forAll(Sf, faceI) { Sf[faceI] = faceAreas0_[faceI]; noSf[faceI] = faceAreas0_[faceI]; } // calculate the AMI using partial face-area-weighted cyclicAMIPolyPatch::resetAMI ( AMIPatchToPatchInterpolation::imPartialFaceAreaWeight ); srcMask_ = min(scalar(1) - tolerance_, max(tolerance_, AMI().srcWeightsSum())); tgtMask_ = min(scalar(1) - tolerance_, max(tolerance_, AMI().tgtWeightsSum())); forAll(Sf, faceI) { Sf[faceI] *= srcMask_[faceI]; noSf[faceI] *= 1.0 - srcMask_[faceI]; }
void Foam::primitiveMesh::calcCellCentresAndVols() const { if (debug) { Pout<< "primitiveMesh::calcCellCentresAndVols() : " << "Calculating cell centres and cell volumes" << endl; } // It is an error to attempt to recalculate cellCentres // if the pointer is already set if (cellCentresPtr_ || cellVolumesPtr_) { FatalErrorIn("primitiveMesh::calcCellCentresAndVols() const") << "Cell centres or cell volumes already calculated" << abort(FatalError); } // set the accumulated cell centre to zero vector cellCentresPtr_ = new vectorField(nCells()); vectorField& cellCtrs = *cellCentresPtr_; // Initialise cell volumes to 0 cellVolumesPtr_ = new scalarField(nCells()); scalarField& cellVols = *cellVolumesPtr_; // Make centres and volumes makeCellCentresAndVols(faceCentres(), faceAreas(), cellCtrs, cellVols); if (debug) { Pout<< "primitiveMesh::calcCellCentresAndVols() : " << "Finished calculating cell centres and cell volumes" << endl; } }
void Foam::layerAR::addZonesAndModifiers() { // Add the zones and mesh modifiers to operate piston motion if ( pointZones().size() > 0 || faceZones().size() > 0 || cellZones().size() > 0 ) { Info<< "void layerAR::addZonesAndModifiers() : " << "Zones and modifiers already present. Skipping." << endl; if (topoChanger_.size() == 0) { FatalErrorIn ( "void layerAR::addZonesAndModifiers()" ) << "Mesh modifiers not read properly" << abort(FatalError); } setVirtualPistonPosition(); checkAndCalculate(); return; } checkAndCalculate(); Info<< "Time = " << engTime().theta() << endl << "Adding zones to the engine mesh" << endl; //fz = 1: faces where layer are added/removed //pz = 2: points below the virtual piston faces and head points List<pointZone*> pz(2); List<faceZone*> fz(1); List<cellZone*> cz(0); label nPointZones = 0; label nFaceZones = 0; // Add the piston zone if (piston().patchID().active() && offSet() > SMALL) { // Piston position label pistonPatchID = piston().patchID().index(); scalar zPist = max(boundary()[pistonPatchID].patch().localPoints()).z(); scalar zPistV = zPist + offSet(); labelList zone1(faceCentres().size()); boolList flipZone1(faceCentres().size(), false); label nZoneFaces1 = 0; bool foundAtLeastOne = false; scalar zHigher = GREAT; scalar dh = GREAT; scalar dl = GREAT; forAll (faceCentres(), faceI) { scalar zc = faceCentres()[faceI].z(); vector n = faceAreas()[faceI]/mag(faceAreas()[faceI]); scalar dd = n & vector(0,0,1); if (dd > 0.1) { if (zPistV - zc > 0 && zPistV - zc < dl) { dl = zPistV - zc; } if (zc - zPistV > 0 && zc - zPistV < dh) { zHigher = zc; dh = zc - zHigher; } if ( zc > zPistV - delta() && zc < zPistV + delta() ) { foundAtLeastOne = true; if ((faceAreas()[faceI] & vector(0,0,1)) < 0) { flipZone1[nZoneFaces1] = true; } zone1[nZoneFaces1] = faceI; nZoneFaces1++; } } }
void Foam::simpleTwoStroke::addZonesAndModifiers() { // Add the zones and mesh modifiers to operate piston motion if ( pointZones().size() > 0 || faceZones().size() > 0 || cellZones().size() > 0 ) { Info<< "Time = " << engTime().theta() << endl; Info<< "void simpleTwoStroke::addZonesAndModifiers() : " << "Zones and modifiers already present. Skipping." << endl; if (topoChanger_.size() == 0) { FatalErrorIn ( "void simpleTwoStroke::addZonesAndModifiers()" ) << "Mesh modifiers not read properly" << abort(FatalError); } setVirtualPistonPosition(); checkAndCalculate(); return; } Info << "checkAndCalculate()" << endl; checkAndCalculate(); Info<< "Time = " << engTime().theta() << endl << "Adding zones to the engine mesh" << endl; //fz = 4: virtual piston, outSidePort, insidePort, cutFaceZone //pz = 2: piston points, cutPointZone //cz = 1: moving mask List<pointZone*> pz(3); List<faceZone*> fz(4); List<cellZone*> cz(1); label nPointZones = 0; label nFaceZones = 0; label nCellZones = 0; // Add the piston zone if (piston().patchID().active()) { // Piston position Info << "Adding face zone for piston layer addition/removal" << endl; label pistonPatchID = piston().patchID().index(); scalar zPist = max(boundary()[pistonPatchID].patch().localPoints()).z(); scalar zPistV = zPist + offSet(); labelList zone1(faceCentres().size()); boolList flipZone1(faceCentres().size(), false); label nZoneFaces1 = 0; bool foundAtLeastOne = false; scalar zHigher = GREAT; scalar dh = GREAT; scalar dl = GREAT; forAll (faceCentres(), faceI) { // The points have to be in the cylinder and not in the ports.... scalar zc = faceCentres()[faceI].z(); scalar xc = faceCentres()[faceI].x(); scalar yc = faceCentres()[faceI].y(); vector n = faceAreas()[faceI]/mag(faceAreas()[faceI]); scalar dd = n & vector(0,0,1); if(sqrt(sqr(xc)+sqr(yc)) < 0.5 * engTime().bore().value()) { if (dd > 0.1) { if (zPistV - zc > 0 && zPistV - zc < dl) { dl = zPistV - zc; } if (zc - zPistV > 0 && zc - zPistV < dh) { zHigher = zc; dh = zc - zHigher; } if ( zc > zPistV - delta() && zc < zPistV + delta() ) { foundAtLeastOne = true; if ((faceAreas()[faceI] & vector(0,0,1)) < 0) { flipZone1[nZoneFaces1] = true; } zone1[nZoneFaces1] = faceI; nZoneFaces1++; } } } }
void Foam::processorPolyPatch::calcGeometry(PstreamBuffers& pBufs) { if (Pstream::parRun()) { { UIPstream fromNeighbProc(neighbProcNo(), pBufs); fromNeighbProc >> neighbFaceCentres_ >> neighbFaceAreas_ >> neighbFaceCellCentres_; } // My normals vectorField faceNormals(size()); // Neighbour normals vectorField nbrFaceNormals(neighbFaceAreas_.size()); // Face match tolerances scalarField tols = calcFaceTol(*this, points(), faceCentres()); // Calculate normals from areas and check forAll(faceNormals, facei) { scalar magSf = mag(faceAreas()[facei]); scalar nbrMagSf = mag(neighbFaceAreas_[facei]); scalar avSf = (magSf + nbrMagSf)/2.0; if (magSf < ROOTVSMALL && nbrMagSf < ROOTVSMALL) { // Undetermined normal. Use dummy normal to force separation // check. (note use of sqrt(VSMALL) since that is how mag // scales) faceNormals[facei] = point(1, 0, 0); nbrFaceNormals[facei] = faceNormals[facei]; } else if (mag(magSf - nbrMagSf) > matchTolerance()*sqr(tols[facei])) { fileName nm ( boundaryMesh().mesh().time().path() /name()+"_faces.obj" ); Pout<< "processorPolyPatch::calcGeometry : Writing my " << size() << " faces to OBJ file " << nm << endl; writeOBJ(nm, *this, points()); OFstream ccStr ( boundaryMesh().mesh().time().path() /name() + "_faceCentresConnections.obj" ); Pout<< "processorPolyPatch::calcGeometry :" << " Dumping cell centre lines between" << " corresponding face centres to OBJ file" << ccStr.name() << endl; label vertI = 0; forAll(faceCentres(), faceI) { const point& c0 = neighbFaceCentres_[faceI]; const point& c1 = faceCentres()[faceI]; writeOBJ(ccStr, c0, c1, vertI); } FatalErrorIn ( "processorPolyPatch::calcGeometry()" ) << "face " << facei << " area does not match neighbour by " << 100*mag(magSf - nbrMagSf)/avSf << "% -- possible face ordering problem." << endl << "patch:" << name() << " my area:" << magSf << " neighbour area:" << nbrMagSf << " matching tolerance:" << matchTolerance()*sqr(tols[facei]) << endl << "Mesh face:" << start()+facei << " vertices:" << UIndirectList<point>(points(), operator[](facei))() << endl << "If you are certain your matching is correct" << " you can increase the 'matchTolerance' setting" << " in the patch dictionary in the boundary file." << endl << "Rerun with processor debug flag set for" << " more information." << exit(FatalError); } else {
<< matchTolerance()*sqr(tols[facei]) << endl << "Mesh face:" << start()+facei << " vertices:" << UIndirectList<point>(points(), operator[](facei))() << endl << "If you are certain your matching is correct" << " you can increase the 'matchTolerance' setting" << " in the patch dictionary in the boundary file." << endl << "Rerun with processor debug flag set for" << " more information." << exit(FatalError); } else { faceNormals[facei] = faceAreas()[facei]/magSf; nbrFaceNormals[facei] = neighbFaceAreas_[facei]/nbrMagSf; } } calcTransformTensors ( faceCentres(), neighbFaceCentres_, faceNormals, nbrFaceNormals, matchTolerance()*tols, matchTolerance() ); } }
void Foam::processorPolyPatch::calcGeometry() { if (Pstream::parRun()) { { IPstream fromNeighbProc ( Pstream::blocking, neighbProcNo(), 3*(sizeof(label) + size()*sizeof(vector) + sizeof(scalar)) ); fromNeighbProc >> neighbFaceCentres_ >> neighbFaceAreas_ >> neighbFaceCellCentres_; } // My normals vectorField faceNormals(size()); // Neighbour normals vectorField nbrFaceNormals(neighbFaceAreas_.size()); // Calculate normals from areas and check // Cache face areas const vectorField::subField localFaceAreas = faceAreas(); forAll (faceNormals, facei) { scalar magSf = mag(localFaceAreas[facei]); scalar nbrMagSf = mag(neighbFaceAreas_[facei]); scalar avSf = (magSf + nbrMagSf)/2.0; if (magSf < ROOTVSMALL && nbrMagSf < ROOTVSMALL) { // Undetermined normal. Use dummy normal to force separation // check. (note use of sqrt(VSMALL) since that is how mag // scales) faceNormals[facei] = point(1, 0, 0); nbrFaceNormals[facei] = faceNormals[facei]; } else if (mag(magSf - nbrMagSf)/avSf > polyPatch::matchTol_) { FatalErrorIn ( "processorPolyPatch::calcGeometry()" ) << "face " << facei << " area does not match neighbour by " << 100*mag(magSf - nbrMagSf)/avSf << "% -- possible face ordering problem." << endl << "patch: " << name() << " my area:" << magSf << " neighbour area: " << nbrMagSf << " matching tolerance: " << polyPatch::matchTol_ << endl << "Mesh face: " << start()+facei << " vertices: " << UIndirectList<point>(points(), operator[](facei))() << endl << "Rerun with processor debug flag set for" << " more information." << exit(FatalError); } else { faceNormals[facei] = localFaceAreas[facei]/magSf; nbrFaceNormals[facei] = neighbFaceAreas_[facei]/nbrMagSf; } } calcTransformTensors ( faceCentres(), neighbFaceCentres_, faceNormals, nbrFaceNormals, calcFaceTol(*this, points(), faceCentres()) ); }
void testFaceAreas(Pooma::Tester &tester, const Field &f) { tester.out() << faceAreas(f) << std::endl; }
void Foam::movingConeTopoFvMesh::addZonesAndModifiers() { // Add zones and modifiers for motion action if ( pointZones().size() || faceZones().size() || cellZones().size() || topoChanger_.size() ) { Info<< "void movingConeTopoFvMesh::addZonesAndModifiers() : " << "Zones and modifiers already present. Skipping." << endl; return; } Info<< "Time = " << time().timeName() << endl << "Adding zones and modifiers to the mesh" << endl; const vectorField& fc = faceCentres(); const vectorField& fa = faceAreas(); labelList zone1(fc.size()); boolList flipZone1(fc.size(), false); label nZoneFaces1 = 0; labelList zone2(fc.size()); boolList flipZone2(fc.size(), false); label nZoneFaces2 = 0; forAll(fc, faceI) { if ( fc[faceI].x() > -0.003501 && fc[faceI].x() < -0.003499 ) { if ((fa[faceI] & vector(1, 0, 0)) < 0) { flipZone1[nZoneFaces1] = true; } zone1[nZoneFaces1] = faceI; Info<< "face " << faceI << " for zone 1. Flip: " << flipZone1[nZoneFaces1] << endl; nZoneFaces1++; } else if ( fc[faceI].x() > -0.00701 && fc[faceI].x() < -0.00699 ) { zone2[nZoneFaces2] = faceI; if ((fa[faceI] & vector(1, 0, 0)) > 0) { flipZone2[nZoneFaces2] = true; } Info<< "face " << faceI << " for zone 2. Flip: " << flipZone2[nZoneFaces2] << endl; nZoneFaces2++; } } zone1.setSize(nZoneFaces1); flipZone1.setSize(nZoneFaces1); zone2.setSize(nZoneFaces2); flipZone2.setSize(nZoneFaces2); Info<< "zone: " << zone1 << endl; Info<< "zone: " << zone2 << endl; List<pointZone*> pz(0); List<faceZone*> fz(2); List<cellZone*> cz(0); label nFz = 0; fz[nFz] = new faceZone ( "rightExtrusionFaces", zone1, flipZone1, nFz, faceZones() ); nFz++; fz[nFz] = new faceZone ( "leftExtrusionFaces", zone2, flipZone2, nFz, faceZones() ); nFz++; fz.setSize(nFz); Info<< "Adding mesh zones." << endl; addZones(pz, fz, cz); // Add layer addition/removal interfaces List<polyMeshModifier*> tm(2); label nMods = 0; tm[nMods] = new layerAdditionRemoval ( "right", nMods, topoChanger_, "rightExtrusionFaces", readScalar ( motionDict_.subDict("right").lookup("minThickness") ), readScalar ( motionDict_.subDict("right").lookup("maxThickness") ) ); nMods++; tm[nMods] = new layerAdditionRemoval ( "left", nMods, topoChanger_, "leftExtrusionFaces", readScalar ( motionDict_.subDict("left").lookup("minThickness") ), readScalar ( motionDict_.subDict("left").lookup("maxThickness") ) ); nMods++; tm.setSize(nMods); Info<< "Adding " << nMods << " mesh modifiers" << endl; topoChanger_.addTopologyModifiers(tm); write(); }