[vtkusers] Different behavior of vtkXMLPUnstructuredGridWriter in VTK 7.1

Andrew Parker andy.john.parker at googlemail.com
Mon Feb 19 10:25:07 EST 2018


Andy,

For an nparts-number of pieces, I call this function 4 times, based on your
advice (each outGrid is different every time the call is made):

void Write(const idx_t part)
{
  vtkSmartPointer<vtkXMLPUnstructuredGridWriter> pwriter =
    vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New();
    pwriter->SetFileName("file.pvtu");
  pwriter->SetNumberOfPieces(nparts);
  pwriter->SetGhostLevel(1);
  //pwriter->SetStartPiece(part);
  //pwriter->SetEndPiece(part);
  pwriter->SetStartPiece(0);
  pwriter->SetEndPiece(nparts-1);
  pwriter->SetInputData(outGrid);
  pwriter->SetDataModeToBinary();
  pwriter->SetCompressorTypeToZLib();
  pwriter->Write();
}

Is this what you mean? I'm not sure what you mean by a single call to
Write.... I call write "nparts"-times.... Is the above correct?  (assuming
I'm also using the  vtk-dummy-comms).

Cheers,
Andy

On 19 February 2018 at 13:47, Andy Bauer <andy.bauer at kitware.com> wrote:

> You need to have a  single call to pwriter->Write() with all of the pieces
> set in a single pass, otherwise the .pvtu file will overwrite each time.
> This looks like:
> pwriter->SetNumberOfPieces((int)nparts);
> pwriter->SetGhostLevel(1);
> pwriter->SetStartPiece(0);
> pwriter->SetEndPiece((int)part-1);
>
>
> If you're not generating pieces in your pipeline then you'll probably need
> to merge your pieces into a single unstructured grid before calling the
> XMLPUnstructuredGridWriter.
>
>
> On Mon, Feb 19, 2018 at 7:51 AM, Andrew Parker <andrew.parker at cantab.net>
> wrote:
>
>> I'm using the following in the serial code:
>>
>> pwriter->SetNumberOfPieces((int)nparts);
>> pwriter->SetGhostLevel(1);
>> pwriter->SetStartPiece((int)part);
>> pwriter->SetEndPiece((int)part);
>>
>> My writer function in which the above code is called is called "nparts"
>> times, where part goes from 0->(nparts-1).
>>
>> For the dummy controller, and nparts=4, I have:
>>
>> vtkSmartPointer<vtkDummyController> vtk_mpi_controller;
>> vtk_mpi_controller = vtkSmartPointer<vtkDummyController>::New();
>> vtk_mpi_controller->Initialize(&argc, &argv, 1);
>> vtk_mpi_controller->SetGlobalController(vtk_mpi_controller);
>> vtk_mpi_controller->SetNumberOfProcesses(4);
>> ....
>> vtk_mpi_controller->Finalize(1);
>>
>> resulting bottom half of the pvtu reads:
>>
>>     </PCellData>
>>     <PPoints>
>>       <PDataArray type="Float64" Name="Points" NumberOfComponents="3"/>
>>     </PPoints>
>>     <Piece Source="input_3.vtu"/>
>>   </PUnstructuredGrid>
>> </VTKFile>
>>
>> Any thoughts?
>> Cheers,
>> Andy
>>
>>
>> On 19 February 2018 at 12:38, Andy Bauer <andy.bauer at kitware.com> wrote:
>>
>>> If you haven't used the SetStartPiece(), SetEndPiece() and
>>> SetNumberOfPieces() methods in serial that's what is probably missing. In
>>> serial you should be able to use vtkDummyController.
>>>
>>>
>>>
>>> On Mon, Feb 19, 2018 at 4:59 AM, Andrew Parker <
>>> andy.john.parker at googlemail.com> wrote:
>>>
>>>> Andy,
>>>>
>>>> I can confirm this now works for my parallel code.  However, I have a
>>>> separate stand-alone serial code (has never had a communicator) which still
>>>> calls the vtkXMLPUnstructuredGridWriter and produces several part/piece
>>>> meshes and one global pvtu file.  This now fails with 7.1.1, same error
>>>> before, only one entry in the pvtu.  I have tried to make the changes noted
>>>> in your demo file (which have worked for my parallel code) but in this
>>>> instance they do not work in my serial code.  I have also tried the
>>>> vtkDummyController as a well as vtkmpicontroller, and have also tried
>>>> explicitly setting the number of (fake) processors:
>>>> vtk_mpi_controller->SetNumberOfProcesses(4);
>>>>
>>>> Could I ask what the recommended way to now use the vtkXMLPUnstructuredGridWriter
>>>> is from a completely serial code where I still wish to write out piece
>>>> meshes (and a corresponding pvtu) and do not have a communicator?  I should
>>>> add this is not threaded code either.  The vtk 7.1.1 build is the same one
>>>> that is now working correctly in my mpi parallel code.
>>>>
>>>> Cheers again,
>>>> Andy
>>>>
>>>> On 6 February 2018 at 13:48, Andy Bauer <andy.bauer at kitware.com> wrote:
>>>>
>>>>> My guess is that you've forgotten:
>>>>>
>>>>> controller->SetGlobalController(controller);
>>>>>
>>>>> Could you also verify that VTK was built with MPI enabled? If you try
>>>>> my example file does that work properly for you with both VTK versions?
>>>>>
>>>>>
>>>>> On Tue, Feb 6, 2018 at 4:49 AM, Andrew Parker <
>>>>> andy.john.parker at googlemail.com> wrote:
>>>>>
>>>>>> Andy,
>>>>>>
>>>>>> To follow up.  So this is a direct copy of my source for writing vtu
>>>>>> in parallel via mpi, no edits:
>>>>>>
>>>>>> vtkSmartPointer<vtkXMLPUnstructuredGridWriter> pwriter =
>>>>>> vtkSmartPointer<vtkXMLPUnstructuredGridWriter>::New();
>>>>>> std::stringstream sss;
>>>>>> sss << outputDirectory << "/";
>>>>>> sss << outputPrefix;
>>>>>> sss << "Parts";
>>>>>> sss << ".pvtu";
>>>>>>
>>>>>> pwriter->SetFileName(sss.str().c_str());
>>>>>> pwriter->SetNumberOfPieces(comms.Size());
>>>>>> if(comms.IsParallel())
>>>>>>   pwriter->SetGhostLevel(1);
>>>>>> pwriter->SetStartPiece(comms.Rank());
>>>>>> pwriter->SetEndPiece(comms.Rank());
>>>>>> pwriter->SetInputData(cellGrid);
>>>>>> // pwriter->SetDataModeToAscii();
>>>>>> pwriter->SetDataModeToBinary();
>>>>>> pwriter->SetCompressorTypeToZLib();
>>>>>> pwriter->Write();
>>>>>>
>>>>>> and for vtp files in parallel via mpi, no edits:
>>>>>>
>>>>>> vtkSmartPointer<vtkXMLPPolyDataWriter> pwriter =
>>>>>> vtkSmartPointer<vtkXMLPPolyDataWriter>::New();
>>>>>> std::stringstream sss;
>>>>>> sss << outputDirectory << "/";
>>>>>> sss << outputPrefix;
>>>>>> sss << bcName << "_";
>>>>>> sss << prefix;
>>>>>> sss << ".pvtp";
>>>>>> std::cout << "Output file name: " << sss.str().c_str() << std::endl;
>>>>>>
>>>>>> pwriter->SetFileName(sss.str().c_str());
>>>>>> pwriter->SetNumberOfPieces(comms->Size());
>>>>>> if(comms->IsParallel())
>>>>>>   pwriter->SetGhostLevel(1);
>>>>>> pwriter->SetStartPiece(comms->Rank());
>>>>>> pwriter->SetEndPiece(comms->Rank());
>>>>>> pwriter->SetInputData(boundingFaceGrids[i]);
>>>>>> pwriter->SetDataModeToBinary();
>>>>>> //pwriter->SetDataModeToAscii();
>>>>>> pwriter->SetCompressorTypeToZLib();
>>>>>> pwriter->Write();
>>>>>>
>>>>>> I initialise the vtk-comms object in an identical way to your demo
>>>>>> code, after my own mpi-comms, and I finalize before I finalize mine.  In
>>>>>> between those calls the above source is called.  All processors partake in
>>>>>> all calls both to init the vtk-mpi and in the above writing.
>>>>>>
>>>>>> Do you have any further thoughts as to the problem?  Problem goes
>>>>>> away if I use 6.3....
>>>>>>
>>>>>> Cheers,
>>>>>> Andy
>>>>>>
>>>>>>
>>>>>> On 5 February 2018 at 18:40, Andrew Parker <
>>>>>> andy.john.parker at googlemail.com> wrote:
>>>>>>
>>>>>>> Andy,
>>>>>>>
>>>>>>> My own code. I’ve always had those Piece lines in my src from day
>>>>>>> one, and always used it via mpi, so don’t need added. All procs call all
>>>>>>> lines in my file writer. There is no if-master-section.  Literally just a
>>>>>>> vtk version number change that causes the problem. Can’t get the data files
>>>>>>> or the cut down source until tomorrow.
>>>>>>>
>>>>>>> I shared the other two links as those in addition to this post are
>>>>>>> the only places I can find that reference such a major change to the
>>>>>>> library that is undocumented and causes such a significant change to user
>>>>>>> code. Are there any further references on this change that I can read about
>>>>>>> to try to resolve this?
>>>>>>>
>>>>>>> I find it strange that this has not come up more. It would mean all
>>>>>>> users of 7.1 without the additional vtkmpicontroller lines would fail when
>>>>>>> calling a parallel writer from a parallel mpi-user-code....
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Andy
>>>>>>>
>>>>>>> On Mon, 5 Feb 2018 at 18:07, Andy Bauer <andy.bauer at kitware.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Are you using libMesh or another simulation code? You'll definitely
>>>>>>>> need the following to tell each process what piece it has:
>>>>>>>> pwriter->SetNumberOfPieces(nprocs);
>>>>>>>>
>>>>>>>> pwriter->SetStartPiece(rank);
>>>>>>>>
>>>>>>>>
>>>>>>>> pwriter->SetEndPiece(rank);
>>>>>>>>
>>>>>>>>
>>>>>>>> pwriter->Write();
>>>>>>>>
>>>>>>>> Can you share the portion of your code that uses
>>>>>>>> vtkXMLPUnstructuredGridWriter? Also, looking at the data files from 6.3 and
>>>>>>>> 7.1.1 may help.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Andy
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, Feb 5, 2018 at 12:08 PM, Andrew Parker <
>>>>>>>> andy.john.parker at googlemail.com> wrote:
>>>>>>>>
>>>>>>>>> Andy,
>>>>>>>>>
>>>>>>>>> Just moved from vtk 6.3.0 to vtk 7.1.1.  Cannot for the life of me
>>>>>>>>> get your modifications to work from your vtk_test.C.  I've included the
>>>>>>>>> vtkmpiController stuff after I init mpi myself.  I found the migration
>>>>>>>>> problem mentioned here:
>>>>>>>>>
>>>>>>>>> https://github.com/libMesh/libmesh/issues/1179
>>>>>>>>>
>>>>>>>>> and here:
>>>>>>>>>
>>>>>>>>> https://gitlab.kitware.com/vtk/vtk/issues/16924
>>>>>>>>>
>>>>>>>>> as well as this post.  My parallel unstructured grid now only
>>>>>>>>> contains one source within the piece section of the pvtu, as opposed to
>>>>>>>>> n-processor sources (all processors have real data to write and this is not
>>>>>>>>> a case of empty meshes on these processors).  I can re-link and recompile
>>>>>>>>> against 6.3 and the problem goes away and I get the correct number of
>>>>>>>>> sources written to the pvtu file as before.  Can you help?  I make
>>>>>>>>> extensive use of pvtu files from my mpi-based code and now all grid files
>>>>>>>>> (pvtu and pvtp) have stopped working just by moving to 7.1.1 (which has
>>>>>>>>> been built with mpi-enabled).
>>>>>>>>>
>>>>>>>>> Any thoughts?
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Andy
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 6 December 2016 at 16:12, Andy Bauer <andy.bauer at kitware.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi John,
>>>>>>>>>>
>>>>>>>>>> The issue is indeed due to changes that I mentioned before (i.e.
>>>>>>>>>> only data sets that have data get written out and the .pvtu file is
>>>>>>>>>> adjusted accordingly). With this change though interprocess communication
>>>>>>>>>> is required which is done the the vtkMultiProcessController::GetGlobalController()
>>>>>>>>>> object which essentially acts as MPI_COMM_WORLD within VTK. You need to
>>>>>>>>>> create a vtkMPIController which derives from vtkMultiProcessController. See
>>>>>>>>>> the attached files for how that is done. This should also be backwards
>>>>>>>>>> compatible but if it isn't, please let us know.
>>>>>>>>>>
>>>>>>>>>> Best,
>>>>>>>>>> Andy
>>>>>>>>>>
>>>>>>>>>> ps. Ignore the ADIOS stuff in there (it's commented out). I was
>>>>>>>>>> trying to do two things at once and that's why the ADIOS stuff is in the
>>>>>>>>>> CMakeLists.txt.
>>>>>>>>>>
>>>>>>>>>> On Mon, Dec 5, 2016 at 6:06 PM, John Peterson <
>>>>>>>>>> jwpeterson at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Mon, Dec 5, 2016 at 12:45 PM, Andy Bauer <
>>>>>>>>>>> andy.bauer at kitware.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Beyond this I can't think of any change off the top of my head
>>>>>>>>>>>> that would cause your issue. I looked at the repo but can't figure out the
>>>>>>>>>>>> VTK configurations from that. If you can share a simple test case which
>>>>>>>>>>>> demonstrates the issue I may be able to easily diagnose it.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Here's a standalone test code that reproduces the issue for me:
>>>>>>>>>>>
>>>>>>>>>>> https://gist.github.com/jwpeterson/92f4b8422d6fbb1056e848c9b
>>>>>>>>>>> 14ee1d7
>>>>>>>>>>>
>>>>>>>>>>> Run on two procs with: mpiexec -np 2 and I get the following
>>>>>>>>>>> test.pvtu file:
>>>>>>>>>>>
>>>>>>>>>>> <?xml version="1.0"?>
>>>>>>>>>>>> <VTKFile type="PUnstructuredGrid" version="0.1"
>>>>>>>>>>>> byte_order="LittleEndian" header_type="UInt32"
>>>>>>>>>>>> compressor="vtkZLibDataCompressor">
>>>>>>>>>>>>   <PUnstructuredGrid GhostLevel="1">
>>>>>>>>>>>>     <PPointData>
>>>>>>>>>>>>       <PDataArray type="Float64" Name="u"/>
>>>>>>>>>>>>     </PPointData>
>>>>>>>>>>>>     <PCellData>
>>>>>>>>>>>>       <PDataArray type="Int32" Name="elem_id"/>
>>>>>>>>>>>>       <PDataArray type="Int32" Name="subdomain_id"/>
>>>>>>>>>>>>       <PDataArray type="Int32" Name="processor_id"/>
>>>>>>>>>>>>     </PCellData>
>>>>>>>>>>>>     <PPoints>
>>>>>>>>>>>>       <PDataArray type="Float64" Name="Points"
>>>>>>>>>>>> NumberOfComponents="3"/>
>>>>>>>>>>>>     </PPoints>
>>>>>>>>>>>>     <Piece Source="test_0.vtu"/>
>>>>>>>>>>>>   </PUnstructuredGrid>
>>>>>>>>>>>> </VTKFile>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> As you can see, only one "Piece Source" is listed, but the
>>>>>>>>>>> output of the program is actually all 3 files (test.pvtu, test_0.vtu,
>>>>>>>>>>> test_1.vtu) and both the _0 and _1 files have nodes in them.  Furthermore,
>>>>>>>>>>> if I simply add a second "Piece Source" line corresponding to "test_1.vtu",
>>>>>>>>>>> the whole thing opens up just fine in Paraview.  I am a novice VTK
>>>>>>>>>>> programmer so it's very possible I'm doing something wrong, but this code
>>>>>>>>>>> definitely worked in VTK 6.x, and 7.0.
>>>>>>>>>>>
>>>>>>>>>>> Thanks for your help,
>>>>>>>>>>> John
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Powered by www.kitware.com
>>>>>>>>>>
>>>>>>>>>> Visit other Kitware open-source projects at
>>>>>>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>>>>>>
>>>>>>>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>>>>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>>>>>>
>>>>>>>>>> Search the list archives at: http://markmail.org/search/?q=
>>>>>>>>>> vtkusers
>>>>>>>>>>
>>>>>>>>>> Follow this link to subscribe/unsubscribe:
>>>>>>>>>> http://public.kitware.com/mailman/listinfo/vtkusers
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/
> opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> https://vtk.org/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://vtk.org/pipermail/vtkusers/attachments/20180219/ab590540/attachment.html>


More information about the vtkusers mailing list