void Foam::vtkPV3Foam::convertMeshCellZones ( vtkMultiBlockDataSet* output, int& blockNo ) { partInfo& selector = partInfoCellZones_; selector.block(blockNo); // set output block label datasetNo = 0; // restart at dataset 0 const fvMesh& mesh = *meshPtr_; // resize for decomposed polyhedra zonePolyDecomp_.setSize(selector.size()); if (!selector.size()) { return; } if (debug) { Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellZones" << endl; printMemory(); } const cellZoneMesh& zMesh = mesh.cellZones(); for (int partId = selector.start(); partId < selector.end(); ++partId) { const word zoneName = getPartName(partId); const label zoneId = zMesh.findZoneID(zoneName); if (!partStatus_[partId] || zoneId < 0) { continue; } if (debug) { Info<< "Creating VTK mesh for cellZone[" << zoneId << "] " << zoneName << endl; } fvMeshSubset subsetMesh ( IOobject ( "set", mesh.time().constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh ); subsetMesh.setLargeCellSubset(labelHashSet(zMesh[zoneId])); vtkUnstructuredGrid* vtkmesh = volumeVTKMesh ( subsetMesh.subMesh(), zonePolyDecomp_[datasetNo] ); if (vtkmesh) { // superCells + addPointCellLabels must contain global cell ids inplaceRenumber ( subsetMesh.cellMap(), zonePolyDecomp_[datasetNo].superCells() ); inplaceRenumber ( subsetMesh.cellMap(), zonePolyDecomp_[datasetNo].addPointCellLabels() ); // copy pointMap as well, otherwise pointFields fail zonePolyDecomp_[datasetNo].pointMap() = subsetMesh.pointMap(); AddToBlock(output, vtkmesh, selector, datasetNo, zoneName); vtkmesh->Delete(); partDataset_[partId] = datasetNo++; } } // anything added? if (datasetNo) { ++blockNo; } if (debug) { Info<< "<end> Foam::vtkPV3Foam::convertMeshCellZones" << endl; printMemory(); } }
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(); } }
bool Foam::sampledIsoSurface::updateGeometry() const { const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); // No update needed if (fvm.time().timeIndex() == prevTimeIndex_) { return false; } // Get any subMesh if (zoneID_.index() != -1 && !subMeshPtr_.valid()) { const polyBoundaryMesh& patches = mesh().boundaryMesh(); // Patch to put exposed internal faces into const 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; } subMeshPtr_.reset ( new fvMeshSubset(fvm) ); subMeshPtr_().setLargeCellSubset ( labelHashSet(mesh().cellZones()[zoneID_.index()]), exposedPatchI ); } prevTimeIndex_ = fvm.time().timeIndex(); getIsoFields(); // Clear any stored topo surfPtr_.clear(); facesPtr_.clear(); // Clear derived data clearGeom(); if (subMeshPtr_.valid()) { surfPtr_.reset ( new isoSurface ( *volSubFieldPtr_, *pointSubFieldPtr_, isoVal_, regularise_, mergeTol_ ) ); } else { surfPtr_.reset ( new isoSurface ( *volFieldPtr_, *pointFieldPtr_, isoVal_, regularise_, mergeTol_ ) ); } if (debug) { Pout<< "sampledIsoSurface::updateGeometry() : constructed iso:" << nl << " regularise : " << regularise_ << nl << " average : " << average_ << nl << " isoField : " << isoField_ << nl << " isoValue : " << isoVal_ << nl; if (subMeshPtr_.valid()) { Pout<< " zone size : " << subMeshPtr_().subMesh().nCells() << nl; } Pout<< " points : " << points().size() << nl << " tris : " << surface().size() << nl << " cut cells : " << surface().meshCells().size() << endl; } return true; }
void Foam::vtkPV3Foam::convertMeshCellZones ( vtkMultiBlockDataSet* output ) { if (debug) { Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellZones" << endl; printMemory(); } const selectionInfo& selector = selectInfoCellZones_; const fvMesh& mesh = *meshPtr_; // Create the cell zone(s) and add as DataSet(CELLZONE, 0..n) if (selector.size()) { const cellZoneMesh& czMesh = mesh.cellZones(); // use the zoneId directly instead of the name for (int zoneI=0; zoneI < selector.size(); ++zoneI) { const int regionId = selector.start() + zoneI; if (!selectedRegions_[regionId]) { continue; } if (debug) { Info<< "Creating VTK mesh for cellZone: " << zoneI << endl; } fvMeshSubset subsetter ( IOobject ( "set", mesh.time().constant(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh ); subsetter.setLargeCellSubset(labelHashSet(czMesh[zoneI])); const label datasetId = GetNumberOfDataSets(output, selector); vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New(); addVolumeMesh ( subsetter.subMesh(), vtkmesh, zoneSuperCells_[datasetId] ); // renumber - superCells must contain global cell ids inplaceRenumber ( subsetter.cellMap(), zoneSuperCells_[datasetId] ); AddToBlock ( output, selector, datasetId, vtkmesh, czMesh.names()[zoneI] + ":cellZone" ); selectedRegionDatasetIds_[regionId] = datasetId; vtkmesh->Delete(); } } if (debug) { Info<< "<end> Foam::vtkPV3Foam::convertMeshCellZones" << endl; printMemory(); } }