void Foam::ggiPolyPatch::calcReconFaceCellCentres() const { // Create neighbouring face centres using interpolation if (master()) { const label shadowID = shadowIndex(); // Get the transformed and interpolated shadow face cell centers reconFaceCellCentresPtr_ = new vectorField ( interpolate ( boundaryMesh()[shadowID].faceCellCentres() - boundaryMesh()[shadowID].faceCentres() ) + faceCentres() ); } else { FatalErrorIn("void ggiPolyPatch::calcReconFaceCellCentres() const") << "Attempting to create reconFaceCellCentres on a shadow" << abort(FatalError); } }
void Foam::fvMesh::makeCf() const { if (debug) { InfoInFunction << "Assembling face centres" << endl; } // It is an error to attempt to recalculate // if the pointer is already set if (CfPtr_) { FatalErrorInFunction << "face centres already exist" << abort(FatalError); } CfPtr_ = new slicedSurfaceVectorField ( IOobject ( "Cf", pointsInstance(), meshSubDir, *this, IOobject::NO_READ, IOobject::NO_WRITE, false ), *this, dimLength, faceCentres() ); }
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::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::fvMesh::makeC() const { if (debug) { InfoInFunction << "Assembling cell centres" << endl; } // It is an error to attempt to recalculate // if the pointer is already set if (CPtr_) { FatalErrorInFunction << "cell centres already exist" << abort(FatalError); } // Construct as slices. Only preserve processor (not e.g. cyclic) CPtr_ = new slicedVolVectorField ( IOobject ( "C", pointsInstance(), meshSubDir, *this, IOobject::NO_READ, IOobject::NO_WRITE, false ), *this, dimLength, cellCentres(), faceCentres(), true, //preserveCouples true //preserveProcOnly ); }
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::foamSurfaceWriter::write ( const fileName& outputDir, const fileName& surfaceName, const pointField& points, const faceList& faces, const bool verbose ) const { fileName surfaceDir(outputDir/surfaceName); if (!isDir(surfaceDir)) { mkDir(surfaceDir); } if (verbose) { Info<< "Writing geometry to " << surfaceDir << endl; } // Points OFstream(surfaceDir/"points")() << points; // Faces OFstream(surfaceDir/"faces")() << faces; // Face centers. Not really necessary but very handy when reusing as inputs // for e.g. timeVaryingMapped bc. pointField faceCentres(faces.size(),point::zero); forAll(faces, facei) { faceCentres[facei] = faces[facei].centre(points); }
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 {
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 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(); }