From 9e58351cb3a13c473985f25c66dac0ba3b454db2 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Thu, 14 Jun 2018 10:36:38 +0200 Subject: [PATCH] ENH: prune cloud fields by names only once - can remove directly from the temporary objectRegistry prior to converting by field type. Cannot, however, do the same for volFields or areaFields since these reside on their respective mesh objects. --- src/catalyst/cloud/foamVtkCloudAdaptor.C | 23 ++++++++++++--- src/catalyst/cloud/foamVtkCloudAdaptor.H | 5 ++-- .../cloud/foamVtkCloudAdaptorTemplates.C | 28 +++---------------- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/catalyst/cloud/foamVtkCloudAdaptor.C b/src/catalyst/cloud/foamVtkCloudAdaptor.C index e9b8b5e..a0877b8 100644 --- a/src/catalyst/cloud/foamVtkCloudAdaptor.C +++ b/src/catalyst/cloud/foamVtkCloudAdaptor.C @@ -98,7 +98,7 @@ Foam::vtk::cloudAdaptor::getCloudImpl auto output = vtkSmartPointer<vtkMultiPieceDataSet>::New(); - auto objPtr = mesh.lookupObjectPtr<cloud>(cloudName); + const auto* objPtr = mesh.lookupObjectPtr<cloud>(cloudName); if (!objPtr) { return output; @@ -126,12 +126,27 @@ Foam::vtk::cloudAdaptor::getCloudImpl { vtkmesh = startLagrangian(*pointsPtr); - convertLagrangianFields<label>(vtkmesh, obrTmp, matcher); - convertLagrangianFields<scalar>(vtkmesh, obrTmp, matcher); - convertLagrangianFields<vector>(vtkmesh, obrTmp, matcher); + // Prevent any possible conversion of positions as a field + obrTmp.filterKeys + ( + [](const word& k) + { + return k.startsWith("position") + || k.startsWith("coordinate"); + }, + true // prune + ); + + // Restrict to specified fields + obrTmp.filterKeys(matcher); + + convertLagrangianFields<label>(vtkmesh, obrTmp); + convertLagrangianFields<scalar>(vtkmesh, obrTmp); + convertLagrangianFields<vector>(vtkmesh, obrTmp); } else { + // This should never occur vtkmesh = vtkSmartPointer<vtkPolyData>::New(); } diff --git a/src/catalyst/cloud/foamVtkCloudAdaptor.H b/src/catalyst/cloud/foamVtkCloudAdaptor.H index 72374e9..2eef8b7 100644 --- a/src/catalyst/cloud/foamVtkCloudAdaptor.H +++ b/src/catalyst/cloud/foamVtkCloudAdaptor.H @@ -77,12 +77,11 @@ class cloudAdaptor ); //- Lagrangian fields from objectRegistry - template<class Type, class UnaryPredicate> + template<class Type> static label convertLagrangianFields ( vtkPolyData* vtkmesh, - const objectRegistry& obr, - const UnaryPredicate& pred + const objectRegistry& obr ); //- Get cloud with point/cell data diff --git a/src/catalyst/cloud/foamVtkCloudAdaptorTemplates.C b/src/catalyst/cloud/foamVtkCloudAdaptorTemplates.C index b502466..d2f657c 100644 --- a/src/catalyst/cloud/foamVtkCloudAdaptorTemplates.C +++ b/src/catalyst/cloud/foamVtkCloudAdaptorTemplates.C @@ -30,32 +30,14 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -template<class Type, class UnaryMatchPredicate> +template<class Type> Foam::label Foam::vtk::cloudAdaptor::convertLagrangianFields ( vtkPolyData* vtkmesh, - const objectRegistry& obr, - const UnaryMatchPredicate& pred + const objectRegistry& obr ) { - label nFields = 0; - - wordHashSet names(obr.names<IOField<Type>>()); - - // Restrict to specified names - names.filterKeys(pred); - - // Avoid converting particle positions as a field too. - names.filterKeys - ( - [](const word& k) - { - return k.startsWith("position") || k.startsWith("coordinate"); - }, - true // prune - ); - - const wordList fieldNames(names.sortedToc()); + const wordList fieldNames(obr.sortedNames<IOField<Type>>()); for (const word& fieldName : fieldNames) { @@ -71,11 +53,9 @@ Foam::label Foam::vtk::cloudAdaptor::convertLagrangianFields // Provide identical data as cell and as point data vtkmesh->GetCellData()->AddArray(data); vtkmesh->GetPointData()->AddArray(data); - - ++nFields; } - return nFields; + return fieldNames.size(); } -- GitLab