void Foam::sampledCuttingPlane::createGeometry() { if (debug) { Pout<< "sampledCuttingPlane::createGeometry :updating geometry." << endl; } // Clear any stored topologies facesPtr_.clear(); isoSurfPtr_.ptr(); pointDistance_.clear(); cellDistancePtr_.clear(); // Get any subMesh if (zoneID_.index() != -1 && !subMeshPtr_.valid()) { const polyBoundaryMesh& patches = mesh().boundaryMesh(); // Patch to put exposed internal faces into label exposedPatchI = patches.findPatchID(exposedPatchName_); if (debug) { Info<< "Allocating subset of size " << mesh().cellZones()[zoneID_.index()].size() << " with exposed faces into patch " << patches[exposedPatchI].name() << endl; } const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); subMeshPtr_.reset ( new fvMeshSubset ( IOobject ( "set", fvm.time().timeName(), fvm, IOobject::NO_READ, IOobject::NO_WRITE ), fvm ) ); subMeshPtr_().setLargeCellSubset ( labelHashSet(mesh().cellZones()[zoneID_.index()]), exposedPatchI ); } // Select either the submesh or the underlying mesh const fvMesh& fvm = ( subMeshPtr_.valid() ? subMeshPtr_().subMesh() : static_cast<const fvMesh&>(mesh()) ); // Distance to cell centres // ~~~~~~~~~~~~~~~~~~~~~~~~ cellDistancePtr_.reset ( new volScalarField ( IOobject ( "cellDistance", fvm.time().timeName(), fvm.time(), IOobject::NO_READ, IOobject::NO_WRITE, false ), fvm, dimensionedScalar("zero", dimLength, 0) ) ); volScalarField& cellDistance = cellDistancePtr_(); // Internal field { const pointField& cc = fvm.cellCentres(); scalarField& fld = cellDistance.internalField(); forAll(cc, i) { // Signed distance fld[i] = (cc[i] - plane_.refPoint()) & plane_.normal(); } }
void Foam::distanceSurface::createGeometry() { if (debug) { Pout<< "distanceSurface::createGeometry :updating geometry." << endl; } // Clear any stored topologies facesPtr_.clear(); isoSurfCellPtr_.clear(); isoSurfPtr_.clear(); // Clear derived data clearGeom(); const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); // Distance to cell centres // ~~~~~~~~~~~~~~~~~~~~~~~~ cellDistancePtr_.reset ( new volScalarField ( IOobject ( "cellDistance", fvm.time().timeName(), fvm.time(), IOobject::NO_READ, IOobject::NO_WRITE, false ), fvm, dimensionedScalar("zero", dimLength, 0) ) ); volScalarField& cellDistance = cellDistancePtr_(); // Internal field { const pointField& cc = fvm.C(); scalarField& fld = cellDistance.primitiveFieldRef(); List<pointIndexHit> nearest; surfPtr_().findNearest ( cc, scalarField(cc.size(), GREAT), nearest ); if (signed_) { List<volumeType> volType; surfPtr_().getVolumeType(cc, volType); forAll(volType, i) { volumeType vT = volType[i]; if (vT == volumeType::OUTSIDE) { fld[i] = Foam::mag(cc[i] - nearest[i].hitPoint()); } else if (vT == volumeType::INSIDE) { fld[i] = -Foam::mag(cc[i] - nearest[i].hitPoint()); } else { FatalErrorInFunction << "getVolumeType failure, neither INSIDE or OUTSIDE" << exit(FatalError); } } } else {