From 2e0337d02430a8df80f5e52ef555e3cce3101b89 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Sun, 14 May 2017 21:04:11 +0200 Subject: [PATCH] ENH: use smart pointers for paraview readers - adds flexiblity and reduces risk of memory leaks as we add/change features STYLE: adjust naming for paraview internal polyDecomp --- .../PVFoamReader/vtkPVFoamReader.cxx | 14 +- .../PVFoamReader/vtkPVFoamReader.h | 1 + .../PVFoamReader/vtkPVFoam/vtkPVFoam.C | 82 ++++++------ .../PVFoamReader/vtkPVFoam/vtkPVFoam.H | 81 ++++++------ .../vtkPVFoam/vtkPVFoamFieldTemplates.C | 122 ++++++++++-------- .../PVFoamReader/vtkPVFoam/vtkPVFoamMesh.C | 83 ++++++------ .../vtkPVFoam/vtkPVFoamMeshLagrangian.C | 18 +-- .../vtkPVFoam/vtkPVFoamMeshVolume.C | 24 ++-- .../vtkPVFoam/vtkPVFoamTemplates.C | 17 ++- .../vtkPVblockMesh/vtkPVblockMesh.C | 89 +++++++------ .../vtkPVblockMesh/vtkPVblockMesh.H | 13 +- .../vtkPVblockMesh/vtkPVblockMeshConvert.C | 41 +++--- .../graphics/PVReaders/foamPv/foamPvCore.C | 7 +- 13 files changed, 316 insertions(+), 276 deletions(-) diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.cxx b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.cxx index 6a2e6579290..abd191dd7ab 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.cxx +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.cxx @@ -39,6 +39,7 @@ License #include "vtkSMRenderViewProxy.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkStringArray.h" +#include "vtkSmartPointer.h" // OpenFOAM includes #include "vtkPVFoam.H" @@ -69,11 +70,13 @@ vtkPVFoamReader::vtkPVFoamReader() #ifdef VTKPVFOAM_DUALPORT // Add second output for the Lagrangian this->SetNumberOfOutputPorts(2); - vtkMultiBlockDataSet *lagrangian = vtkMultiBlockDataSet::New(); + + vtkSmartPointer<vtkMultiBlockDataSet> lagrangian = + vtkSmartPointer<vtkMultiBlockDataSet>::New(); + lagrangian->ReleaseData(); this->GetExecutive()->SetOutputData(1, lagrangian); - lagrangian->Delete(); #endif TimeStepRange[0] = 0; @@ -218,7 +221,7 @@ int vtkPVFoamReader::RequestInformation { vtkErrorMacro("could not find valid OpenFOAM mesh"); - // delete foamData and flag it as fatal error + // delete backend handler and flag it as fatal error delete backend_; backend_ = nullptr; return 0; @@ -326,7 +329,8 @@ int vtkPVFoamReader::RequestData { vtkInformation *outInfo = outputVector->GetInformationObject(infoI); - int nsteps = outInfo->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS()); + const int nsteps = + outInfo->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS()); if ( @@ -419,7 +423,7 @@ int vtkPVFoamReader::RequestData ( vtkMultiBlockDataSet::DATA_OBJECT() ) - ); + ) ); #else backend_->Update(output, output); diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.h b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.h index 0de09a5547b..a1b4f3fa44f 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.h +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/PVFoamReader/vtkPVFoamReader.h @@ -46,6 +46,7 @@ SourceFiles // VTK forward declarations class vtkDataArraySelection; class vtkCallbackCommand; +template<class T> class vtkSmartPointer; // OpenFOAM forward declarations namespace Foam diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C index 9fd2f2cdc4a..1a623ac9493 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.C @@ -37,6 +37,7 @@ License #include "vtkRenderer.h" #include "vtkTextActor.h" #include "vtkTextProperty.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -48,29 +49,37 @@ namespace Foam // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // -vtkTextActor* Foam::vtkPVFoam::createTextActor -( - const std::string& s, - const point& pt -) +namespace Foam { - vtkTextActor* txt = vtkTextActor::New(); - txt->SetInput(s.c_str()); - - // Set text properties - vtkTextProperty* tprop = txt->GetTextProperty(); - tprop->SetFontFamilyToArial(); - tprop->BoldOn(); - tprop->ShadowOff(); - tprop->SetLineSpacing(1.0); - tprop->SetFontSize(14); - tprop->SetColor(1.0, 0.0, 1.0); - tprop->SetJustificationToCentered(); - - txt->GetPositionCoordinate()->SetCoordinateSystemToWorld(); - txt->GetPositionCoordinate()->SetValue(pt.x(), pt.y(), pt.z()); - - return txt; + // file-scope + + //- Create a text actor + vtkSmartPointer<vtkTextActor> createTextActor + ( + const std::string& s, + const Foam::point& pt + ) + { + vtkSmartPointer<vtkTextActor> txt = + vtkSmartPointer<vtkTextActor>::New(); + + txt->SetInput(s.c_str()); + + // Set text properties + vtkTextProperty* tprop = txt->GetTextProperty(); + tprop->SetFontFamilyToArial(); + tprop->BoldOn(); + tprop->ShadowOff(); + tprop->SetLineSpacing(1.0); + tprop->SetFontSize(14); + tprop->SetColor(1.0, 0.0, 1.0); + tprop->SetJustificationToCentered(); + + txt->GetPositionCoordinate()->SetCoordinateSystemToWorld(); + txt->GetPositionCoordinate()->SetValue(pt.x(), pt.y(), pt.z()); + + return txt; + } } @@ -93,19 +102,19 @@ void Foam::vtkPVFoam::resetCounters() void Foam::vtkPVFoam::reduceMemory() { - forAll(regionPolyDecomp_, i) + forAll(regionVtus_, i) { - regionPolyDecomp_[i].clear(); + regionVtus_[i].clear(); } - forAll(zonePolyDecomp_, i) + forAll(zoneVtus_, i) { - zonePolyDecomp_[i].clear(); + zoneVtus_[i].clear(); } - forAll(csetPolyDecomp_, i) + forAll(csetVtus_, i) { - csetPolyDecomp_[i].clear(); + csetVtus_[i].clear(); } if (!reader_->GetCacheMesh()) @@ -640,12 +649,11 @@ void Foam::vtkPVFoam::renderPatchNames { // always remove old actors first - forAll(patchTextActorsPtrs_, patchi) + forAll(patchTextActors_, patchi) { - renderer->RemoveViewProp(patchTextActorsPtrs_[patchi]); - patchTextActorsPtrs_[patchi]->Delete(); + renderer->RemoveViewProp(patchTextActors_[patchi]); } - patchTextActorsPtrs_.clear(); + patchTextActors_.clear(); if (show && meshPtr_) { @@ -750,7 +758,7 @@ void Foam::vtkPVFoam::renderPatchNames } // Set the size of the patch labels to max number of zones - patchTextActorsPtrs_.setSize(displayZoneI); + patchTextActors_.setSize(displayZoneI); if (debug) { @@ -783,7 +791,7 @@ void Foam::vtkPVFoam::renderPatchNames } // Into a list for later removal - patchTextActorsPtrs_[displayZoneI++] = createTextActor + patchTextActors_[displayZoneI++] = createTextActor ( pp.name(), zoneCentre[patchi][globalZoneI] @@ -792,13 +800,13 @@ void Foam::vtkPVFoam::renderPatchNames } // Resize the patch names list to the actual number of patch names added - patchTextActorsPtrs_.setSize(displayZoneI); + patchTextActors_.setSize(displayZoneI); } // Add text to each renderer - forAll(patchTextActorsPtrs_, actori) + forAll(patchTextActors_, actori) { - renderer->AddViewProp(patchTextActorsPtrs_[actori]); + renderer->AddViewProp(patchTextActors_[actori]); } } diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H index b7350ad055d..323be9b6c87 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoam.H @@ -71,6 +71,8 @@ class vtkPolyData; class vtkUnstructuredGrid; class vtkIndent; +template<class T> class vtkSmartPointer; + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -105,9 +107,9 @@ class vtkPVFoam // hide in extra pointMap (cellSet/cellZone) for now class polyDecomp { - labelList superCells_; - labelList addPointCellLabels_; + labelList cellMap_; labelList pointMap_; + labelList additionalIds_; public: @@ -115,27 +117,15 @@ class vtkPVFoam {} //- Label of original cell for decomposed cells - labelList& superCells() + labelList& cellMap() { - return superCells_; + return cellMap_; } //- Label of original cell for decomposed cells - const labelList& superCells() const - { - return superCells_; - } - - //- Cell-centre labels for additional points of decomposed cells - labelList& addPointCellLabels() + const labelList& cellMap() const { - return addPointCellLabels_; - } - - //- Cell-centre labels for additional points of decomposed cells - const labelList& addPointCellLabels() const - { - return addPointCellLabels_; + return cellMap_; } //- Point labels for subsetted meshes @@ -151,15 +141,29 @@ class vtkPVFoam } + //- Cell-centre labels for additional points of decomposed cells + labelList& additionalIds() + { + return additionalIds_; + } + + //- Cell-centre labels for additional points of decomposed cells + const labelList& additionalIds() const + { + return additionalIds_; + } + //- Clear void clear() { - superCells_.clear(); - addPointCellLabels_.clear(); + cellMap_.clear(); pointMap_.clear(); + additionalIds_.clear(); } }; + typedef polyDecomp foamVtuData; + // Private Data @@ -208,27 +212,20 @@ class vtkPVFoam //- Decomposed cells information (mesh regions) // TODO: regions - List<polyDecomp> regionPolyDecomp_; + List<foamVtuData> regionVtus_; //- Decomposed cells information (cellZone meshes) - List<polyDecomp> zonePolyDecomp_; + List<foamVtuData> zoneVtus_; //- Decomposed cells information (cellSet meshes) - List<polyDecomp> csetPolyDecomp_; + List<foamVtuData> csetVtus_; //- List of patch names for rendering to window - List<vtkTextActor*> patchTextActorsPtrs_; + List<vtkSmartPointer<vtkTextActor>> patchTextActors_; // Private Member Functions - //- Create a text actor - static vtkTextActor* createTextActor - ( - const std::string& s, - const point& pt - ); - //- Reset data counters void resetCounters(); @@ -318,14 +315,14 @@ class vtkPVFoam // Add mesh functions //- Volume meshes as vtkUnstructuredGrid - vtkUnstructuredGrid* volumeVTKMesh + vtkSmartPointer<vtkUnstructuredGrid> volumeVTKMesh ( const fvMesh& mesh, - polyDecomp& decompInfo + foamVtuData& vtuData ); //- Lagrangian positions as vtkPolyData - vtkPolyData* lagrangianVTKMesh + vtkSmartPointer<vtkPolyData> lagrangianVTKMesh ( const polyMesh& mesh, const word& cloudName @@ -333,7 +330,7 @@ class vtkPVFoam //- Patches (mesh or primitive) as vtkPolyData template<class PatchType> - vtkPolyData* patchVTKMesh + vtkSmartPointer<vtkPolyData> patchVTKMesh ( const word& name, const PatchType& p @@ -344,7 +341,7 @@ class vtkPVFoam //- Convert Field to VTK field template<class Type> - vtkFloatArray* convertFieldToVTK + vtkSmartPointer<vtkFloatArray> convertFieldToVTK ( const word& name, const Field<Type>& fld @@ -352,7 +349,7 @@ class vtkPVFoam //- Face set/zone field template<class Type> - vtkFloatArray* convertFaceFieldToVTK + vtkSmartPointer<vtkFloatArray> convertFaceFieldToVTK ( const GeometricField<Type, fvPatchField, volMesh>& fld, const labelUList& faceLabels @@ -360,10 +357,10 @@ class vtkPVFoam //- Volume field template<class Type> - vtkFloatArray* convertVolFieldToVTK + vtkSmartPointer<vtkFloatArray> convertVolFieldToVTK ( const GeometricField<Type, fvPatchField, volMesh>& fld, - const polyDecomp& decompInfo + const foamVtuData& vtuData ); @@ -416,7 +413,7 @@ class vtkPVFoam autoPtr<GeometricField<Type, pointPatchField, pointMesh>>& ptfPtr, vtkMultiBlockDataSet* output, const arrayRange& range, - const List<polyDecomp>& decompLst + const List<foamVtuData>& vtuDataList ); //- Lagrangian fields - all types @@ -444,7 +441,7 @@ class vtkPVFoam const GeometricField<Type, pointPatchField, pointMesh>& pfld, vtkMultiBlockDataSet* output, const arrayRange& range, - const List<polyDecomp>& decompLst + const List<foamVtuData>& vtuDataList ); //- Point field @@ -454,7 +451,7 @@ class vtkPVFoam vtkUnstructuredGrid* vtkmesh, const GeometricField<Type, pointPatchField, pointMesh>& pfld, const GeometricField<Type, fvPatchField, volMesh>& vfld, - const polyDecomp& decomp + const foamVtuData& vtuData ); diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamFieldTemplates.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamFieldTemplates.C index 527a641bc9e..70c79488726 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamFieldTemplates.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamFieldTemplates.C @@ -42,6 +42,7 @@ InClass #include "vtkFloatArray.h" #include "vtkCellData.h" #include "vtkPointData.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // @@ -84,7 +85,7 @@ void Foam::vtkPVFoam::convertVolField ptfPtr, output, rangeVolume_, - regionPolyDecomp_ + regionVtus_ ); // Convert activated cellZones @@ -94,7 +95,7 @@ void Foam::vtkPVFoam::convertVolField ptfPtr, output, rangeCellZones_, - zonePolyDecomp_ + zoneVtus_ ); // Convert activated cellSets @@ -104,7 +105,7 @@ void Foam::vtkPVFoam::convertVolField ptfPtr, output, rangeCellSets_, - csetPolyDecomp_ + csetVtus_ ); @@ -151,38 +152,44 @@ void Foam::vtkPVFoam::convertVolField fvPatchField<Type>(p, fld).patchInternalField() ); - vtkFloatArray* cdata = convertFieldToVTK(fld.name(), tpptf()); + vtkSmartPointer<vtkFloatArray> cdata = + convertFieldToVTK + ( + fld.name(), + tpptf() + ); vtkmesh->GetCellData()->AddArray(cdata); - cdata->Delete(); if (patchId < patchInterpList.size()) { - vtkFloatArray* pdata = convertFieldToVTK + vtkSmartPointer<vtkFloatArray> pdata = convertFieldToVTK ( fld.name(), patchInterpList[patchId].faceToPointInterpolate(tpptf)() ); vtkmesh->GetPointData()->AddArray(pdata); - pdata->Delete(); } } else { - vtkFloatArray* cdata = convertFieldToVTK(fld.name(), ptf); + vtkSmartPointer<vtkFloatArray> cdata = + convertFieldToVTK + ( + fld.name(), + ptf + ); vtkmesh->GetCellData()->AddArray(cdata); - cdata->Delete(); if (patchId < patchInterpList.size()) { - vtkFloatArray* pdata = convertFieldToVTK + vtkSmartPointer<vtkFloatArray> pdata = convertFieldToVTK ( fld.name(), patchInterpList[patchId].faceToPointInterpolate(ptf)() ); vtkmesh->GetPointData()->AddArray(pdata); - pdata->Delete(); } } } @@ -215,14 +222,13 @@ void Foam::vtkPVFoam::convertVolField if (vtkmesh) { - vtkFloatArray* cdata = convertFaceFieldToVTK + vtkSmartPointer<vtkFloatArray> cdata = convertFaceFieldToVTK ( fld, zMesh[zoneId] ); vtkmesh->GetCellData()->AddArray(cdata); - cdata->Delete(); } // TODO: points @@ -253,14 +259,13 @@ void Foam::vtkPVFoam::convertVolField const faceSet fSet(mesh, selectName); - vtkFloatArray* cdata = convertFaceFieldToVTK + vtkSmartPointer<vtkFloatArray> cdata = convertFaceFieldToVTK ( fld, fSet.sortedToc() ); vtkmesh->GetCellData()->AddArray(cdata); - cdata->Delete(); // TODO: points } @@ -369,7 +374,7 @@ void Foam::vtkPVFoam::convertVolFieldBlock autoPtr<GeometricField<Type, pointPatchField, pointMesh>>& ptfPtr, vtkMultiBlockDataSet* output, const arrayRange& range, - const List<polyDecomp>& decompLst + const List<foamVtuData>& vtuDataList ) { for (auto partId : range) @@ -389,18 +394,16 @@ void Foam::vtkPVFoam::convertVolFieldBlock continue; } - vtkFloatArray* cdata = convertVolFieldToVTK + vtkSmartPointer<vtkFloatArray> cdata = convertVolFieldToVTK ( fld, - decompLst[datasetNo] + vtuDataList[datasetNo] ); - vtkmesh->GetCellData()->AddArray(cdata); - cdata->Delete(); if (ptfPtr.valid()) { - convertPointField(vtkmesh, ptfPtr(), fld, decompLst[datasetNo]); + convertPointField(vtkmesh, ptfPtr(), fld, vtuDataList[datasetNo]); } } } @@ -449,7 +452,7 @@ void Foam::vtkPVFoam::convertPointFields pfld, output, rangeVolume_, - regionPolyDecomp_ + regionVtus_ ); // Convert activated cellZones @@ -458,7 +461,7 @@ void Foam::vtkPVFoam::convertPointFields pfld, output, rangeCellZones_, - zonePolyDecomp_ + zoneVtus_ ); // Convert activated cellSets @@ -467,7 +470,7 @@ void Foam::vtkPVFoam::convertPointFields pfld, output, rangeCellSets_, - csetPolyDecomp_ + csetVtus_ ); @@ -492,14 +495,13 @@ void Foam::vtkPVFoam::convertPointFields if (vtkmesh) { - vtkFloatArray* pdata = convertFieldToVTK + vtkSmartPointer<vtkFloatArray> pdata = convertFieldToVTK ( fieldName, pfld.boundaryField()[patchId].patchInternalField()() ); vtkmesh->GetPointData()->AddArray(pdata); - pdata->Delete(); } } @@ -531,10 +533,14 @@ void Foam::vtkPVFoam::convertPointFields mesh.faceZones()[zoneId]().meshPoints() ); - vtkFloatArray* pdata = convertFieldToVTK(fieldName, znfld); + vtkSmartPointer<vtkFloatArray> pdata = + convertFieldToVTK + ( + fieldName, + znfld + ); vtkmesh->GetPointData()->AddArray(pdata); - pdata->Delete(); } } } @@ -547,7 +553,7 @@ void Foam::vtkPVFoam::convertPointFieldBlock const GeometricField<Type, pointPatchField, pointMesh>& pfld, vtkMultiBlockDataSet* output, const arrayRange& range, - const List<polyDecomp>& decompLst + const List<foamVtuData>& vtuDataList ) { for (auto partId : range) @@ -571,7 +577,7 @@ void Foam::vtkPVFoam::convertPointFieldBlock vtkmesh, pfld, GeometricField<Type, fvPatchField, volMesh>::null(), - decompLst[datasetNo] + vtuDataList[datasetNo] ); } } @@ -584,7 +590,7 @@ void Foam::vtkPVFoam::convertPointField vtkUnstructuredGrid* vtkmesh, const GeometricField<Type, pointPatchField, pointMesh>& pfld, const GeometricField<Type, fvPatchField, volMesh>& vfld, - const polyDecomp& decomp + const foamVtuData& vtuData ) { if (!vtkmesh) @@ -593,13 +599,15 @@ void Foam::vtkPVFoam::convertPointField } const label nComp = pTraits<Type>::nComponents; - const labelUList& addPointCellLabels = decomp.addPointCellLabels(); - const labelUList& pointMap = decomp.pointMap(); + const labelUList& addPointCellLabels = vtuData.additionalIds(); + const labelUList& pointMap = vtuData.pointMap(); // use a pointMap or address directly into mesh const label nPoints = (pointMap.size() ? pointMap.size() : pfld.size()); - vtkFloatArray* fldData = vtkFloatArray::New(); + vtkSmartPointer<vtkFloatArray> fldData = + vtkSmartPointer<vtkFloatArray>::New(); + fldData->SetNumberOfTuples(nPoints + addPointCellLabels.size()); fldData->SetNumberOfComponents(nComp); fldData->Allocate(nComp*(nPoints + addPointCellLabels.size())); @@ -689,7 +697,6 @@ void Foam::vtkPVFoam::convertPointField } vtkmesh->GetPointData()->AddArray(fldData); - fldData->Delete(); } @@ -720,9 +727,13 @@ void Foam::vtkPVFoam::convertLagrangianFields { IOField<Type> fld(*iter()); - vtkFloatArray* fldData = convertFieldToVTK(fld.name(), fld); + vtkSmartPointer<vtkFloatArray> fldData = + convertFieldToVTK + ( + fld.name(), + fld + ); vtkmesh->GetPointData()->AddArray(fldData); - fldData->Delete(); } } } @@ -735,7 +746,8 @@ void Foam::vtkPVFoam::convertLagrangianFields // template<class Type> -vtkFloatArray* Foam::vtkPVFoam::convertFieldToVTK +vtkSmartPointer<vtkFloatArray> +Foam::vtkPVFoam::convertFieldToVTK ( const word& name, const Field<Type>& fld @@ -751,7 +763,9 @@ vtkFloatArray* Foam::vtkPVFoam::convertFieldToVTK const label nComp = pTraits<Type>::nComponents; - vtkFloatArray* fldData = vtkFloatArray::New(); + vtkSmartPointer<vtkFloatArray> fldData = + vtkSmartPointer<vtkFloatArray>::New(); + fldData->SetNumberOfTuples(fld.size()); fldData->SetNumberOfComponents(nComp); fldData->Allocate(nComp*fld.size()); @@ -775,7 +789,8 @@ vtkFloatArray* Foam::vtkPVFoam::convertFieldToVTK template<class Type> -vtkFloatArray* Foam::vtkPVFoam::convertFaceFieldToVTK +vtkSmartPointer<vtkFloatArray> +Foam::vtkPVFoam::convertFaceFieldToVTK ( const GeometricField<Type, fvPatchField, volMesh>& fld, const labelUList& faceLabels @@ -796,7 +811,9 @@ vtkFloatArray* Foam::vtkPVFoam::convertFaceFieldToVTK const labelList& faceOwner = mesh.faceOwner(); const labelList& faceNeigh = mesh.faceNeighbour(); - vtkFloatArray* fldData = vtkFloatArray::New(); + vtkSmartPointer<vtkFloatArray> fldData = + vtkSmartPointer<vtkFloatArray>::New(); + fldData->SetNumberOfTuples(faceLabels.size()); fldData->SetNumberOfComponents(nComp); fldData->Allocate(nComp*faceLabels.size()); @@ -836,35 +853,38 @@ vtkFloatArray* Foam::vtkPVFoam::convertFaceFieldToVTK template<class Type> -vtkFloatArray* Foam::vtkPVFoam::convertVolFieldToVTK +vtkSmartPointer<vtkFloatArray> +Foam::vtkPVFoam::convertVolFieldToVTK ( const GeometricField<Type, fvPatchField, volMesh>& fld, - const polyDecomp& decompInfo + const foamVtuData& vtuData ) { const label nComp = pTraits<Type>::nComponents; - const labelList& superCells = decompInfo.superCells(); + const labelList& cellMap = vtuData.cellMap(); + + vtkSmartPointer<vtkFloatArray> fldData = + vtkSmartPointer<vtkFloatArray>::New(); - vtkFloatArray* fldData = vtkFloatArray::New(); - fldData->SetNumberOfTuples(superCells.size()); + fldData->SetNumberOfTuples(cellMap.size()); fldData->SetNumberOfComponents(nComp); - fldData->Allocate(nComp*superCells.size()); + fldData->Allocate(nComp*cellMap.size()); fldData->SetName(fld.name().c_str()); if (debug) { Info<< "convert volField: " << fld.name() - << " size=" << superCells.size() + << " size=" << cellMap.size() << " (" << fld.size() << " + " - << (superCells.size() - fld.size()) + << (cellMap.size() - fld.size()) << ") nComp=" << nComp << endl; } float vec[nComp]; - forAll(superCells, i) + forAll(cellMap, i) { - const Type& t = fld[superCells[i]]; + const Type& t = fld[cellMap[i]]; for (direction d=0; d<nComp; ++d) { vec[d] = component(t, d); diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMesh.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMesh.C index ba32d9f162e..5a7f86afe6c 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMesh.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMesh.C @@ -38,6 +38,7 @@ License #include "vtkMultiBlockDataSet.h" #include "vtkPolyData.h" #include "vtkUnstructuredGrid.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -53,7 +54,7 @@ void Foam::vtkPVFoam::convertMeshVolume const fvMesh& mesh = *meshPtr_; // resize for decomposed polyhedra - regionPolyDecomp_.setSize(range.size()); + regionVtus_.setSize(range.size()); if (debug) { @@ -72,17 +73,15 @@ void Foam::vtkPVFoam::convertMeshVolume continue; } - vtkUnstructuredGrid* vtkmesh = volumeVTKMesh + vtkSmartPointer<vtkUnstructuredGrid> vtkmesh = volumeVTKMesh ( mesh, - regionPolyDecomp_[datasetNo] + regionVtus_[datasetNo] ); if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, partName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -127,13 +126,12 @@ void Foam::vtkPVFoam::convertMeshLagrangian continue; } - vtkPolyData* vtkmesh = lagrangianVTKMesh(mesh, cloudName); + vtkSmartPointer<vtkPolyData> vtkmesh = + lagrangianVTKMesh(mesh, cloudName); if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, cloudName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -188,7 +186,7 @@ void Foam::vtkPVFoam::convertMeshPatches << patchName << endl; } - vtkPolyData* vtkmesh = nullptr; + vtkSmartPointer<vtkPolyData> vtkmesh; if (patchIds.size() == 1) { vtkmesh = patchVTKMesh(patchName, patches[patchIds.begin().key()]); @@ -228,8 +226,6 @@ void Foam::vtkPVFoam::convertMeshPatches if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, patchName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -260,7 +256,7 @@ void Foam::vtkPVFoam::convertMeshCellZones const fvMesh& mesh = *meshPtr_; // resize for decomposed polyhedra - zonePolyDecomp_.setSize(range.size()); + zoneVtus_.setSize(range.size()); if (range.empty()) { @@ -293,32 +289,30 @@ void Foam::vtkPVFoam::convertMeshCellZones fvMeshSubset subsetter(mesh); subsetter.setLargeCellSubset(zMesh[zoneId]); - vtkUnstructuredGrid* vtkmesh = volumeVTKMesh + vtkSmartPointer<vtkUnstructuredGrid> vtkmesh = volumeVTKMesh ( subsetter.subMesh(), - zonePolyDecomp_[datasetNo] + zoneVtus_[datasetNo] ); if (vtkmesh) { - // superCells + addPointCellLabels must contain global cell ids + // cellMap + addPointCellLabels must contain global cell ids inplaceRenumber ( subsetter.cellMap(), - zonePolyDecomp_[datasetNo].superCells() + zoneVtus_[datasetNo].cellMap() ); inplaceRenumber ( subsetter.cellMap(), - zonePolyDecomp_[datasetNo].addPointCellLabels() + zoneVtus_[datasetNo].additionalIds() ); // copy pointMap as well, otherwise pointFields fail - zonePolyDecomp_[datasetNo].pointMap() = subsetter.pointMap(); + zoneVtus_[datasetNo].pointMap() = subsetter.pointMap(); addToBlock(output, vtkmesh, range, datasetNo, zoneName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -349,7 +343,7 @@ void Foam::vtkPVFoam::convertMeshCellSets const fvMesh& mesh = *meshPtr_; // resize for decomposed polyhedra - csetPolyDecomp_.setSize(range.size()); + csetVtus_.setSize(range.size()); if (debug) { @@ -375,32 +369,30 @@ void Foam::vtkPVFoam::convertMeshCellSets fvMeshSubset subsetter(mesh); subsetter.setLargeCellSubset(cSet); - vtkUnstructuredGrid* vtkmesh = volumeVTKMesh + vtkSmartPointer<vtkUnstructuredGrid> vtkmesh = volumeVTKMesh ( subsetter.subMesh(), - csetPolyDecomp_[datasetNo] + csetVtus_[datasetNo] ); if (vtkmesh) { - // superCells + addPointCellLabels must contain global cell ids + // cellMap + addPointCellLabels must contain global cell ids inplaceRenumber ( subsetter.cellMap(), - csetPolyDecomp_[datasetNo].superCells() + csetVtus_[datasetNo].cellMap() ); inplaceRenumber ( subsetter.cellMap(), - csetPolyDecomp_[datasetNo].addPointCellLabels() + csetVtus_[datasetNo].additionalIds() ); // copy pointMap as well, otherwise pointFields fail - csetPolyDecomp_[datasetNo].pointMap() = subsetter.pointMap(); + csetVtus_[datasetNo].pointMap() = subsetter.pointMap(); addToBlock(output, vtkmesh, range, datasetNo, partName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -458,13 +450,12 @@ void Foam::vtkPVFoam::convertMeshFaceZones << zoneName << endl; } - vtkPolyData* vtkmesh = patchVTKMesh(zoneName, zMesh[zoneId]()); + vtkSmartPointer<vtkPolyData> vtkmesh = + patchVTKMesh(zoneName, zMesh[zoneId]()); if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, zoneName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -530,12 +521,12 @@ void Foam::vtkPVFoam::convertMeshFaceSets continue; } - vtkPolyData* vtkmesh = patchVTKMesh("faceSet:" + partName, p); + vtkSmartPointer<vtkPolyData> vtkmesh = + patchVTKMesh("faceSet:" + partName, p); + if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, partName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -586,7 +577,9 @@ void Foam::vtkPVFoam::convertMeshPointZones const labelUList& pointLabels = zMesh[zoneId]; - vtkPoints* vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + vtkpoints->Allocate(pointLabels.size()); const pointField& meshPoints = mesh.points(); @@ -595,15 +588,14 @@ void Foam::vtkPVFoam::convertMeshPointZones vtkpoints->InsertNextPoint(meshPoints[pointLabels[pointi]].v_); } - vtkPolyData* vtkmesh = vtkPolyData::New(); + vtkSmartPointer<vtkPolyData> vtkmesh = + vtkSmartPointer<vtkPolyData>::New(); + vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, zoneName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } @@ -657,7 +649,9 @@ void Foam::vtkPVFoam::convertMeshPointSets const pointSet pSet(mesh, partName); - vtkPoints* vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + vtkpoints->Allocate(pSet.size()); const pointField& meshPoints = mesh.points(); @@ -666,15 +660,14 @@ void Foam::vtkPVFoam::convertMeshPointSets vtkpoints->InsertNextPoint(meshPoints[iter.key()].v_); } - vtkPolyData* vtkmesh = vtkPolyData::New(); + vtkSmartPointer<vtkPolyData> vtkmesh = + vtkSmartPointer<vtkPolyData>::New(); + vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); if (vtkmesh) { addToBlock(output, vtkmesh, range, datasetNo, partName); - vtkmesh->Delete(); - partDataset_[partId] = datasetNo++; } } diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshLagrangian.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshLagrangian.C index ecf7d7ab058..b15f8daca94 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshLagrangian.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshLagrangian.C @@ -35,16 +35,17 @@ License #include "vtkCellArray.h" #include "vtkPoints.h" #include "vtkPolyData.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -vtkPolyData* Foam::vtkPVFoam::lagrangianVTKMesh +vtkSmartPointer<vtkPolyData> Foam::vtkPVFoam::lagrangianVTKMesh ( const polyMesh& mesh, const word& cloudName ) { - vtkPolyData* vtkmesh = nullptr; + vtkSmartPointer<vtkPolyData> vtkmesh; if (debug) { @@ -72,9 +73,13 @@ vtkPolyData* Foam::vtkPVFoam::lagrangianVTKMesh Info<< "cloud with " << parcels.size() << " parcels" << endl; } - vtkmesh = vtkPolyData::New(); - vtkPoints* vtkpoints = vtkPoints::New(); - vtkCellArray* vtkcells = vtkCellArray::New(); + vtkmesh = vtkSmartPointer<vtkPolyData>::New(); + + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + + vtkSmartPointer<vtkCellArray> vtkcells = + vtkSmartPointer<vtkCellArray>::New(); vtkpoints->Allocate(parcels.size()); vtkcells->Allocate(parcels.size()); @@ -89,10 +94,7 @@ vtkPolyData* Foam::vtkPVFoam::lagrangianVTKMesh } vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); - vtkmesh->SetVerts(vtkcells); - vtkcells->Delete(); } if (debug) diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C index 6321e3cdfaf..487687f6897 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamMeshVolume.C @@ -34,13 +34,14 @@ License #include "vtkCellArray.h" #include "vtkIdTypeArray.h" #include "vtkUnstructuredGrid.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh +vtkSmartPointer<vtkUnstructuredGrid> Foam::vtkPVFoam::volumeVTKMesh ( const fvMesh& mesh, - polyDecomp& decompInfo + foamVtuData& vtuData ) { const cellModel& tet = *(cellModeller::lookup("tet")); @@ -50,7 +51,8 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh const cellModel& tetWedge = *(cellModeller::lookup("tetWedge")); const cellModel& hex = *(cellModeller::lookup("hex")); - vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New(); + vtkSmartPointer<vtkUnstructuredGrid> vtkmesh = + vtkSmartPointer<vtkUnstructuredGrid>::New(); if (debug) { @@ -69,8 +71,8 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh // face owner is needed to determine the face orientation const labelList& owner = mesh.faceOwner(); - labelList& superCells = decompInfo.superCells(); - labelList& addPointCellLabels = decompInfo.addPointCellLabels(); + labelList& cellMap = vtuData.cellMap(); + labelList& addPointCellLabels = vtuData.additionalIds(); // Scan for cells which need to be decomposed and count additional points // and cells @@ -116,10 +118,11 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh // Set size of additional cells mapping array // (from added cell to original cell) - superCells.setSize(mesh.nCells() + nAddCells); + cellMap.setSize(mesh.nCells() + nAddCells); // Convert OpenFOAM mesh vertices to VTK - vtkPoints* vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPoints> vtkpoints = vtkSmartPointer<vtkPoints>::New(); + vtkpoints->Allocate(mesh.nPoints() + nAddPoints); const Foam::pointField& points = mesh.points(); @@ -147,7 +150,7 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh const cellShape& cellShape = cellShapes[celli]; const cellModel& cellModel = cellShape.model(); - superCells[addCelli++] = celli; + cellMap[addCelli++] = celli; if (cellModel == tet) { @@ -334,7 +337,7 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh } else { - superCells[addCelli++] = celli; + cellMap[addCelli++] = celli; } const face& quad = quadFcs[quadI]; @@ -377,7 +380,7 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh } else { - superCells[addCelli++] = celli; + cellMap[addCelli++] = celli; } const face& tri = triFcs[triI]; @@ -411,7 +414,6 @@ vtkUnstructuredGrid* Foam::vtkPVFoam::volumeVTKMesh } vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); if (debug) { diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamTemplates.C b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamTemplates.C index 388f1bb7940..e09b2c77653 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamTemplates.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVFoamReader/vtkPVFoam/vtkPVFoamTemplates.C @@ -33,17 +33,19 @@ License #include "vtkCellArray.h" #include "vtkPoints.h" #include "vtkPolyData.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template<class PatchType> -vtkPolyData* Foam::vtkPVFoam::patchVTKMesh +vtkSmartPointer<vtkPolyData> Foam::vtkPVFoam::patchVTKMesh ( const word& name, const PatchType& p ) { - vtkPolyData* vtkmesh = vtkPolyData::New(); + vtkSmartPointer<vtkPolyData> vtkmesh = + vtkSmartPointer<vtkPolyData>::New(); if (debug) { @@ -54,20 +56,22 @@ vtkPolyData* Foam::vtkPVFoam::patchVTKMesh // Convert OpenFOAM mesh vertices to VTK const Foam::pointField& points = p.localPoints(); - vtkPoints* vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + vtkpoints->Allocate(points.size()); forAll(points, i) { vtkpoints->InsertNextPoint(points[i].v_); } - vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); // Add faces as polygons const faceList& faces = p.localFaces(); - vtkCellArray* vtkcells = vtkCellArray::New(); + vtkSmartPointer<vtkCellArray> vtkcells = + vtkSmartPointer<vtkCellArray>::New(); + vtkcells->Allocate(faces.size()); forAll(faces, facei) { @@ -82,7 +86,6 @@ vtkPolyData* Foam::vtkPVFoam::patchVTKMesh } vtkmesh->SetPolys(vtkcells); - vtkcells->Delete(); if (debug) { diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.C b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.C index 2d71d3a1d6a..0a994a78bd3 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.C @@ -39,6 +39,7 @@ License #include "vtkRenderer.h" #include "vtkTextActor.h" #include "vtkTextProperty.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -47,32 +48,38 @@ namespace Foam defineTypeNameAndDebug(vtkPVblockMesh, 0); } - // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // -vtkTextActor* Foam::vtkPVblockMesh::createTextActor -( - const std::string& s, - const point& pt -) +namespace Foam { - vtkTextActor* txt = vtkTextActor::New(); - txt->SetInput(s.c_str()); - - // Set text properties - vtkTextProperty* tprop = txt->GetTextProperty(); - tprop->SetFontFamilyToArial(); - tprop->BoldOn(); - tprop->ShadowOff(); - tprop->SetLineSpacing(1.0); - tprop->SetFontSize(14); - tprop->SetColor(1.0, 0.0, 1.0); - tprop->SetJustificationToCentered(); - - txt->GetPositionCoordinate()->SetCoordinateSystemToWorld(); - txt->GetPositionCoordinate()->SetValue(pt.x(), pt.y(), pt.z()); - - return txt; + // file-scope + //- Create a text actor + static vtkSmartPointer<vtkTextActor> createTextActor + ( + const std::string& s, + const Foam::point& pt + ) + { + vtkSmartPointer<vtkTextActor> txt = + vtkSmartPointer<vtkTextActor>::New(); + + txt->SetInput(s.c_str()); + + // Set text properties + vtkTextProperty* tprop = txt->GetTextProperty(); + tprop->SetFontFamilyToArial(); + tprop->BoldOn(); + tprop->ShadowOff(); + tprop->SetLineSpacing(1.0); + tprop->SetFontSize(14); + tprop->SetColor(1.0, 0.0, 1.0); + tprop->SetJustificationToCentered(); + + txt->GetPositionCoordinate()->SetCoordinateSystemToWorld(); + txt->GetPositionCoordinate()->SetValue(pt.x(), pt.y(), pt.z()); + + return txt; + } } @@ -436,12 +443,11 @@ void Foam::vtkPVblockMesh::renderPatchNames ) { // always remove old actors first - forAll(patchTextActorsPtrs_, actori) + forAll(patchTextActors_, actori) { - renderer->RemoveViewProp(patchTextActorsPtrs_[actori]); - patchTextActorsPtrs_[actori]->Delete(); + renderer->RemoveViewProp(patchTextActors_[actori]); } - patchTextActorsPtrs_.clear(); + patchTextActors_.clear(); // the number of text actors label nActors = 0; @@ -459,7 +465,7 @@ void Foam::vtkPVblockMesh::renderPatchNames } // 8 sides per block is plenty - patchTextActorsPtrs_.setSize(8*blkMesh.size()); + patchTextActors_.setSize(8*blkMesh.size()); // Collect all variables dictionary varDict(meshDescription.subOrEmptyDict("namedVertices")); @@ -495,33 +501,33 @@ void Foam::vtkPVblockMesh::renderPatchNames const face& f = patchFaces[facei]; // Into a list for later removal - patchTextActorsPtrs_[nActors++] = createTextActor + patchTextActors_[nActors++] = createTextActor ( patchName, f.centre(cornerPts) * scaleFactor ); - if (nActors == patchTextActorsPtrs_.size()) + if (nActors == patchTextActors_.size()) { // hit max allocated space - bail out break; } } - if (nActors == patchTextActorsPtrs_.size()) + if (nActors == patchTextActors_.size()) { // hit max allocated space - bail out break; } } - patchTextActorsPtrs_.setSize(nActors); + patchTextActors_.setSize(nActors); } // Add text to each renderer - forAll(patchTextActorsPtrs_, actori) + forAll(patchTextActors_, actori) { - renderer->AddViewProp(patchTextActorsPtrs_[actori]); + renderer->AddViewProp(patchTextActors_[actori]); } } @@ -534,12 +540,11 @@ void Foam::vtkPVblockMesh::renderPointNumbers { // always remove old actors first - forAll(pointTextActorsPtrs_, actori) + forAll(pointTextActors_, actori) { - renderer->RemoveViewProp(pointTextActorsPtrs_[actori]); - pointTextActorsPtrs_[actori]->Delete(); + renderer->RemoveViewProp(pointTextActors_[actori]); } - pointTextActorsPtrs_.clear(); + pointTextActors_.clear(); if (show && meshPtr_) { @@ -547,7 +552,7 @@ void Foam::vtkPVblockMesh::renderPointNumbers const pointField& cornerPts = blkMesh.vertices(); const scalar scaleFactor = blkMesh.scaleFactor(); - pointTextActorsPtrs_.setSize(cornerPts.size()); + pointTextActors_.setSize(cornerPts.size()); forAll(cornerPts, pointi) { // Display either pointi as a number or with its name @@ -556,7 +561,7 @@ void Foam::vtkPVblockMesh::renderPointNumbers blockVertex::write(os, pointi, blkMesh.meshDict()); // Into a list for later removal - pointTextActorsPtrs_[pointi] = createTextActor + pointTextActors_[pointi] = createTextActor ( os.str(), cornerPts[pointi]*scaleFactor @@ -565,9 +570,9 @@ void Foam::vtkPVblockMesh::renderPointNumbers } // Add text to each renderer - forAll(pointTextActorsPtrs_, actori) + forAll(pointTextActors_, actori) { - renderer->AddViewProp(pointTextActorsPtrs_[actori]); + renderer->AddViewProp(pointTextActors_[actori]); } } diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.H b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.H index d30a97eeed8..b86ad72b6c8 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.H +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMesh.H @@ -56,6 +56,8 @@ class vtkPolyData; class vtkUnstructuredGrid; class vtkIndent; +template<class T> class vtkSmartPointer; + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -110,21 +112,14 @@ class vtkPVblockMesh arrayRange rangeCorners_; //- List of patch names for rendering to window - List<vtkTextActor*> patchTextActorsPtrs_; + List<vtkSmartPointer<vtkTextActor>> patchTextActors_; //- List of point numbers for rendering to window - List<vtkTextActor*> pointTextActorsPtrs_; + List<vtkSmartPointer<vtkTextActor>> pointTextActors_; // Private Member Functions - //- Create a text actor - static vtkTextActor* createTextActor - ( - const std::string& s, - const point& pt - ); - //- Reset data counters void resetCounters(); diff --git a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMeshConvert.C b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMeshConvert.C index 1a2c18df6bd..8d39fe9b5ff 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMeshConvert.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/PVblockMeshReader/vtkPVblockMesh/vtkPVblockMeshConvert.C @@ -37,6 +37,7 @@ License #include "vtkPoints.h" #include "vtkPolyData.h" #include "vtkUnstructuredGrid.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // @@ -99,7 +100,9 @@ void Foam::vtkPVblockMesh::convertMeshBlocks const blockDescriptor& blockDef = blkMesh[blockI]; // Convert OpenFOAM mesh vertices to VTK - vtkPoints *vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + vtkpoints->Allocate(blockDef.nPoints()); const labelList& blockLabels = blockDef.blockShape(); @@ -117,7 +120,9 @@ void Foam::vtkPVblockMesh::convertMeshBlocks nodeIds[ptI] = ptI; } - vtkUnstructuredGrid* vtkmesh = vtkUnstructuredGrid::New(); + vtkSmartPointer<vtkUnstructuredGrid> vtkmesh = + vtkSmartPointer<vtkUnstructuredGrid>::New(); + vtkmesh->Allocate(1); vtkmesh->InsertNextCell ( @@ -127,7 +132,6 @@ void Foam::vtkPVblockMesh::convertMeshBlocks ); vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); addToBlock ( @@ -135,7 +139,6 @@ void Foam::vtkPVblockMesh::convertMeshBlocks selection->GetArrayName(partId) ); - vtkmesh->Delete(); ++datasetNo; } @@ -211,8 +214,11 @@ void Foam::vtkPVblockMesh::convertMeshEdges { const List<point>& edgePoints = edgesPoints[foundEdgeI]; - vtkPolyData* vtkmesh = vtkPolyData::New(); - vtkPoints* vtkpoints = vtkPoints::New(); + vtkSmartPointer<vtkPolyData> vtkmesh = + vtkSmartPointer<vtkPolyData>::New(); + + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); vtkpoints->Allocate( edgePoints.size() ); vtkmesh->Allocate(1); @@ -237,7 +243,6 @@ void Foam::vtkPVblockMesh::convertMeshEdges ); vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); addToBlock ( @@ -245,7 +250,6 @@ void Foam::vtkPVblockMesh::convertMeshEdges selection->GetArrayName(partId) ); - vtkmesh->Delete(); datasetNo++; break; @@ -287,9 +291,14 @@ void Foam::vtkPVblockMesh::convertMeshCorners if (true) // or some flag or other condition { - vtkPolyData* vtkmesh = vtkPolyData::New(); - vtkPoints* vtkpoints = vtkPoints::New(); - vtkCellArray* vtkcells = vtkCellArray::New(); + vtkSmartPointer<vtkPolyData> vtkmesh = + vtkSmartPointer<vtkPolyData>::New(); + + vtkSmartPointer<vtkPoints> vtkpoints = + vtkSmartPointer<vtkPoints>::New(); + + vtkSmartPointer<vtkCellArray> vtkcells = + vtkSmartPointer<vtkCellArray>::New(); vtkpoints->Allocate( blockPoints.size() ); vtkcells->Allocate( blockPoints.size() ); @@ -309,15 +318,15 @@ void Foam::vtkPVblockMesh::convertMeshCorners } vtkmesh->SetPoints(vtkpoints); - vtkpoints->Delete(); - vtkmesh->SetVerts(vtkcells); - vtkcells->Delete(); addToBlock(output, vtkmesh, range, datasetNo, range.name()); - vtkmesh->Delete(); - ++datasetNo; + } + + // anything added? + if (datasetNo) + { ++blockNo; } diff --git a/applications/utilities/postProcessing/graphics/PVReaders/foamPv/foamPvCore.C b/applications/utilities/postProcessing/graphics/PVReaders/foamPv/foamPvCore.C index b2c5c822e26..a9a4d1940d2 100644 --- a/applications/utilities/postProcessing/graphics/PVReaders/foamPv/foamPvCore.C +++ b/applications/utilities/postProcessing/graphics/PVReaders/foamPv/foamPvCore.C @@ -32,6 +32,7 @@ License #include "vtkDataSet.h" #include "vtkMultiBlockDataSet.h" #include "vtkInformation.h" +#include "vtkSmartPointer.h" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -54,7 +55,8 @@ void Foam::foamPvCore::addToBlock const int blockNo = selector.block(); vtkDataObject* dataObj = output->GetBlock(blockNo); - vtkMultiBlockDataSet* block = vtkMultiBlockDataSet::SafeDownCast(dataObj); + vtkSmartPointer<vtkMultiBlockDataSet> block = + vtkMultiBlockDataSet::SafeDownCast(dataObj); if (!block) { @@ -66,9 +68,8 @@ void Foam::foamPvCore::addToBlock return; } - block = vtkMultiBlockDataSet::New(); + block = vtkSmartPointer<vtkMultiBlockDataSet>::New(); output->SetBlock(blockNo, block); - block->Delete(); } if (debug) -- GitLab