[vtkusers] [Paraview] vtkDistributedDataFilter and ghost cells

Andrew Parker andy.john.parker at googlemail.com
Tue Nov 6 11:50:49 EST 2012


Thanks on both accounts.  Any thoughts why the downcast called after
dd->Update() on distributedDataFilter is a null pointer?  As in, dd is
working perfectly properly, but I don't seem to be able to extract a valid
unstructuredgrid.  For a follow up question I assume
getPointData()->GetGlobalIds() gives the local to global for the mesh
nodes, and I should use getCellData()->GetGlobalIds() to get the local to
global for the cells?  Once I get a valid pointer that is....

Cheers again,
Andy

On 6 November 2012 16:40, Moreland, Kenneth <kmorel at sandia.gov> wrote:

>   You should be able to do a vtkUnstructuredGrid::SafeDownCast() to the
> data to get the unstructured mesh (and access to the point data).
>
>  -Ken
>
>   From: Andrew Parker <andy.john.parker at googlemail.com>
> Date: Tuesday, November 6, 2012 9:32 AM
> To: Kenneth Moreland <kmorel at sandia.gov>
> Cc: "vtkusers at vtk.org" <vtkusers at vtk.org>, "paraview at paraview.org" <
> paraview at paraview.org>
> Subject: [EXTERNAL] Re: [Paraview] vtkDistributedDataFilter and ghost
> cells
>
>   Another question which I'd forgotten, how do I get to a
> vtkUnstructuredGrid per processor from the vtkDistributedDataFilter.
>
>  For instance, dd->GetOutput()->GetPointData()->GetGlobalIds() doesn't
> work as it's a vtkDataObject
>
>  Stupid question I'm sure but the doxy notes say this type returns an
> unstructured mesh, but I can't seem to get it out?
>
>  Also, why exactly do I need the vtkPieceScalars and
> vtkDataSetSurfaceFilter again? If the above can be made to work and
> return the mapping, what are they adding in terms of information?
>
>  Thanks again,
> Andy
>
> On 6 November 2012 16:00, Moreland, Kenneth <kmorel at sandia.gov> wrote:
>
>>   I believe vtkDistributedDataFilter will always return with global
>> point ids (a mapping from local point ids to global point ids), although it
>> might pass them if they already exist.  So
>> dd->GetOutput()->GetPointData()->GetGlobalIds() should return the array
>> that gives this mapping.
>>
>>  Ghost cells are only created on demand, and this is usually done by
>> pipeline convention.  If you have a filter that needs a layer of ghost
>> cells, it should override the RequestUpdateExtent method to increment the
>> value of UPDATE_NUMBER_OF_GHOST_LEVELS from the output information to the
>> input information.  This method would look something like this.
>>
>>   int vtkDistributedDataFilter::RequestUpdateExtent(
>>   vtkInformation *vtkNotUsed(request),
>>   vtkInformationVector **inputVector,
>>   vtkInformationVector *outputVector)
>> {
>>   // get the info objects
>>   vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
>>   vtkInformation *outInfo = outputVector->GetInformationObject(0);
>>
>>    int piece, numPieces, ghostLevels;
>>
>>    // We require an extra layer of ghost cells from upstream.
>>
>>    piece =
>> outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());
>>   numPieces =
>>
>> outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());
>>   ghostLevels =
>>     outInfo->Get(
>> vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());
>>
>>    inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(),
>> piece);
>>   inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(),
>>               numPieces);
>>
>> inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(),
>>               ghostLevels);
>>
>>    return 1;
>> }
>>
>>
>>  The operation of the RequestData method should also strip off this
>> layer of ghost cells.  It might be possible to request a layer of ghost
>> cells by setting UPDATE_NUMBER_OF_GHOST_LEVELS at the bottom of the
>> pipeline, but I'm not totally sure how to make that work.  It's probably
>> easier (or at least cleaner) to do it from within a filter.
>>
>>  -Ken
>>
>>   From: Andrew Parker <andy.john.parker at googlemail.com>
>> Date: Tuesday, November 6, 2012 8:25 AM
>> To: "vtkusers at vtk.org" <vtkusers at vtk.org>, "paraview at paraview.org" <
>> paraview at paraview.org>
>> Subject: [EXTERNAL] [Paraview] vtkDistributedDataFilter and ghost cells
>>
>>   Hi,
>>
>>  Hope you can help.  I have some code running in parallel, that by other
>> means I have constructed nprocs worth of vtkRectilinearGrids, one per
>> process.  Each of which is a valid nprocs-worth of the whole serial mesh,
>> I've check this and I am happy with that i.e. it's partitioned properly and
>> nothing is missing.  I need the following information to process my data in
>> parallel:
>>
>>  1) I would like the local -> global cell mapping between the local
>> rgrid and the corresponding global single mesh.
>> 2) I would like to know which cells are on processor boundaries for
>> parallel exchange purposes.
>> 3) I would like all the double arrays per processor to be "expanded" by
>> the amount of (1 level of) ghost cells such that I can properly do the
>> computations I want with the ability to exchange only those additional
>> cells given the local to global mapping.
>>
>>  I have tried from the examples to use the following code, which I call
>> on every process, each of which has it's own local rgrid as I said.  I do
>> the following:
>>
>>   vtkSmartPointer<vtkDistributedDataFilter> dd =
>> vtkSmartPointer<vtkDistributedDataFilter>::New();
>>   dd->SetInput(rgrid);
>>
>>  dd->SetController(getVtkController());
>>   dd->SetBoundaryModeToSplitBoundaryCells();
>>  //dd->SetBoundaryModeToAssignToOneRegion();
>>  //dd->SetBoundaryModeToAssignToAllIntersectingRegions();
>>  dd->UseMinimalMemoryOff();
>>  dd->Update();
>>   vtkPieceScalars *ps = vtkPieceScalars::New();
>>  ps->SetInputConnection(dd->GetOutputPort());
>>  ps->SetScalarModeToCellData();
>>   vtkDataSetSurfaceFilter *dss = vtkDataSetSurfaceFilter::New();
>>  dss->SetInputConnection(ps->GetOutputPort());
>>
>>  The dd object works fine and writing its contents out on each processor
>> gives nprocs worth of meshes, each of which look slightly different to the
>> way I've partitioned them up, but sum to the same serial mesh so I am happy
>> with that working correctly. But I can't for the life of me figure out how
>> to obtain local to global cell mappings, allocate ghost cells, or work out
>> how to exchange data given the above partition info and comms....
>>
>>  Note I have not provided any additional information to "dd" regarding
>> global cells as per the doxy notes so I assume it went away and computed
>> it.  I can't figure out how to extract it however.  I also have no idea how
>> to modify each local processor rgrid to include the ghost cells for that
>> processor.  Finally given that info, I could exchange between processors to
>> write to each local processors ghost cells the corresponding "real" cell
>> data from the neighbouring meshes and continue the code.
>>
>>  Any help really appreciated!
>>
>> Cheers,
>> Andy
>>
>>
>
>
>  --
>
> __________________________________
>
>    Dr Andrew Parker
>
>    Em at il:  andrew.parker at cantab.net
>
>


-- 

__________________________________

   Dr Andrew Parker

   Em at il:  andrew.parker at cantab.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20121106/f5e95b62/attachment.htm>


More information about the vtkusers mailing list