diff --git a/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx b/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx index b6e503ed4c4ceccfb8f55ed548cfcfab90220224..1602c43ad5352153dde11051bb4cf8c6d2c3e2e9 100644 --- a/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx +++ b/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx @@ -1,7 +1,7 @@ /*========================================================================= Program: Visualization Toolkit - Module: TestSimplePointsReaderWriter.cxx + Module: TestOpenFOAMReaderLagrangianSerial Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. @@ -63,18 +63,13 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[]) reader->SetFileName(filename); delete[] filename; reader->Update(); - - reader->SetTimeValue(0.01); - // reader->CreateCellToPointOn(); - // reader->ReadZonesOn(); + reader->SetTimeValue(0.005); // Re-read with everything selected reader->EnableAllPatchArrays(); reader->Update(); - reader->Print(std::cout); - reader->GetOutput()->Print(std::cout); - // reader->GetOutput()->GetBlock(0)->Print(std::cout); + // reader->GetOutput()->Print(std::cout); auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput()); auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian"); @@ -85,8 +80,8 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[]) return 1; } - vtkIdType nClouds = 0; - vtkIdType nParticles = 0; + long nClouds = 0; + long nParticles = 0; const int nLagrangianFields = reader->GetNumberOfLagrangianArrays(); std::cout << "----- Have " << nLagrangianFields << " Lagrangian fields" << std::endl; @@ -97,14 +92,12 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[]) std::string displayName(reader->GetPatchArrayName(i)); auto slash = displayName.rfind('/'); - if (displayName.compare(0, slash, "lagrangian") == 0 && slash != std::string::npos) + if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0) { - ++slash; std::string cloudName(displayName.substr(slash)); std::cout << " Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl; auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str()); - if (cloudData) { ++nClouds; diff --git a/IO/Parallel/Testing/Cxx/CMakeLists.txt b/IO/Parallel/Testing/Cxx/CMakeLists.txt index 9fabed257cd8be0de32a6c0b57bcb379d099e4b4..ee54239a1eaf6a532429493bd9dfdf4aa17c34e1 100644 --- a/IO/Parallel/Testing/Cxx/CMakeLists.txt +++ b/IO/Parallel/Testing/Cxx/CMakeLists.txt @@ -2,6 +2,7 @@ if (TARGET VTK::ParallelMPI) vtk_add_test_mpi(vtkIOParallelCxxTests-MPI tests TESTING_DATA TestPOpenFOAMReader.cxx + TestPOpenFOAMReaderLagrangianSerial.cxx,NO_VALID TestPOpenFOAMReaderLagrangianUncollated.cxx,NO_VALID ) vtk_test_cxx_executable(vtkIOParallelCxxTests-MPI tests) @@ -9,6 +10,7 @@ endif() vtk_add_test_cxx(vtkIOParallelCxxTests tests TestPOpenFOAMReader.cxx + TestPOpenFOAMReaderLagrangianSerial.cxx,NO_VALID TestPOpenFOAMReaderLagrangianUncollated.cxx,NO_VALID TestBigEndianPlot3D.cxx,NO_VALID ) diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx index 8a2f1014a8e52304e5e6eaa625aef9dc89340155..1d8cb090cbc1ee47289362ef0d3811d6940a1fbe 100644 --- a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx +++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx @@ -1,7 +1,7 @@ /*========================================================================= Program: Visualization Toolkit - Module: TestSimplePointsReaderWriter.cxx + Module: TestPOpenFOAMReader Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx new file mode 100644 index 0000000000000000000000000000000000000000..22ecd6f37423265f0577c264206acda58754c6c2 --- /dev/null +++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx @@ -0,0 +1,164 @@ +/*========================================================================= + + Program: Visualization Toolkit + Module: TestPOpenFOAMReaderLagrangianSerial + + Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen + All rights reserved. + See Copyright.txt or http://www.kitware.com/Copyright.htm for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notice for more information. + +=========================================================================*/ + +#if VTK_MODULE_ENABLE_VTK_ParallelMPI +#include "vtkMPIController.h" +#else +#include "vtkDummyController.h" +#endif + +#include "vtkPOpenFOAMReader.h" + +#include "vtkCellData.h" +#include "vtkCompositeDataSet.h" +#include "vtkDataSetMapper.h" +#include "vtkInformation.h" +#include "vtkLogger.h" +#include "vtkMultiBlockDataSet.h" +#include "vtkPointData.h" +#include "vtkPolyData.h" +#include "vtkSmartPointer.h" +#include "vtkTestUtilities.h" +#include "vtkUnstructuredGrid.h" + +namespace +{ + +// Get named block of specified type +template <class Type> +static Type* findBlock(vtkMultiBlockDataSet* mb, const char* blockName) +{ + Type* dataset = nullptr; + const unsigned int nblocks = (mb ? mb->GetNumberOfBlocks() : 0u); + for (unsigned int blocki = 0; !dataset && blocki < nblocks; ++blocki) + { + vtkDataObject* obj = mb->GetBlock(blocki); + if (strcmp(mb->GetMetaData(blocki)->Get(vtkCompositeDataSet::NAME()), blockName) == 0) + { + dataset = Type::SafeDownCast(obj); + } + if (!dataset) + { + dataset = findBlock<Type>(vtkMultiBlockDataSet::SafeDownCast(obj), blockName); + } + } + return dataset; +} + +} // End anonymous namespace + +int TestPOpenFOAMReaderLagrangianSerial(int argc, char* argv[]) +{ +#if VTK_MODULE_ENABLE_VTK_ParallelMPI + vtkNew<vtkMPIController> controller; +#else + vtkNew<vtkDummyController> controller; +#endif + controller->Initialize(&argc, &argv); + int rank = controller->GetLocalProcessId(); + vtkLogger::SetThreadName("rank=" + std::to_string(rank)); + vtkMultiProcessController::SetGlobalController(controller); + + // Read file name. + char* filename = vtkTestUtilities::ExpandDataFileName( + argc, argv, "Data/OpenFOAM/simplifiedSiwek-serial/simplifiedSiwek-serial.foam"); + + // Read the file + vtkNew<vtkPOpenFOAMReader> reader; + reader->SetFileName(filename); + delete[] filename; + reader->SetCaseType(vtkPOpenFOAMReader::RECONSTRUCTED_CASE); + reader->Update(); + + reader->SetTimeValue(0.005); + + // Re-read with everything selected + reader->EnableAllPatchArrays(); + reader->Update(); + reader->Print(std::cout); + // reader->GetOutput()->Print(std::cout); + + auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput()); + auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian"); + + if (!lagrangianBlocks) + { + std::cout << "No lagrangian blocks!\n"; + return 1; + } + + long nClouds = 0; + long nParticles = 0; + int hasLagrangian = 0; + + do + { + auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput()); + if (!allBlocks) + { + std::cout << "No blocks!\n"; + break; + } + std::cout << "Read " << allBlocks->GetNumberOfBlocks() << " blocks" << std::endl; + + auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian"); + if (!lagrangianBlocks) + { + std::cout << "No lagrangian blocks!\n"; + break; + } + + // Bad name, but it is what we have + for (int i = 0; i < reader->GetNumberOfPatchArrays(); ++i) + { + std::string displayName(reader->GetPatchArrayName(i)); + auto slash = displayName.rfind('/'); + + if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0) + { + hasLagrangian = 1; + std::string cloudName(displayName.substr(slash)); + std::cout << " Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl; + + auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str()); + if (cloudData) + { + ++nClouds; + nParticles += static_cast<long>(cloudData->GetNumberOfPoints()); + } + } + } + } while (false); + + int globalHasLagrangian = hasLagrangian; + long nGlobalClouds = nClouds; + long nGlobalParticles = nParticles; + + // maxOp for clouds may be misleading, but good enough for test + controller->AllReduce(&hasLagrangian, &globalHasLagrangian, 1, vtkCommunicator::LOGICAL_OR_OP); + controller->AllReduce(&nClouds, &nGlobalClouds, 1, vtkCommunicator::MAX_OP); + controller->AllReduce(&nParticles, &nGlobalParticles, 1, vtkCommunicator::SUM_OP); + + int retVal = 0; + if (rank == 0) + { + std::cout << " Read " << nParticles << " particles from " << nClouds << " clouds" << std::endl; + retVal = (nParticles != 0); + } + controller->Barrier(); + controller->Broadcast(&retVal, 1, 0); + + return !retVal; +} diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx index 9bd53a6ce9487f1c3d5dde81ffde33c17f646d30..e57b982885152592b06a11e4ffcc7f35a695acaa 100644 --- a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx +++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx @@ -1,7 +1,7 @@ /*========================================================================= Program: Visualization Toolkit - Module: TestSimplePointsReaderWriter.cxx + Module: TestPOpenFOAMReaderLagrangianUncollated Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. @@ -81,21 +81,17 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[]) reader->SetCaseType(vtkPOpenFOAMReader::DECOMPOSED_CASE); reader->Update(); - reader->SetTimeValue(0.01); + reader->SetTimeValue(0.005); + // Re-read with everything selected reader->EnableAllPatchArrays(); - reader->SetCaseType(vtkPOpenFOAMReader::DECOMPOSED_CASE); reader->Update(); - reader->Print(std::cout); reader->GetOutput()->Print(std::cout); - // reader->GetOutput()->GetBlock(0)->Print(std::cout); - std::cout << "CaseType: " << int(reader->GetCaseType()) << std::endl; - - int hasLagrangian = 0; long nClouds = 0; long nParticles = 0; + int hasLagrangian = 0; do { @@ -120,15 +116,13 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[]) std::string displayName(reader->GetPatchArrayName(i)); auto slash = displayName.rfind('/'); - if (displayName.compare(0, slash, "lagrangian") == 0 && slash != std::string::npos) + if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0) { hasLagrangian = 1; - ++slash; std::string cloudName(displayName.substr(slash)); std::cout << " Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl; auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str()); - if (cloudData) { ++nClouds; @@ -147,9 +141,6 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[]) controller->AllReduce(&nClouds, &nGlobalClouds, 1, vtkCommunicator::MAX_OP); controller->AllReduce(&nParticles, &nGlobalParticles, 1, vtkCommunicator::SUM_OP); - // No need for Barrier after AllReduce - controller->Finalize(); - int retVal = 0; if (rank == 0) { @@ -159,13 +150,5 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[]) controller->Barrier(); controller->Broadcast(&retVal, 1, 0); - controller->Finalize(); - - if (!retVal) - { - std::cout << "WARNING: test needs revising" << std::endl; - return 0; - } - return !retVal; }