From 6f7a67ce509766aea2f2dc53ccf682b4a79474a4 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 18 Jul 2023 11:33:43 +0200 Subject: [PATCH 01/14] WIP polydatareader --- src/t8_vtk/t8_vtk_parallel.cxx | 21 ++++++++++++++++++--- test/t8_IO/t8_gtest_vtk_reader.cxx | 4 ---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index f3103a889f..63a9455453 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -24,7 +24,9 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #if T8_WITH_VTK #include +#include #include +#include #include vtk_read_success_t @@ -39,9 +41,22 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, return read_failure; } fclose (first_check); + + char tmp[BUFSIZ], *extension; + strcpy (tmp, filename); + extension = strrchr (tmp, '.') + 1; + T8_ASSERT (strcmp (extension, "")); + /* Setup parallel reader. */ - vtkSmartPointer < vtkXMLPUnstructuredGridReader > reader = - vtkSmartPointer < vtkXMLPUnstructuredGridReader >::New (); + vtkSmartPointer < vtkXMLPDataReader > reader = NULL; + + if (strcmp (extension, "pvtu") == 0) { + reader = vtkSmartPointer < vtkXMLPUnstructuredGridReader >::New (); + } + else if (strcmp (extension, "pvtu") == 0) { + reader = vtkSmartPointer < vtkXMLPPolyDataReader >::New (); + } + if (!reader->CanReadFile (filename)) { t8_errorf ("Unable to read file.\n"); return read_failure; @@ -93,7 +108,7 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, /* Merge all read grids together */ append->Update (); append->MergePointsOn (); - grid->ShallowCopy (append->GetOutput ()); + grid->ShallowCopy (append->GetOutputAsDataSet ()); } else { /* Initialize the grid, but don't construct any cells. diff --git a/test/t8_IO/t8_gtest_vtk_reader.cxx b/test/t8_IO/t8_gtest_vtk_reader.cxx index 1605f6535d..40f6ebea41 100644 --- a/test/t8_IO/t8_gtest_vtk_reader.cxx +++ b/test/t8_IO/t8_gtest_vtk_reader.cxx @@ -88,10 +88,6 @@ TEST_P (vtk_reader, vtk_to_cmesh_fail) TEST_P (vtk_reader, vtk_to_cmesh_success) { #if T8_WITH_VTK - /*TODO: Implement reader for parallel polydata. Delete this if-block */ - if (file_type == VTK_PARALLEL_POLYDATA_FILE) { - GTEST_SKIP (); - } int mpirank; int mpiret = sc_MPI_Comm_rank (sc_MPI_COMM_WORLD, &mpirank); SC_CHECK_MPI (mpiret); From e04eab34266b30f8f37c82c3f03fff58016b77c4 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 18 Jul 2023 12:16:30 +0200 Subject: [PATCH 02/14] Add testfiles for polydata --- configure.ac | 3 +++ test/t8_IO/t8_gtest_vtk_reader.cxx | 9 +++++---- test/testfiles/test_polydata.pvtp | 12 ++++++++++++ test/testfiles/test_polydata_0.vtp | Bin 0 -> 41198 bytes test/testfiles/test_polydata_1.vtp | Bin 0 -> 41198 bytes 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 test/testfiles/test_polydata.pvtp create mode 100644 test/testfiles/test_polydata_0.vtp create mode 100644 test/testfiles/test_polydata_1.vtp diff --git a/configure.ac b/configure.ac index 172c001792..53d71492e9 100644 --- a/configure.ac +++ b/configure.ac @@ -85,6 +85,9 @@ AC_CONFIG_LINKS([test/testfiles/test_vtk_cube.vtp:test/testfiles/test_vtk_cube.v AC_CONFIG_LINKS([test/testfiles/test_parallel_file.pvtu:test/testfiles/test_parallel_file.pvtu]) AC_CONFIG_LINKS([test/testfiles/test_parallel_file_0.vtu:test/testfiles/test_parallel_file_0.vtu]) AC_CONFIG_LINKS([test/testfiles/test_parallel_file_1.vtu:test/testfiles/test_parallel_file_1.vtu]) +AC_CONFIG_LINKS([test/testfiles/test_polydata.pvtp:test/testfiles/test_polydata.pvtp]) +AC_CONFIG_LINKS([test/testfiles/test_polydata_0.vtp:test/testfiles/test_polydata_0.vtp]) +AC_CONFIG_LINKS([test/testfiles/test_polydata_1.vtp:test/testfiles/test_polydata_1.vtp]) AC_CONFIG_LINKS([example/IO/cmesh/gmsh/circlesquare_hybrid_hole.msh:example/IO/cmesh/gmsh/circlesquare_hybrid_hole.msh]) AC_CONFIG_FILES([tutorials/features/t8_features_curved_meshes_generate_cmesh.geo:tutorials/features/t8_features_curved_meshes_generate_cmesh.geo]) AC_CONFIG_FILES([tutorials/features/t8_features_curved_meshes_generate_cmesh_2d.geo:tutorials/features/t8_features_curved_meshes_generate_cmesh_2d.geo]) diff --git a/test/t8_IO/t8_gtest_vtk_reader.cxx b/test/t8_IO/t8_gtest_vtk_reader.cxx index e2100b110a..bbdf46944d 100644 --- a/test/t8_IO/t8_gtest_vtk_reader.cxx +++ b/test/t8_IO/t8_gtest_vtk_reader.cxx @@ -61,14 +61,15 @@ class vtk_reader : public testing::TestWithParam + + + + + + + + + + + diff --git a/test/testfiles/test_polydata_0.vtp b/test/testfiles/test_polydata_0.vtp new file mode 100644 index 0000000000000000000000000000000000000000..a4ceecd6ed4c5b27ebb1462d92a7a55087e60156 GIT binary patch literal 41198 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 Y;iu=9=0{cXatHM5*|l&~K~&|x09QT92LJ#7 literal 0 HcmV?d00001 diff --git a/test/testfiles/test_polydata_1.vtp b/test/testfiles/test_polydata_1.vtp new file mode 100644 index 0000000000000000000000000000000000000000..fdb50c09f1c6dfe3e6329de0b59200052a35330d GIT binary patch literal 41198 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 WS5#gU?OfP=K);?{OGXt(JO3BXt;Fj9 literal 0 HcmV?d00001 From dd4a6f82ef993f5fec0c74652c8503a9e0b70816 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 18 Jul 2023 12:16:43 +0200 Subject: [PATCH 03/14] Use XMLP_UnstructuredDataReader --- src/t8_vtk/t8_vtk_parallel.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 63a9455453..4078c1ca1e 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -103,12 +103,12 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, vtkNew < vtkAppendFilter > append; for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { reader->UpdatePiece (ipiece, total_num_pieces, 0); - append->AddInputData (reader->GetOutput ()); + append->AddInputData (reader->GetOutputAsDataSet ()); } /* Merge all read grids together */ append->Update (); append->MergePointsOn (); - grid->ShallowCopy (append->GetOutputAsDataSet ()); + grid->ShallowCopy (append->GetOutput ()); } else { /* Initialize the grid, but don't construct any cells. From e11a4aca89d337e33c3aa89bc42622582efee14e Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 18 Jul 2023 15:26:32 +0200 Subject: [PATCH 04/14] WIP need seperate append function for polydata --- src/t8_vtk/t8_vtk_parallel.cxx | 60 +++++++++++++++++++++++++----- src/t8_vtk/t8_vtk_polydata.cxx | 14 +++++++ src/t8_vtk/t8_vtk_reader.cxx | 22 ++++++++++- test/t8_IO/t8_gtest_vtk_reader.cxx | 30 +++++---------- 4 files changed, 94 insertions(+), 32 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 4078c1ca1e..89b847cd5c 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -28,6 +28,38 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include #include +#include + +static void +merge_unstructured (vtkSmartPointer < vtkXMLPDataReader > reader, + vtkSmartPointer < vtkDataSet > grid, + const int first_piece, const int last_piece, + const int total_num_pieces) +{ + vtkNew < vtkAppendFilter > append; + for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { + reader->UpdatePiece (ipiece, total_num_pieces, 0); + append->AddInputData (reader->GetOutputAsDataSet ()); + } + /* Merge all read grids together */ + append->MergePointsOn (); + append->Update (); + grid->ShallowCopy (append->GetOutput ()); +} + +static void +merge_polydata (vtkSmartPointer < vtkXMLPPolyDataReader > reader, + vtkSmartPointer < vtkDataSet > grid, const int first_piece, + const int last_piece, const int total_num_pieces) +{ + vtkNew < vtkAppendPolyData > append; + for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { + reader->UpdatePiece (ipiece, total_num_pieces, 0); + append->AddInputData (reader->GetOutput ()); + } + append->Update (); + grid->ShallowCopy (append->GetOutput ()); +} vtk_read_success_t t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, @@ -49,12 +81,15 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, /* Setup parallel reader. */ vtkSmartPointer < vtkXMLPDataReader > reader = NULL; + vtk_file_type_t file_type = VTK_FILE_ERROR; if (strcmp (extension, "pvtu") == 0) { reader = vtkSmartPointer < vtkXMLPUnstructuredGridReader >::New (); + file_type = VTK_PARALLEL_UNSTRUCTURED_FILE; } - else if (strcmp (extension, "pvtu") == 0) { + else if (strcmp (extension, "pvtp") == 0) { reader = vtkSmartPointer < vtkXMLPPolyDataReader >::New (); + file_type = VTK_PARALLEL_POLYDATA_FILE; } if (!reader->CanReadFile (filename)) { @@ -80,6 +115,7 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, /* Setup number of pieces to read on this proc. */ int last_piece = -1; int first_piece = 0; + if (mpisize >= total_num_pieces) { /* The first n-procs read a piece each. */ first_piece = mpirank; @@ -97,24 +133,28 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, last_piece = total_num_pieces - first_piece; } } - + t8_debugf ("[D] total_pieces = %i, first_piece = %i, last_piece = %i\n", + total_num_pieces, first_piece, last_piece); /* Read the pieces if there are any pieces to read on this proc. */ if (first_piece < last_piece) { - vtkNew < vtkAppendFilter > append; - for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { - reader->UpdatePiece (ipiece, total_num_pieces, 0); - append->AddInputData (reader->GetOutputAsDataSet ()); + if (file_type == VTK_PARALLEL_UNSTRUCTURED_FILE) { + merge_unstructured (reader, grid, first_piece, last_piece, + total_num_pieces); + } + else if (file_type == VTK_PARALLEL_POLYDATA_FILE) { + merge_polydata (reader, grid, first_piece, last_piece, + total_num_pieces); + } + else { + t8_errorf ("Filetype not supported\n"); } - /* Merge all read grids together */ - append->Update (); - append->MergePointsOn (); - grid->ShallowCopy (append->GetOutput ()); } else { /* Initialize the grid, but don't construct any cells. * simplifies further processing of the grid on multiple procs. */ grid->Initialize (); } + t8_debugf ("[D] read %lli cells\n", grid->GetNumberOfCells ()); return read_success; } diff --git a/src/t8_vtk/t8_vtk_polydata.cxx b/src/t8_vtk/t8_vtk_polydata.cxx index 5f81e2b796..62173522fd 100644 --- a/src/t8_vtk/t8_vtk_polydata.cxx +++ b/src/t8_vtk/t8_vtk_polydata.cxx @@ -30,6 +30,7 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include #include @@ -105,6 +106,18 @@ t8_read_poly_ext (const char *filename, vtkSmartPointer < vtkPolyData > grid) grid->ShallowCopy (vtkDataSet::SafeDownCast (reader->GetOutput ())); return read_failure; } + else if (strcmp (extension, "pvtp") == 0) { + vtkSmartPointer < vtkXMLPPolyDataReader > reader = + vtkSmartPointer < vtkXMLPPolyDataReader >::New (); + if (!reader->CanReadFile (filename)) { + t8_errorf ("Unable to read file.\n"); + return read_failure; + } + reader->SetFileName (filename); + reader->Update (); + grid->ShallowCopy (vtkDataSet::SafeDownCast (reader->GetOutput ())); + return read_success; + } else { /* Return NULL if the reader is not used correctly. */ t8_global_errorf ("Please use .ply, .vtp, .obj, .stl, .vtk or .g file\n"); @@ -128,6 +141,7 @@ t8_read_poly (const char *filename, vtkDataSet * grid) t8_errorf ("Could not read file.\n"); return read_successfull; } + t8_debugf ("[D] read %i cells\n", grid->GetNumberOfCells ()); tri_filter->SetInputData (poly_data); /* PolyVertex to vertex */ tri_filter->PassVertsOn (); diff --git a/src/t8_vtk/t8_vtk_reader.cxx b/src/t8_vtk/t8_vtk_reader.cxx index 608695f9ab..7d046133df 100644 --- a/src/t8_vtk/t8_vtk_reader.cxx +++ b/src/t8_vtk/t8_vtk_reader.cxx @@ -37,6 +37,8 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include #include +#include +#include #include #include #include @@ -129,7 +131,7 @@ t8_file_to_vtkGrid (const char *filename, T8_ASSERT (0 <= main_proc && main_proc < mpisize); /* Read the file and set the pointer to the vtkGrid */ if (!partition || mpirank == main_proc - || vtk_file_type == VTK_PARALLEL_UNSTRUCTURED_FILE) { + || vtk_file_type >= VTK_PARALLEL_UNSTRUCTURED_FILE) { switch (vtk_file_type) { case VTK_UNSTRUCTURED_FILE: main_proc_read_successful = t8_read_unstructured (filename, vtkGrid); @@ -147,8 +149,21 @@ t8_file_to_vtkGrid (const char *filename, break; } break; + case VTK_PARALLEL_POLYDATA_FILE: + if (!partition) { + t8_debugf ("[D] read poly\n"); + main_proc_read_successful = t8_read_poly (filename, vtkGrid); + } + else { + t8_debugf ("[D] read poly_distributed\n"); + main_proc_read_successful = + t8_read_parallel (filename, vtkGrid, comm); + break; + } + break; default: vtkGrid = NULL; + t8_debugf ("[D] filetype: %i\n", vtk_file_type); t8_errorf ("Filetype not supported.\n"); break; } @@ -514,6 +529,9 @@ t8_vtk_reader (const char *filename, const int partition, case VTK_PARALLEL_UNSTRUCTURED_FILE: vtkGrid = vtkSmartPointer < vtkUnstructuredGrid >::New (); break; + case VTK_PARALLEL_POLYDATA_FILE: + vtkGrid = vtkSmartPointer < vtkPolyData >::New (); + break; default: t8_errorf ("Filetype is not supported.\n"); break; @@ -565,7 +583,7 @@ t8_vtk_reader_cmesh (const char *filename, const int partition, t8_vtk_reader (filename, partition, main_proc, comm, vtk_file_type); if (vtkGrid != NULL) { const int distributed_grid = - (vtk_file_type == VTK_PARALLEL_UNSTRUCTURED_FILE) && partition; + (vtk_file_type >= VTK_PARALLEL_UNSTRUCTURED_FILE) && partition; t8_cmesh_t cmesh = t8_vtkGrid_to_cmesh (vtkGrid, partition, main_proc, distributed_grid, comm); diff --git a/test/t8_IO/t8_gtest_vtk_reader.cxx b/test/t8_IO/t8_gtest_vtk_reader.cxx index bbdf46944d..d3b04155e2 100644 --- a/test/t8_IO/t8_gtest_vtk_reader.cxx +++ b/test/t8_IO/t8_gtest_vtk_reader.cxx @@ -38,6 +38,8 @@ class vtk_reader : public testing::TestWithParam T8_VTK_TEST_NUM_PROCS) { GTEST_SKIP (); } @@ -45,15 +47,16 @@ class vtk_reader : public testing::TestWithParam(GetParam()); main_proc = std::get<2>(GetParam()); - if(file_type == VTK_PARALLEL_UNSTRUCTURED_FILE && partition){ - GTEST_SKIP(); - } + distributed = file_type >= VTK_PARALLEL_UNSTRUCTURED_FILE && partition; + t8_debugf("[D] distributed: %i file_type: %i, partition: %i\n", distributed, file_type, partition); } int file; vtk_file_type_t file_type; int partition; + int distributed; int main_proc; int mpisize; + int mpirank; const char* failing_files[5] = { "no_file", "non-existing-file.vtu", @@ -66,10 +69,10 @@ class vtk_reader : public testing::TestWithParam points = t8_vtk_reader_pointSet (test_files[file], 0, 0, From 25b0fb6208ed7c3ae24285e96633837363fea73b Mon Sep 17 00:00:00 2001 From: David Knapp Date: Wed, 19 Jul 2023 11:06:31 +0200 Subject: [PATCH 05/14] Clean-up --- src/t8_vtk/t8_vtk_parallel.cxx | 116 +++++++++++++++++++++------------ src/t8_vtk/t8_vtk_parallel.hxx | 17 ++++- src/t8_vtk/t8_vtk_reader.cxx | 5 +- 3 files changed, 89 insertions(+), 49 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 89b847cd5c..a914929cbf 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -61,9 +61,11 @@ merge_polydata (vtkSmartPointer < vtkXMLPPolyDataReader > reader, grid->ShallowCopy (append->GetOutput ()); } -vtk_read_success_t -t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, - sc_MPI_Comm comm) +static vtk_read_success_t +setup_reader (const char *filename, vtkSmartPointer < vtkDataSet > grid, + vtkSmartPointer < vtkXMLPDataReader > reader, + int *first_piece, int *last_piece, + int *total_num_pieces, sc_MPI_Comm comm) { /* Check if we can open the parallel file */ FILE *first_check; @@ -79,19 +81,6 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, extension = strrchr (tmp, '.') + 1; T8_ASSERT (strcmp (extension, "")); - /* Setup parallel reader. */ - vtkSmartPointer < vtkXMLPDataReader > reader = NULL; - vtk_file_type_t file_type = VTK_FILE_ERROR; - - if (strcmp (extension, "pvtu") == 0) { - reader = vtkSmartPointer < vtkXMLPUnstructuredGridReader >::New (); - file_type = VTK_PARALLEL_UNSTRUCTURED_FILE; - } - else if (strcmp (extension, "pvtp") == 0) { - reader = vtkSmartPointer < vtkXMLPPolyDataReader >::New (); - file_type = VTK_PARALLEL_POLYDATA_FILE; - } - if (!reader->CanReadFile (filename)) { t8_errorf ("Unable to read file.\n"); return read_failure; @@ -101,7 +90,7 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, reader->UpdateInformation (); /* Get the number of files to read. */ - const int total_num_pieces = reader->GetNumberOfPieces (); + *total_num_pieces = reader->GetNumberOfPieces (); /* Get mpi size and rank */ int mpiret; int mpisize; @@ -113,48 +102,89 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, SC_CHECK_MPI (mpiret); /* Setup number of pieces to read on this proc. */ - int last_piece = -1; - int first_piece = 0; + *last_piece = -1; + *first_piece = 0; - if (mpisize >= total_num_pieces) { + if (mpisize >= *total_num_pieces) { /* The first n-procs read a piece each. */ - first_piece = mpirank; - last_piece = first_piece + ((mpirank < mpisize) ? 1 : 0); + *first_piece = mpirank; + *last_piece = *first_piece + ((mpirank < mpisize) ? 1 : 0); } else { - first_piece = total_num_pieces / mpisize * mpirank; - last_piece = first_piece; + *first_piece = *total_num_pieces / mpisize * mpirank; + *last_piece = *first_piece; const int prev_proc_first_piece = - total_num_pieces / mpisize * (mpirank - 1); - last_piece += - first_piece == prev_proc_first_piece ? 0 : total_num_pieces / mpisize; - if (first_piece == total_num_pieces / mpisize * (mpisize - 1)) { + *total_num_pieces / mpisize * (mpirank - 1); + *last_piece += + *first_piece == prev_proc_first_piece ? 0 : *total_num_pieces / mpisize; + if (*first_piece == *total_num_pieces / mpisize * (mpisize - 1)) { /* Read the last chunk of data */ - last_piece = total_num_pieces - first_piece; + *last_piece = *total_num_pieces - *first_piece; } } - t8_debugf ("[D] total_pieces = %i, first_piece = %i, last_piece = %i\n", - total_num_pieces, first_piece, last_piece); + return read_success; +} + +vtk_read_success_t +t8_read_parallel_poly (const char *filename, + vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm) +{ + /* Setup parallel reader. */ + vtkSmartPointer < vtkXMLPPolyDataReader > reader = + vtkSmartPointer < vtkXMLPPolyDataReader >::New (); + + vtk_read_success_t read_status = read_failure; + + int first_piece = 0; + int last_piece = -1; + int total_num_pieces; + read_status = + setup_reader (filename, grid, reader, &first_piece, &last_piece, + &total_num_pieces, comm); + if (read_status == read_failure) { + return read_status; + } /* Read the pieces if there are any pieces to read on this proc. */ if (first_piece < last_piece) { - if (file_type == VTK_PARALLEL_UNSTRUCTURED_FILE) { - merge_unstructured (reader, grid, first_piece, last_piece, - total_num_pieces); - } - else if (file_type == VTK_PARALLEL_POLYDATA_FILE) { - merge_polydata (reader, grid, first_piece, last_piece, - total_num_pieces); - } - else { - t8_errorf ("Filetype not supported\n"); - } + merge_polydata (reader, grid, first_piece, last_piece, total_num_pieces); + } + else { + /* Initialize the grid, but don't construct any cells. + * simplifies further processing of the grid on multiple procs. */ + grid->Initialize (); + } + return read_success; +} + +vtk_read_success_t +t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, + sc_MPI_Comm comm) +{ + /* Setup parallel reader. */ + vtkSmartPointer < vtkXMLPUnstructuredGridReader > reader = + vtkSmartPointer < vtkXMLPUnstructuredGridReader >::New (); + + vtk_read_success_t read_status = read_failure; + + int first_piece = 0; + int last_piece = -1; + int total_num_pieces; + read_status = + setup_reader (filename, grid, reader, &first_piece, &last_piece, + &total_num_pieces, comm); + if (read_status == read_failure) { + return read_status; + } + /* Read the pieces if there are any pieces to read on this proc. */ + if (first_piece < last_piece) { + merge_unstructured (reader, grid, first_piece, last_piece, + total_num_pieces); } else { /* Initialize the grid, but don't construct any cells. * simplifies further processing of the grid on multiple procs. */ grid->Initialize (); } - t8_debugf ("[D] read %lli cells\n", grid->GetNumberOfCells ()); return read_success; } diff --git a/src/t8_vtk/t8_vtk_parallel.hxx b/src/t8_vtk/t8_vtk_parallel.hxx index 2a4b2e2bdb..a437e750d9 100644 --- a/src/t8_vtk/t8_vtk_parallel.hxx +++ b/src/t8_vtk/t8_vtk_parallel.hxx @@ -32,9 +32,9 @@ along with t8code; if not, write to the Free Software Foundation, Inc., /** * Given a filename to a parallel vtk file (for example .pvtu) and its data files, - * read a piece of the data files (like .vtu, .vtp, ...). + * read a piece of the data files (like .vtu, ...). * - * \param[in] filename The name of a parallel vtk file (.pvtu for example) + * \param[in] filename The name of a parallel vtk file to a distributed vtkUnstructuredGrid * \param[in] grid On input a vtkSmartPointer, that will hold the grid described * by the pieces read on this proc. * \returns non-zero on success, zero if the reading failed. @@ -43,5 +43,18 @@ vtk_read_success_t t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm); +/** + * Given a filename to a parallel vtk file (for example .pvtp) and its data files, + * read a piece of the data files (like .vtp, ...). + * + * \param[in] filename The name of a parallel vtk file to a distributed vtkPolyData + * \param[in] grid On input a vtkSmartPointer, that will hold the grid described + * by the pieces read on this proc. + * \returns non-zero on success, zero if the reading failed. + */ +vtk_read_success_t t8_read_parallel_poly (const char *filename, + vtkSmartPointer < vtkDataSet > + grid, sc_MPI_Comm comm); + #endif /* T8_WITH_VTK */ #endif /* T8_VTK_PARALLEL_HXX */ diff --git a/src/t8_vtk/t8_vtk_reader.cxx b/src/t8_vtk/t8_vtk_reader.cxx index ca0bc93f4b..07390c982a 100644 --- a/src/t8_vtk/t8_vtk_reader.cxx +++ b/src/t8_vtk/t8_vtk_reader.cxx @@ -151,19 +151,16 @@ t8_file_to_vtkGrid (const char *filename, break; case VTK_PARALLEL_POLYDATA_FILE: if (!partition) { - t8_debugf ("[D] read poly\n"); main_proc_read_successful = t8_read_poly (filename, vtkGrid); } else { - t8_debugf ("[D] read poly_distributed\n"); main_proc_read_successful = - t8_read_parallel (filename, vtkGrid, comm); + t8_read_parallel_poly (filename, vtkGrid, comm); break; } break; default: vtkGrid = NULL; - t8_debugf ("[D] filetype: %i\n", vtk_file_type); t8_errorf ("Filetype not supported.\n"); break; } From 1b164af3564b8e46bfab993dd0e7c421151d89b8 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Wed, 19 Jul 2023 11:06:56 +0200 Subject: [PATCH 06/14] Improve testing Test the local number of points/trees instead of the global --- test/t8_IO/t8_gtest_vtk_reader.cxx | 33 +++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/test/t8_IO/t8_gtest_vtk_reader.cxx b/test/t8_IO/t8_gtest_vtk_reader.cxx index d3b04155e2..7c5d23c833 100644 --- a/test/t8_IO/t8_gtest_vtk_reader.cxx +++ b/test/t8_IO/t8_gtest_vtk_reader.cxx @@ -101,7 +101,21 @@ TEST_P (vtk_reader, vtk_to_cmesh_success) file_type); if (file_type != VTK_FILE_ERROR) { EXPECT_FALSE (cmesh == NULL); - EXPECT_EQ (num_trees[file], t8_cmesh_get_num_trees (cmesh)); + const int test_num_trees = t8_cmesh_get_num_local_trees (cmesh); + if (distributed) { + /* In this testcase the cmesh should be distributed equally. */ + EXPECT_EQ (num_trees[file] / mpisize, test_num_trees); + } + else { + if (!partition || main_proc == mpirank) { + /* The proc has the complete cmesh */ + EXPECT_EQ (num_trees[file], test_num_trees); + } + else { + /* Every other proc should be empty. */ + EXPECT_EQ (0, test_num_trees); + } + } t8_cmesh_destroy (&cmesh); } else { @@ -117,10 +131,23 @@ TEST_P (vtk_reader, vtk_to_pointSet) #if T8_WITH_VTK if (file_type != VTK_FILE_ERROR) { vtkSmartPointer < vtkPointSet > points = - t8_vtk_reader_pointSet (test_files[file], 0, 0, + t8_vtk_reader_pointSet (test_files[file], partition, main_proc, sc_MPI_COMM_WORLD, file_type); int test_points = points->GetNumberOfPoints (); - EXPECT_EQ (num_points[file], test_points); + if (distributed) { + /* The points should be distributed equally in this case. */ + EXPECT_EQ (num_points[file] / mpisize, test_points); + } + else { + if (!partition || main_proc == mpirank) { + /* The proc has all points. */ + EXPECT_EQ (num_points[file], test_points); + } + else { + /* Every other proc should have no points. */ + EXPECT_EQ (0, test_points); + } + } } #else #endif From 3f9225f6cb44757c05ae22ce8b4dd507de27ffc3 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Wed, 19 Jul 2023 11:26:29 +0200 Subject: [PATCH 07/14] Added documentation and reduced the number of arguments to pass --- src/t8_vtk/t8_vtk_parallel.cxx | 67 +++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index a914929cbf..6a54dd6990 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -30,13 +30,22 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include +/** + * Merge the vtkUnstructuredGrids comming from a vtkXMLPReader into a single + * vtkUnstructuredGrid. + * + * \param[in] reader An vtkXMLPReader + * \param[in, out] grid On input an empty DataSet, on output the DataSet representing the merged pieces assigned to the reader + * \param[in] first_piece The index of the first piece to read by \a reader + * \param[in] last_piece The (not included) index of the last piece to read by \a reader + */ static void merge_unstructured (vtkSmartPointer < vtkXMLPDataReader > reader, vtkSmartPointer < vtkDataSet > grid, - const int first_piece, const int last_piece, - const int total_num_pieces) + const int first_piece, const int last_piece) { vtkNew < vtkAppendFilter > append; + const int total_num_pieces = last_piece - first_piece + 1; for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { reader->UpdatePiece (ipiece, total_num_pieces, 0); append->AddInputData (reader->GetOutputAsDataSet ()); @@ -47,12 +56,22 @@ merge_unstructured (vtkSmartPointer < vtkXMLPDataReader > reader, grid->ShallowCopy (append->GetOutput ()); } +/** + * Merge the vtkPolyData comming from a vtkXMLPPolyDataReader into a single + * vtkDataSet. + * + * \param[in] reader An vtkXMLPPolyDataReader + * \param[in, out] grid On input an empty DataSet, on output the DataSet representing the merged pieces assigned to the reader + * \param[in] first_piece The index of the first piece to read by \a reader + * \param[in] last_piece The (not included) index of the last piece to read by \a reader + */ static void merge_polydata (vtkSmartPointer < vtkXMLPPolyDataReader > reader, vtkSmartPointer < vtkDataSet > grid, const int first_piece, - const int last_piece, const int total_num_pieces) + const int last_piece) { vtkNew < vtkAppendPolyData > append; + const int total_num_pieces = last_piece - first_piece + 1; for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { reader->UpdatePiece (ipiece, total_num_pieces, 0); append->AddInputData (reader->GetOutput ()); @@ -61,11 +80,20 @@ merge_polydata (vtkSmartPointer < vtkXMLPPolyDataReader > reader, grid->ShallowCopy (append->GetOutput ()); } +/** + * Setup the reader on each process + * + * \param[in] filename The filename of the parallel file to read + * \param[in, out] reader On input a reader, on output a reader linked to \a filename + * \param[in, out] first_piece Arbitrary on input, the index of the first piece to read on output + * \param[in, out] last_piece Arbitrary on input, the (non-included) index of the last piece to read on output + * \param[in] comm The Communicator to use. + * \return vtk_read_success_t + */ static vtk_read_success_t -setup_reader (const char *filename, vtkSmartPointer < vtkDataSet > grid, +setup_reader (const char *filename, vtkSmartPointer < vtkXMLPDataReader > reader, - int *first_piece, int *last_piece, - int *total_num_pieces, sc_MPI_Comm comm) + int *first_piece, int *last_piece, sc_MPI_Comm comm) { /* Check if we can open the parallel file */ FILE *first_check; @@ -90,7 +118,7 @@ setup_reader (const char *filename, vtkSmartPointer < vtkDataSet > grid, reader->UpdateInformation (); /* Get the number of files to read. */ - *total_num_pieces = reader->GetNumberOfPieces (); + const int total_num_pieces = reader->GetNumberOfPieces (); /* Get mpi size and rank */ int mpiret; int mpisize; @@ -105,21 +133,21 @@ setup_reader (const char *filename, vtkSmartPointer < vtkDataSet > grid, *last_piece = -1; *first_piece = 0; - if (mpisize >= *total_num_pieces) { + if (mpisize >= total_num_pieces) { /* The first n-procs read a piece each. */ *first_piece = mpirank; *last_piece = *first_piece + ((mpirank < mpisize) ? 1 : 0); } else { - *first_piece = *total_num_pieces / mpisize * mpirank; + *first_piece = total_num_pieces / mpisize * mpirank; *last_piece = *first_piece; const int prev_proc_first_piece = - *total_num_pieces / mpisize * (mpirank - 1); + total_num_pieces / mpisize * (mpirank - 1); *last_piece += - *first_piece == prev_proc_first_piece ? 0 : *total_num_pieces / mpisize; - if (*first_piece == *total_num_pieces / mpisize * (mpisize - 1)) { + *first_piece == prev_proc_first_piece ? 0 : total_num_pieces / mpisize; + if (*first_piece == total_num_pieces / mpisize * (mpisize - 1)) { /* Read the last chunk of data */ - *last_piece = *total_num_pieces - *first_piece; + *last_piece = total_num_pieces - *first_piece; } } return read_success; @@ -137,16 +165,14 @@ t8_read_parallel_poly (const char *filename, int first_piece = 0; int last_piece = -1; - int total_num_pieces; read_status = - setup_reader (filename, grid, reader, &first_piece, &last_piece, - &total_num_pieces, comm); + setup_reader (filename, reader, &first_piece, &last_piece, comm); if (read_status == read_failure) { return read_status; } /* Read the pieces if there are any pieces to read on this proc. */ if (first_piece < last_piece) { - merge_polydata (reader, grid, first_piece, last_piece, total_num_pieces); + merge_polydata (reader, grid, first_piece, last_piece); } else { /* Initialize the grid, but don't construct any cells. @@ -168,17 +194,14 @@ t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, int first_piece = 0; int last_piece = -1; - int total_num_pieces; read_status = - setup_reader (filename, grid, reader, &first_piece, &last_piece, - &total_num_pieces, comm); + setup_reader (filename, reader, &first_piece, &last_piece, comm); if (read_status == read_failure) { return read_status; } /* Read the pieces if there are any pieces to read on this proc. */ if (first_piece < last_piece) { - merge_unstructured (reader, grid, first_piece, last_piece, - total_num_pieces); + merge_unstructured (reader, grid, first_piece, last_piece); } else { /* Initialize the grid, but don't construct any cells. From 476cf737b5ff24d169b2861e03236001cc47f8ca Mon Sep 17 00:00:00 2001 From: David Knapp Date: Wed, 26 Jul 2023 11:01:15 +0200 Subject: [PATCH 08/14] Remove unused code --- src/t8_vtk/t8_vtk_parallel.cxx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 6a54dd6990..7a26330fb7 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -104,11 +104,6 @@ setup_reader (const char *filename, } fclose (first_check); - char tmp[BUFSIZ], *extension; - strcpy (tmp, filename); - extension = strrchr (tmp, '.') + 1; - T8_ASSERT (strcmp (extension, "")); - if (!reader->CanReadFile (filename)) { t8_errorf ("Unable to read file.\n"); return read_failure; From 25d614fa028d34d43c9ab6c4e0a08a09b9ac779f Mon Sep 17 00:00:00 2001 From: David Knapp Date: Fri, 28 Jul 2023 08:40:39 +0200 Subject: [PATCH 09/14] Apply suggestions from code review Co-authored-by: Johannes Markert <10619309+jmark@users.noreply.github.com> --- src/t8_vtk/t8_vtk_parallel.cxx | 4 ++-- src/t8_vtk/t8_vtk_parallel.hxx | 2 +- src/t8_vtk/t8_vtk_reader.cxx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 7a26330fb7..49be214cda 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -149,7 +149,7 @@ setup_reader (const char *filename, } vtk_read_success_t -t8_read_parallel_poly (const char *filename, +t8_read_parallel_polyData (const char *filename, vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm) { /* Setup parallel reader. */ @@ -178,7 +178,7 @@ t8_read_parallel_poly (const char *filename, } vtk_read_success_t -t8_read_parallel (const char *filename, vtkSmartPointer < vtkDataSet > grid, +t8_read_parallel_unstructured (const char *filename, vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm) { /* Setup parallel reader. */ diff --git a/src/t8_vtk/t8_vtk_parallel.hxx b/src/t8_vtk/t8_vtk_parallel.hxx index a437e750d9..3029abfcc9 100644 --- a/src/t8_vtk/t8_vtk_parallel.hxx +++ b/src/t8_vtk/t8_vtk_parallel.hxx @@ -52,7 +52,7 @@ vtk_read_success_t t8_read_parallel (const char *filename, * by the pieces read on this proc. * \returns non-zero on success, zero if the reading failed. */ -vtk_read_success_t t8_read_parallel_poly (const char *filename, +vtk_read_success_t t8_read_parallel_polyData (const char *filename, vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm); diff --git a/src/t8_vtk/t8_vtk_reader.cxx b/src/t8_vtk/t8_vtk_reader.cxx index 41550d81fb..78adcb6a35 100644 --- a/src/t8_vtk/t8_vtk_reader.cxx +++ b/src/t8_vtk/t8_vtk_reader.cxx @@ -153,11 +153,11 @@ t8_file_to_vtkGrid (const char *filename, break; case VTK_PARALLEL_POLYDATA_FILE: if (!partition) { - main_proc_read_successful = t8_read_poly (filename, vtkGrid); + main_proc_read_successful = t8_read_polyData (filename, vtkGrid); } else { main_proc_read_successful = - t8_read_parallel_poly (filename, vtkGrid, comm); + t8_read_parallel_polyData (filename, vtkGrid, comm); break; } break; From 9fa453ca0f606c2d8deedc7e629f503bf04a0b14 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Fri, 28 Jul 2023 09:39:05 +0200 Subject: [PATCH 10/14] Update function names corrected some typos, too --- src/t8_vtk/t8_vtk_parallel.hxx | 11 ++++++----- src/t8_vtk/t8_vtk_polydata.cxx | 10 +++++----- src/t8_vtk/t8_vtk_polydata.hxx | 3 ++- src/t8_vtk/t8_vtk_reader.cxx | 6 +++--- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.hxx b/src/t8_vtk/t8_vtk_parallel.hxx index 3029abfcc9..b20f807e42 100644 --- a/src/t8_vtk/t8_vtk_parallel.hxx +++ b/src/t8_vtk/t8_vtk_parallel.hxx @@ -39,9 +39,10 @@ along with t8code; if not, write to the Free Software Foundation, Inc., * by the pieces read on this proc. * \returns non-zero on success, zero if the reading failed. */ -vtk_read_success_t t8_read_parallel (const char *filename, - vtkSmartPointer < vtkDataSet > grid, - sc_MPI_Comm comm); +vtk_read_success_t t8_read_parallel_unstructured (const char *filename, + vtkSmartPointer < + vtkDataSet > grid, + sc_MPI_Comm comm); /** * Given a filename to a parallel vtk file (for example .pvtp) and its data files, @@ -53,8 +54,8 @@ vtk_read_success_t t8_read_parallel (const char *filename, * \returns non-zero on success, zero if the reading failed. */ vtk_read_success_t t8_read_parallel_polyData (const char *filename, - vtkSmartPointer < vtkDataSet > - grid, sc_MPI_Comm comm); + vtkSmartPointer < vtkDataSet > + grid, sc_MPI_Comm comm); #endif /* T8_WITH_VTK */ #endif /* T8_VTK_PARALLEL_HXX */ diff --git a/src/t8_vtk/t8_vtk_polydata.cxx b/src/t8_vtk/t8_vtk_polydata.cxx index 0ca53aa225..4face894db 100644 --- a/src/t8_vtk/t8_vtk_polydata.cxx +++ b/src/t8_vtk/t8_vtk_polydata.cxx @@ -126,7 +126,7 @@ t8_read_poly_ext (const char *filename, vtkSmartPointer < vtkPolyData > grid) } vtk_read_success_t -t8_read_poly (const char *filename, vtkDataSet * grid) +t8_read_polyData (const char *filename, vtkDataSet * grid) { vtkSmartPointer < vtkPolyData > poly_data = vtkSmartPointer < vtkPolyData >::New (); @@ -135,11 +135,11 @@ t8_read_poly (const char *filename, vtkDataSet * grid) /* Prepare the poly-data for the translation from vtk to t8code. * We split all polygons (which are not supported by t8code) to * triangles, vertices and lines. */ - const vtk_read_success_t read_successfull = + const vtk_read_success_t read_successful = t8_read_poly_ext (filename, poly_data); - if (!read_successfull) { + if (!read_successful) { t8_errorf ("Could not read file.\n"); - return read_successfull; + return read_successful; } tri_filter->SetInputData (poly_data); /* PolyVertex to vertex */ @@ -148,6 +148,6 @@ t8_read_poly (const char *filename, vtkDataSet * grid) tri_filter->PassLinesOn (); tri_filter->Update (); grid->DeepCopy (vtkDataSet::SafeDownCast (tri_filter->GetOutput ())); - return read_successfull; + return read_successful; } #endif /* T8_WITH_VTK */ diff --git a/src/t8_vtk/t8_vtk_polydata.hxx b/src/t8_vtk/t8_vtk_polydata.hxx index 6d8335c7ad..e64d428481 100644 --- a/src/t8_vtk/t8_vtk_polydata.hxx +++ b/src/t8_vtk/t8_vtk_polydata.hxx @@ -47,7 +47,8 @@ along with t8code; if not, write to the Free Software Foundation, Inc., * \returns non-zero on success, zero if the reading failed. * */ -vtk_read_success_t t8_read_poly (const char *filename, vtkDataSet * grid); +vtk_read_success_t t8_read_polyData (const char *filename, + vtkDataSet * grid); #endif /* T8_WITH_VTK */ #endif /* T8_CMESH_VTK_POLYDATA */ diff --git a/src/t8_vtk/t8_vtk_reader.cxx b/src/t8_vtk/t8_vtk_reader.cxx index 78adcb6a35..037a88dcc9 100644 --- a/src/t8_vtk/t8_vtk_reader.cxx +++ b/src/t8_vtk/t8_vtk_reader.cxx @@ -139,7 +139,7 @@ t8_file_to_vtkGrid (const char *filename, main_proc_read_successful = t8_read_unstructured (filename, vtkGrid); break; case VTK_POLYDATA_FILE: - main_proc_read_successful = t8_read_poly (filename, vtkGrid); + main_proc_read_successful = t8_read_polyData (filename, vtkGrid); break; case VTK_PARALLEL_UNSTRUCTURED_FILE: if (!partition) { @@ -147,7 +147,7 @@ t8_file_to_vtkGrid (const char *filename, } else { main_proc_read_successful = - t8_read_parallel (filename, vtkGrid, comm); + t8_read_parallel_unstructured (filename, vtkGrid, comm); break; } break; @@ -226,7 +226,7 @@ t8_get_dimension (vtkSmartPointer < vtkDataSet > vtkGrid) * the vtkGrid. Each cell in the vtkDataSet becomes a tree in the cmesh. This * function constructs a cmesh on a single process. * - * \param[in] vtkGrid The vtkGrid that gets tranlated + * \param[in] vtkGrid The vtkGrid that gets translated * \param[in, out] cmesh An empty cmesh that is filled with the data. * \param[in] first_tree The global id of the first tree. Will be the global id of the first tree on this proc. * \param[in] comm A communicator. From 242c460da88ebbdc9844ee3328b7943a20616980 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Fri, 28 Jul 2023 09:44:18 +0200 Subject: [PATCH 11/14] Move merging functions into if-blocks --- src/t8_vtk/t8_vtk_parallel.cxx | 84 +++++++++++----------------------- 1 file changed, 27 insertions(+), 57 deletions(-) diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index 49be214cda..d82f37cd0b 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -30,56 +30,6 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include -/** - * Merge the vtkUnstructuredGrids comming from a vtkXMLPReader into a single - * vtkUnstructuredGrid. - * - * \param[in] reader An vtkXMLPReader - * \param[in, out] grid On input an empty DataSet, on output the DataSet representing the merged pieces assigned to the reader - * \param[in] first_piece The index of the first piece to read by \a reader - * \param[in] last_piece The (not included) index of the last piece to read by \a reader - */ -static void -merge_unstructured (vtkSmartPointer < vtkXMLPDataReader > reader, - vtkSmartPointer < vtkDataSet > grid, - const int first_piece, const int last_piece) -{ - vtkNew < vtkAppendFilter > append; - const int total_num_pieces = last_piece - first_piece + 1; - for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { - reader->UpdatePiece (ipiece, total_num_pieces, 0); - append->AddInputData (reader->GetOutputAsDataSet ()); - } - /* Merge all read grids together */ - append->MergePointsOn (); - append->Update (); - grid->ShallowCopy (append->GetOutput ()); -} - -/** - * Merge the vtkPolyData comming from a vtkXMLPPolyDataReader into a single - * vtkDataSet. - * - * \param[in] reader An vtkXMLPPolyDataReader - * \param[in, out] grid On input an empty DataSet, on output the DataSet representing the merged pieces assigned to the reader - * \param[in] first_piece The index of the first piece to read by \a reader - * \param[in] last_piece The (not included) index of the last piece to read by \a reader - */ -static void -merge_polydata (vtkSmartPointer < vtkXMLPPolyDataReader > reader, - vtkSmartPointer < vtkDataSet > grid, const int first_piece, - const int last_piece) -{ - vtkNew < vtkAppendPolyData > append; - const int total_num_pieces = last_piece - first_piece + 1; - for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { - reader->UpdatePiece (ipiece, total_num_pieces, 0); - append->AddInputData (reader->GetOutput ()); - } - append->Update (); - grid->ShallowCopy (append->GetOutput ()); -} - /** * Setup the reader on each process * @@ -150,7 +100,8 @@ setup_reader (const char *filename, vtk_read_success_t t8_read_parallel_polyData (const char *filename, - vtkSmartPointer < vtkDataSet > grid, sc_MPI_Comm comm) + vtkSmartPointer < vtkDataSet > grid, + sc_MPI_Comm comm) { /* Setup parallel reader. */ vtkSmartPointer < vtkXMLPPolyDataReader > reader = @@ -165,9 +116,17 @@ t8_read_parallel_polyData (const char *filename, if (read_status == read_failure) { return read_status; } - /* Read the pieces if there are any pieces to read on this proc. */ + /* Read the pieces if there are any pieces to read on this proc. + * Merge the output of multiple pieces into one grid */ if (first_piece < last_piece) { - merge_polydata (reader, grid, first_piece, last_piece); + vtkNew < vtkAppendPolyData > append; + const int total_num_pieces = last_piece - first_piece + 1; + for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { + reader->UpdatePiece (ipiece, total_num_pieces, 0); + append->AddInputData (reader->GetOutput ()); + } + append->Update (); + grid->ShallowCopy (append->GetOutput ()); } else { /* Initialize the grid, but don't construct any cells. @@ -178,8 +137,9 @@ t8_read_parallel_polyData (const char *filename, } vtk_read_success_t -t8_read_parallel_unstructured (const char *filename, vtkSmartPointer < vtkDataSet > grid, - sc_MPI_Comm comm) +t8_read_parallel_unstructured (const char *filename, + vtkSmartPointer < vtkDataSet > grid, + sc_MPI_Comm comm) { /* Setup parallel reader. */ vtkSmartPointer < vtkXMLPUnstructuredGridReader > reader = @@ -194,9 +154,19 @@ t8_read_parallel_unstructured (const char *filename, vtkSmartPointer < vtkDataSe if (read_status == read_failure) { return read_status; } - /* Read the pieces if there are any pieces to read on this proc. */ + /* Read the pieces if there are any pieces to read on this proc. + * Merge the output of multiple pieces into one grid */ if (first_piece < last_piece) { - merge_unstructured (reader, grid, first_piece, last_piece); + vtkNew < vtkAppendFilter > append; + const int total_num_pieces = last_piece - first_piece + 1; + for (int ipiece = first_piece; ipiece < last_piece; ipiece++) { + reader->UpdatePiece (ipiece, total_num_pieces, 0); + append->AddInputData (reader->GetOutputAsDataSet ()); + } + /* Merge all read grids together */ + append->MergePointsOn (); + append->Update (); + grid->ShallowCopy (append->GetOutput ()); } else { /* Initialize the grid, but don't construct any cells. From 1657c0f09048cf70a39c1850fc243b710a5f65e4 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Mon, 31 Jul 2023 09:29:04 +0200 Subject: [PATCH 12/14] Enable pvtp reading for cmesh-IO-example --- example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx b/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx index 95b4a24dc2..be78a21c08 100644 --- a/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx +++ b/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx @@ -166,9 +166,9 @@ main (int argc, char **argv) "If set, partition the cmesh uniformly."); sc_options_add_int (opt, 't', "type_of_file", &vtk_file_type_int, -1, "Set the type of the data in the file.\n" - "\t\t\t\t\t0 for vtkUnstructuredGrid \n" - "\t\t\t\t\t1 for vtkPolyData\n" - "\t\t\t\t\t2 for pvtu."); + "\t\t\t\t\t0 for vtkUnstructuredGrid,\n" + "\t\t\t\t\t1 for vtkPolyData,\n" + "\t\t\t\t\t2 for pvtu," "\t\t\t\t\t3 for pvtp,"); parsed = sc_options_parse (t8_get_package_id (), SC_LP_ERROR, opt, argc, argv); @@ -190,6 +190,9 @@ main (int argc, char **argv) case 2: vtk_file_type = VTK_PARALLEL_UNSTRUCTURED_FILE; break; + case 3: + vtk_file_type = VTK_PARALLEL_POLYDATA_FILE; + break; default: vtk_file_type = VTK_FILE_ERROR; break; From f838712dda3b7be46b57dbd2a6e885d4f6c69c61 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 8 Aug 2023 10:12:13 +0200 Subject: [PATCH 13/14] Apply suggestions from code review Co-authored-by: Sandro Elsweijer <49643115+sandro-elsweijer@users.noreply.github.com> --- example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx | 2 +- src/t8_vtk/t8_vtk_parallel.hxx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx b/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx index be78a21c08..77f3aee282 100644 --- a/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx +++ b/example/IO/cmesh/vtk/t8_cmesh_read_from_vtk.cxx @@ -168,7 +168,7 @@ main (int argc, char **argv) "Set the type of the data in the file.\n" "\t\t\t\t\t0 for vtkUnstructuredGrid,\n" "\t\t\t\t\t1 for vtkPolyData,\n" - "\t\t\t\t\t2 for pvtu," "\t\t\t\t\t3 for pvtp,"); + "\t\t\t\t\t2 for pvtu,\n" "\t\t\t\t\t3 for pvtp."); parsed = sc_options_parse (t8_get_package_id (), SC_LP_ERROR, opt, argc, argv); diff --git a/src/t8_vtk/t8_vtk_parallel.hxx b/src/t8_vtk/t8_vtk_parallel.hxx index b20f807e42..32f45a62e3 100644 --- a/src/t8_vtk/t8_vtk_parallel.hxx +++ b/src/t8_vtk/t8_vtk_parallel.hxx @@ -39,10 +39,12 @@ along with t8code; if not, write to the Free Software Foundation, Inc., * by the pieces read on this proc. * \returns non-zero on success, zero if the reading failed. */ +/* *INDENT-OFF* */ vtk_read_success_t t8_read_parallel_unstructured (const char *filename, - vtkSmartPointer < - vtkDataSet > grid, + vtkSmartPointer + < vtkDataSet > grid, sc_MPI_Comm comm); +/* *INDENT-ON* */ /** * Given a filename to a parallel vtk file (for example .pvtp) and its data files, From 88ddb6767a710b022a75d88a520e493fb6f9e4e4 Mon Sep 17 00:00:00 2001 From: David Knapp Date: Tue, 8 Aug 2023 11:32:51 +0200 Subject: [PATCH 14/14] Added vtk_read_success_t to custom datatypes for indentation --- scripts/t8indent_custom_datatypes.txt | 3 ++- src/t8_vtk/t8_vtk_parallel.cxx | 2 +- src/t8_vtk/t8_vtk_polydata.cxx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/t8indent_custom_datatypes.txt b/scripts/t8indent_custom_datatypes.txt index 1dbbea10c2..d62511537d 100644 --- a/scripts/t8indent_custom_datatypes.txt +++ b/scripts/t8indent_custom_datatypes.txt @@ -40,4 +40,5 @@ t8_shmem_array_t t8_stash_attribute_struct_t t8_stash_t t8_vtk_data_field_t -vtk_file_type_t \ No newline at end of file +vtk_file_type_t +vtk_read_success_t diff --git a/src/t8_vtk/t8_vtk_parallel.cxx b/src/t8_vtk/t8_vtk_parallel.cxx index d82f37cd0b..06a851fc53 100644 --- a/src/t8_vtk/t8_vtk_parallel.cxx +++ b/src/t8_vtk/t8_vtk_parallel.cxx @@ -40,7 +40,7 @@ along with t8code; if not, write to the Free Software Foundation, Inc., * \param[in] comm The Communicator to use. * \return vtk_read_success_t */ -static vtk_read_success_t +static vtk_read_success_t setup_reader (const char *filename, vtkSmartPointer < vtkXMLPDataReader > reader, int *first_piece, int *last_piece, sc_MPI_Comm comm) diff --git a/src/t8_vtk/t8_vtk_polydata.cxx b/src/t8_vtk/t8_vtk_polydata.cxx index 4face894db..3aa8b744b6 100644 --- a/src/t8_vtk/t8_vtk_polydata.cxx +++ b/src/t8_vtk/t8_vtk_polydata.cxx @@ -34,7 +34,7 @@ along with t8code; if not, write to the Free Software Foundation, Inc., #include #include -static vtk_read_success_t +static vtk_read_success_t t8_read_poly_ext (const char *filename, vtkSmartPointer < vtkPolyData > grid) { char tmp[BUFSIZ];