Is it possible to write several unstructured grids in one file without use MultiblockDataSet?
a single unstructured grid may have any number of connected components, however it will still be a single vtkDataSet.
We may try to use the vtkPXMLUnstructuredGridWriter to write pieces and then abuse the pipeline by requesting pieces independantly, but I definitely don’t think this would be a clean solution.
What is your usecase exactly ?
Now I think to use MultiblockDataSet. On the other hand I’m asking how could I write a vtkMultiPieceDataSet
You may try to use a vtkXMLPartitionedDataSetWriter
.
Be careful these class are still under development (https://discourse.paraview.org/t/deprecating-multiblock-datasets/4950)
On the other hand, I’m asking what is the meaning of pieces in unstructured grid:
How can I manage it?
most of the VTK XML Writers (vtkXML…Writer) also have a multi-piece version (vtkXMLP…Writer). For example, the vtkXMLPolyDataWriter
can write .vtp files, and the vtkXMLPPolyDataWriter
can write .pvtp
which are basically composed of:
- one .pvtp xml files which contain location of vtp files composing the data set
- (usually) several vtp files, each containing a sub-part of the main PolyData. These parts are named pieces.
Of course, these pieces can be independent from each others, hence we can use this mechanism to write / read several poly data at once, but the result is still composed of several files as the main use of this mechanism is in a distributed environment.
I can give you example of how to use such reader if you want
Yes, this example can be very usefull for me.
Thank you very much
Here is a small example that open each piece and retrieve the number of cell inside, then write the data set again. It is intended to work with pvtu files.
#include <iostream>
#include <vtkUnstructuredGrid.h>
#include <vtkXMLPUnstructuredGridReader.h>
#include <vtkXMLPUnstructuredGridWriter.h>
int main(int argc, char *argv[]) {
vtkNew<vtkXMLPUnstructuredGridReader> preader;
preader->SetFileName(argv[1]);
// retrieve the number of pieces without reading the whole data
preader->UpdateInformation();
int nb_pieces = preader->GetNumberOfPieces();
std::cout << "nb pieces : " << nb_pieces << std::endl;
for (int cur_piece = 0; cur_piece < nb_pieces; cur_piece++) {
preader->UpdatePiece(cur_piece, nb_pieces, 0);
auto *loadedMesh = preader->GetOutput();
std::cout << cur_piece << " nb cells : " << loadedMesh->GetNumberOfCells() << std::endl;
}
vtkNew<vtkXMLPUnstructuredGridWriter> w;
w->SetInputConnection(preader->GetOutputPort());
w->SetFileName("res.pvtu");
w->SetUseSubdirectory(true);
w->SetNumberOfPieces(2);
w->SetStartPiece(0);
w->SetEndPiece(nb_pieces);
w->SetDataModeToAscii();
w->Write();
return 0;
}
}
Thank you very much for this example, but I still don’t understand how I can create several pieces in an unstructured grid.