diff --git a/src/catalyst/cloud/foamVtkCloudAdaptor.C b/src/catalyst/cloud/foamVtkCloudAdaptor.C index e9b8b5e76ea3acd36c75a3da6be8b9d300b43880..a0877b82ba6df6a05bd285fecbcb25c88ce65ac7 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 72374e9943a06917db1a43c98b7206dd25ba95b8..2eef8b7f4ac1a23e4e4c51a62309169d9fbc9fa3 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 b5024665539cabe09294b54930c12367bee29693..d2f657c7de2a5e7106e1c445168b7ba6878d9777 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(); }