<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 14px; ">
<div style="font-family: Calibri, sans-serif; ">
<div>
<div>The instructions I gave were for a downstream filter separate from D3. &nbsp;If you want to modify D3 itself (which sounds like a reasonable good idea for your purposes) then you will have change the value for UPDATE_NUMBER_OF_GHOST_LEVELS that the RequestData
 reads. &nbsp;If you want to go with this approach, first blow away your RequestUpdateExtent method. &nbsp;Let D3 do its regular thing. &nbsp;Then implement a RequestData method like the following:</div>
</div>
</div>
<div style="font-family: Calibri, sans-serif; "><br>
</div>
<blockquote style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 40px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
<div><font class="Apple-style-span" face="Consolas">int MyD3::RequestData(</font></div>
<div><font class="Apple-style-span" face="Consolas">
<div>&nbsp; vtkInformation *request,</div>
<div>&nbsp; vtkInformationVector **inputVector,</div>
<div>&nbsp; vtkInformationVector *outputVector)</div>
<div>{</div>
<div>
<div>&nbsp; vtkInformation *outInfo = outputVector-&gt;GetInformationObject(0);</div>
</div>
<div><br>
</div>
<div>&nbsp; int requestedGhostLevel = outInfo-&gt;Get(</div>
<div>
<div>&nbsp; &nbsp; vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());</div>
</div>
<div>&nbsp; outInfo-&gt;Set(</div>
</font><span class="Apple-style-span" style="font-family: Consolas; ">
<div>
<div>&nbsp; &nbsp; vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(),</div>
</div>
<div>&nbsp; &nbsp; requestedGhostLevel &#43; 1);</div>
<div><br>
</div>
<div>&nbsp; return this-&gt;Superclass::RequestData(request, inputVector, outputVector);</div>
<div>}</div>
<div><br>
</div>
</span></div>
</blockquote>
<div style="font-family: Calibri, sans-serif; ">I don't know if the executive is going to get upset about you changing UPDATE_NUMBER_OF_GHOST_LEVELS in RequestData, but I think it will be all right.</div>
<div style="font-family: Calibri, sans-serif; "><br>
</div>
<div style="font-family: Calibri, sans-serif; ">-Ken</div>
<div style="font-family: Calibri, sans-serif; "><br>
</div>
<span id="OLK_SRC_BODY_SECTION" style="font-family: Calibri, sans-serif; ">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Andrew Parker &lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt;<br>
<span style="font-weight:bold">Date: </span>Wednesday, November 7, 2012 9:31 AM<br>
<span style="font-weight:bold">To: </span>George Zagaris &lt;<a href="mailto:george.zagaris@kitware.com">george.zagaris@kitware.com</a>&gt;<br>
<span style="font-weight:bold">Cc: </span>Kenneth Moreland &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt;, &quot;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&quot; &lt;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&gt;, &quot;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&quot;
 &lt;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&gt;<br>
<span style="font-weight:bold">Subject: </span>[EXTERNAL] Re: [vtkusers] [Paraview] vtkDistributedDataFilter and ghost cells - PROGRESS<br>
</div>
<div><br>
</div>
<blockquote id="MAC_OUTLOOK_ATTRIBUTION_BLOCKQUOTE" style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;">
<div>
<div>So I've added this in an .cpp file and complied it:
<div><br>
</div>
<div>
<div>vtkStandardNewMacro(MyD3)</div>
<div><br>
</div>
<div>MyD3::MyD3()</div>
<div>: vtkDistributedDataFilter()</div>
<div>{</div>
<div>}</div>
<div><br>
</div>
<div>void MyD3::PrintSelf(ostream&amp; os, vtkIndent indent)</div>
<div>{ &nbsp;</div>
<div>&nbsp; this-&gt;Superclass::PrintSelf(os,indent);</div>
<div>}</div>
<div><br>
</div>
<div>int MyD3::RequestUpdateExtent(vtkInformation *vtkNotUsed(request),</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp; &nbsp;vtkInformationVector **inputVector,</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp; &nbsp;vtkInformationVector *outputVector)</div>
<div>{</div>
<div>&nbsp; // get the info objects</div>
<div>&nbsp; vtkInformation *inInfo = inputVector[0]-&gt;GetInformationObject(0);</div>
<div>&nbsp; vtkInformation *outInfo = outputVector-&gt;GetInformationObject(0);</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; int piece, numPieces, ghostLevels;</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; // We require an extra layer of ghost cells from upstream.</div>
<div>&nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; piece = outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());</div>
<div>&nbsp; numPieces = outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());</div>
<div>&nbsp; ghostLevels = outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS()) &#43; 1; //##### New bit, modified from Ken's notes</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(), piece);</div>
<div>&nbsp; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(), numPieces);</div>
<div>&nbsp; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(), ghostLevels);</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; return 1;</div>
<div>}</div>
<div><br>
</div>
<div>And I add this to a .h file:</div>
<div><br>
</div>
<div>
<div>class MyD3</div>
<div>&nbsp; : public vtkDistributedDataFilter</div>
<div>{</div>
<div>&nbsp; vtkTypeMacro(MyD3, vtkDistributedDataFilter);</div>
<div>&nbsp;&nbsp;</div>
<div>public:</div>
<div>&nbsp; static MyD3 *New();</div>
<div>&nbsp; void PrintSelf(ostream&amp; os, vtkIndent indent);</div>
<div>&nbsp;&nbsp;int RequestUpdateExtent(vtkInformation *vtkNotUsed(request),</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;vtkInformationVector **inputVector,</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;vtkInformationVector *outputVector);</div>
<div>protected:</div>
<div>&nbsp; MyD3();</div>
<div>&nbsp;</div>
<div>private:</div>
<div>&nbsp; // MyD3(const MyD3&amp;); &nbsp;// Not implemented.</div>
<div>&nbsp; // void operator=(const MyD3&amp;); &nbsp;// Not implemented.</div>
<div>};</div>
</div>
<div><br>
</div>
<div>I then invoke it in parallel 3 way, as I did before, but now using:</div>
<div><br>
</div>
<div>
<div>&nbsp; vtkSmartPointer&lt;MyD3&gt; dd = vtkSmartPointer&lt;MyD3&gt;::New();</div>
<div>&nbsp;</div>
<div>&nbsp; // here mesh is a vtkUnstructuredGrid on each processor, obtained from other (non-vtk) means, but represents a valid and checked subset of the entire mesh.</div>
<div>&nbsp; dd-&gt;SetInput(mesh);</div>
<div>&nbsp;&nbsp;dd-&gt;SetController(getVtkController());</div>
<div>&nbsp; dd-&gt;SetBoundaryModeToSplitBoundaryCells(); &nbsp;// clipping</div>
<div>&nbsp; dd-&gt;UseMinimalMemoryOff();</div>
<div>&nbsp; dd-&gt;Update();</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; vtkSmartPointer&lt;vtkUnstructuredGrid&gt; ddUmesh(vtkUnstructuredGrid::SafeDownCast(dd-&gt;GetOutput()));</div>
<div>&nbsp;&nbsp;</div>
<div>&nbsp; auto ids = ddUmesh-&gt;GetPointData()-&gt;GetGlobalIds();</div>
<div>&nbsp; auto cids = ddUmesh-&gt;GetCellData()-&gt;GetGlobalIds();</div>
<div><br>
</div>
</div>
<div>########################</div>
<div>Notes:</div>
<div><br>
</div>
<div>1) Both ids, and cids remain null, although I now understand from Ken that cids will always be null as they're not created.</div>
<div>2) Using totalview and stopping the code in parallel 3 way on line 670 of vtkDistributedDataFilter.cxx, the member this-&gt;GhostLevel is always zero and never executes codes branches dependent on it, however, the above code successfully increments the&nbsp;ghostLevels
 to one.</div>
<div>3) So basically moved forward a little bit, but still not working. &nbsp;Any thoughts??</div>
<div>4) If I had created the ghost cells, how would I know, is my next question. &nbsp;How can I visualise them to check?</div>
<div><br>
</div>
<div>Any thoughts really welcome.</div>
<div><br>
</div>
<div>Cheers again,</div>
<div>Andy</div>
<div><br>
</div>
<div><br>
</div>
<br>
<div class="gmail_quote">On 7 November 2012 14:50, George Zagaris <span dir="ltr">
&lt;<a href="mailto:george.zagaris@kitware.com" target="_blank">george.zagaris@kitware.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Wed, Nov 7, 2012 at 9:34 AM, Andrew Parker<br>
&lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt; wrote:<br>
&gt; Many thanks for that. &nbsp;I perform some threshold stuff early on, so basically<br>
&gt;<br>
<br>
</div>
Perhaps an easy solution is to append a &quot;GlobalCellID&quot; and<br>
&quot;GlobalNodeID&quot; before thresholding. To the best of my knowledge,<br>
threshold will extract vtkUnstructuredGrid instance from whatever goes<br>
in the input and not automatically retain this type of global<br>
information.<br>
<br>
Hope this helps.<br>
<br>
Best,<br>
George<br>
<div class="HOEnZb">
<div class="h5"><br>
&gt; On 7 November 2012 13:00, George Zagaris &lt;<a href="mailto:george.zagaris@kitware.com">george.zagaris@kitware.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hello,<br>
&gt;&gt;<br>
&gt;&gt; Since the data is essentially structured (rectilinear grids), I think<br>
&gt;&gt; the best way to get the global/local mapping is to use extent<br>
&gt;&gt; information. Specifically, you need the whole extent of the grid and<br>
&gt;&gt; the global extent of each partition. Then from the global IJK of a<br>
&gt;&gt; point or cell, and the whole extent you can use methods from<br>
&gt;&gt; vtkStructuredData to compute the corresponding global linear index for<br>
&gt;&gt; a point or cell. Do you have extent information?<br>
&gt;&gt;<br>
&gt;&gt; Also, I have done some work on ghost generation in VTK for structured<br>
&gt;&gt; (and AMR) data. Unfortunately, currently it doesn't work outside the<br>
&gt;&gt; box with rectilinear grids. This functionality can still be used to<br>
&gt;&gt; create ghost layers and exchange the fields (node and/or cell data) on<br>
&gt;&gt; the grid but, it doesn't communicate the coordindates on the<br>
&gt;&gt; rectilinear grid. Alternatively, you may be able to converge to a<br>
&gt;&gt; solution faster if you convert the rectilinear grid to a<br>
&gt;&gt; vtkStructuredGrid and use vtkPStructuredGridConnectivity or<br>
&gt;&gt; vtkPStructuredGridGhostDataGenerator to generate ghost layers. There<br>
&gt;&gt; are tests that illustrate how to use these classes and I can provide<br>
&gt;&gt; more information if you are interested.<br>
&gt;&gt;<br>
&gt;&gt; Best,<br>
&gt;&gt; George<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Nov 7, 2012 at 7:22 AM, Moreland, Kenneth &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; Hmmm. I thought global point IDs were always created. Maybe it only<br>
&gt;&gt; &gt; happens<br>
&gt;&gt; &gt; when ghost cells are created. Try getting that working first.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; As far as global cell IDs are concerned, you are out of luck.<br>
&gt;&gt; &gt; vtkDistributedDataFilter does not create them. But they are not all that<br>
&gt;&gt; &gt; useful anyway since, unlike points, once you remove the out cells there<br>
&gt;&gt; &gt; is<br>
&gt;&gt; &gt; no overlap. Usually you can get all the information you want from the<br>
&gt;&gt; &gt; ghost<br>
&gt;&gt; &gt; level.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; If you really need global cell IDs, I'm sure you would have no trouble<br>
&gt;&gt; &gt; making them yourself. I would do it before running<br>
&gt;&gt; &gt; vtkDistributedDataFilter.<br>
&gt;&gt; &gt; Assuming when you first read in your data you have no duplicate cells,<br>
&gt;&gt; &gt; just<br>
&gt;&gt; &gt; label those on process 0 as 0..N_0, those on process 1 as N_0&#43;1..N_1,<br>
&gt;&gt; &gt; and so<br>
&gt;&gt; &gt; on.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; -Ken<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Sent from my iPad so blame autocorrect.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Nov 7, 2012, at 2:38 AM, &quot;Andrew Parker&quot;<br>
&gt;&gt; &gt; &lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So that's working now in terms of the cast, forgot GetOutput() inside<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; cast operator! &nbsp;The returned vtkUGrid is now fully populated and<br>
&gt;&gt; &gt; contains<br>
&gt;&gt; &gt; sensible information.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; However, both getPointData()-&gt;GetGlobalIds() &nbsp;and<br>
&gt;&gt; &gt; getCellData()-&gt;GetGlobalIds() return null pointers. &nbsp;Any thoughts?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Also, should I be using CellData since I want the cell global to local<br>
&gt;&gt; &gt; mapping for cells not the nodes, at the moment at least?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On 6 November 2012 19:05, Moreland, Kenneth &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Perhaps it is outputting a composite data set of some type? &nbsp;Try<br>
&gt;&gt; &gt;&gt; running<br>
&gt;&gt; &gt;&gt; GetClassName() to see what type of data object it really is.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; -Ken<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; From: Andrew Parker &lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt;<br>
&gt;&gt; &gt;&gt; Date: Tuesday, November 6, 2012 9:50 AM<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; To: Kenneth Moreland &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt;<br>
&gt;&gt; &gt;&gt; Cc: &quot;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&quot; &lt;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&gt;, &quot;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&quot;<br>
&gt;&gt; &gt;&gt; &lt;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&gt;<br>
&gt;&gt; &gt;&gt; Subject: [EXTERNAL] Re: [Paraview] vtkDistributedDataFilter and ghost<br>
&gt;&gt; &gt;&gt; cells<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Thanks on both accounts. &nbsp;Any thoughts why the downcast called after<br>
&gt;&gt; &gt;&gt; dd-&gt;Update() on distributedDataFilter is a null pointer? &nbsp;As in, dd is<br>
&gt;&gt; &gt;&gt; working perfectly properly, but I don't seem to be able to extract a<br>
&gt;&gt; &gt;&gt; valid<br>
&gt;&gt; &gt;&gt; unstructuredgrid. &nbsp;For a follow up question I assume<br>
&gt;&gt; &gt;&gt; getPointData()-&gt;GetGlobalIds() gives the local to global for the mesh<br>
&gt;&gt; &gt;&gt; nodes,<br>
&gt;&gt; &gt;&gt; and I should use getCellData()-&gt;GetGlobalIds() to get the local to<br>
&gt;&gt; &gt;&gt; global<br>
&gt;&gt; &gt;&gt; for the cells? &nbsp;Once I get a valid pointer that is....<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Cheers again,<br>
&gt;&gt; &gt;&gt; Andy<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On 6 November 2012 16:40, Moreland, Kenneth &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; You should be able to do a vtkUnstructuredGrid::SafeDownCast() to the<br>
&gt;&gt; &gt;&gt;&gt; data to get the unstructured mesh (and access to the point data).<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; -Ken<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; From: Andrew Parker &lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; Date: Tuesday, November 6, 2012 9:32 AM<br>
&gt;&gt; &gt;&gt;&gt; To: Kenneth Moreland &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; Cc: &quot;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&quot; &lt;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&gt;, &quot;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&quot;<br>
&gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt; Subject: [EXTERNAL] Re: [Paraview] vtkDistributedDataFilter and ghost<br>
&gt;&gt; &gt;&gt;&gt; cells<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Another question which I'd forgotten, how do I get to a<br>
&gt;&gt; &gt;&gt;&gt; vtkUnstructuredGrid per processor from the vtkDistributedDataFilter.<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; For instance, dd-&gt;GetOutput()-&gt;GetPointData()-&gt;GetGlobalIds() doesn't<br>
&gt;&gt; &gt;&gt;&gt; work as it's a vtkDataObject<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Stupid question I'm sure but the doxy notes say this type returns an<br>
&gt;&gt; &gt;&gt;&gt; unstructured mesh, but I can't seem to get it out?<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Also, why exactly do I need the vtkPieceScalars and<br>
&gt;&gt; &gt;&gt;&gt; vtkDataSetSurfaceFilter again? If the above can be made to work and<br>
&gt;&gt; &gt;&gt;&gt; return<br>
&gt;&gt; &gt;&gt;&gt; the mapping, what are they adding in terms of information?<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; Thanks again,<br>
&gt;&gt; &gt;&gt;&gt; Andy<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; On 6 November 2012 16:00, Moreland, Kenneth &lt;<a href="mailto:kmorel@sandia.gov">kmorel@sandia.gov</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; I believe vtkDistributedDataFilter will always return with global<br>
&gt;&gt; &gt;&gt;&gt;&gt; point<br>
&gt;&gt; &gt;&gt;&gt;&gt; ids (a mapping from local point ids to global point ids), although it<br>
&gt;&gt; &gt;&gt;&gt;&gt; might<br>
&gt;&gt; &gt;&gt;&gt;&gt; pass them if they already exist. &nbsp;So<br>
&gt;&gt; &gt;&gt;&gt;&gt; dd-&gt;GetOutput()-&gt;GetPointData()-&gt;GetGlobalIds() should return the<br>
&gt;&gt; &gt;&gt;&gt;&gt; array that<br>
&gt;&gt; &gt;&gt;&gt;&gt; gives this mapping.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Ghost cells are only created on demand, and this is usually done by<br>
&gt;&gt; &gt;&gt;&gt;&gt; pipeline convention. &nbsp;If you have a filter that needs a layer of<br>
&gt;&gt; &gt;&gt;&gt;&gt; ghost<br>
&gt;&gt; &gt;&gt;&gt;&gt; cells, it should override the RequestUpdateExtent method to increment<br>
&gt;&gt; &gt;&gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt;&gt;&gt; value of UPDATE_NUMBER_OF_GHOST_LEVELS from the output information to<br>
&gt;&gt; &gt;&gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt;&gt;&gt; input information. &nbsp;This method would look something like this.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; int vtkDistributedDataFilter::RequestUpdateExtent(<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; vtkInformation *vtkNotUsed(request),<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; vtkInformationVector **inputVector,<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; vtkInformationVector *outputVector)<br>
&gt;&gt; &gt;&gt;&gt;&gt; {<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; // get the info objects<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; vtkInformation *inInfo = inputVector[0]-&gt;GetInformationObject(0);<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; vtkInformation *outInfo = outputVector-&gt;GetInformationObject(0);<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; int piece, numPieces, ghostLevels;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; // We require an extra layer of ghost cells from upstream.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; piece =<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; numPieces =<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; ghostLevels =<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; outInfo-&gt;Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS());<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER(),<br>
&gt;&gt; &gt;&gt;&gt;&gt; piece);<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES(),<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; numPieces);<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; inInfo-&gt;Set(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_GHOST_LEVELS(),<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ghostLevels);<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp; return 1;<br>
&gt;&gt; &gt;&gt;&gt;&gt; }<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; The operation of the RequestData method should also strip off this<br>
&gt;&gt; &gt;&gt;&gt;&gt; layer<br>
&gt;&gt; &gt;&gt;&gt;&gt; of ghost cells. &nbsp;It might be possible to request a layer of ghost<br>
&gt;&gt; &gt;&gt;&gt;&gt; cells by<br>
&gt;&gt; &gt;&gt;&gt;&gt; setting UPDATE_NUMBER_OF_GHOST_LEVELS at the bottom of the pipeline,<br>
&gt;&gt; &gt;&gt;&gt;&gt; but I'm<br>
&gt;&gt; &gt;&gt;&gt;&gt; not totally sure how to make that work. &nbsp;It's probably easier (or at<br>
&gt;&gt; &gt;&gt;&gt;&gt; least<br>
&gt;&gt; &gt;&gt;&gt;&gt; cleaner) to do it from within a filter.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; -Ken<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; From: Andrew Parker &lt;<a href="mailto:andy.john.parker@googlemail.com">andy.john.parker@googlemail.com</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Date: Tuesday, November 6, 2012 8:25 AM<br>
&gt;&gt; &gt;&gt;&gt;&gt; To: &quot;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&quot; &lt;<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a>&gt;, &quot;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&quot;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &lt;<a href="mailto:paraview@paraview.org">paraview@paraview.org</a>&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Subject: [EXTERNAL] [Paraview] vtkDistributedDataFilter and ghost<br>
&gt;&gt; &gt;&gt;&gt;&gt; cells<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Hi,<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Hope you can help. &nbsp;I have some code running in parallel, that by<br>
&gt;&gt; &gt;&gt;&gt;&gt; other<br>
&gt;&gt; &gt;&gt;&gt;&gt; means I have constructed nprocs worth of vtkRectilinearGrids, one per<br>
&gt;&gt; &gt;&gt;&gt;&gt; process. &nbsp;Each of which is a valid nprocs-worth of the whole serial<br>
&gt;&gt; &gt;&gt;&gt;&gt; mesh,<br>
&gt;&gt; &gt;&gt;&gt;&gt; I've check this and I am happy with that i.e. it's partitioned<br>
&gt;&gt; &gt;&gt;&gt;&gt; properly and<br>
&gt;&gt; &gt;&gt;&gt;&gt; nothing is missing. &nbsp;I need the following information to process my<br>
&gt;&gt; &gt;&gt;&gt;&gt; data in<br>
&gt;&gt; &gt;&gt;&gt;&gt; parallel:<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; 1) I would like the local -&gt; global cell mapping between the local<br>
&gt;&gt; &gt;&gt;&gt;&gt; rgrid<br>
&gt;&gt; &gt;&gt;&gt;&gt; and the corresponding global single mesh.<br>
&gt;&gt; &gt;&gt;&gt;&gt; 2) I would like to know which cells are on processor boundaries for<br>
&gt;&gt; &gt;&gt;&gt;&gt; parallel exchange purposes.<br>
&gt;&gt; &gt;&gt;&gt;&gt; 3) I would like all the double arrays per processor to be &quot;expanded&quot;<br>
&gt;&gt; &gt;&gt;&gt;&gt; by<br>
&gt;&gt; &gt;&gt;&gt;&gt; the amount of (1 level of) ghost cells such that I can properly do<br>
&gt;&gt; &gt;&gt;&gt;&gt; the<br>
&gt;&gt; &gt;&gt;&gt;&gt; computations I want with the ability to exchange only those<br>
&gt;&gt; &gt;&gt;&gt;&gt; additional cells<br>
&gt;&gt; &gt;&gt;&gt;&gt; given the local to global mapping.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; I have tried from the examples to use the following code, which I<br>
&gt;&gt; &gt;&gt;&gt;&gt; call<br>
&gt;&gt; &gt;&gt;&gt;&gt; on every process, each of which has it's own local rgrid as I said.<br>
&gt;&gt; &gt;&gt;&gt;&gt; I do<br>
&gt;&gt; &gt;&gt;&gt;&gt; the following:<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;vtkSmartPointer&lt;vtkDistributedDataFilter&gt; dd =<br>
&gt;&gt; &gt;&gt;&gt;&gt; vtkSmartPointer&lt;vtkDistributedDataFilter&gt;::New();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dd-&gt;SetInput(rgrid);<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dd-&gt;SetController(getVtkController());<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dd-&gt;SetBoundaryModeToSplitBoundaryCells();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;//dd-&gt;SetBoundaryModeToAssignToOneRegion();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;//dd-&gt;SetBoundaryModeToAssignToAllIntersectingRegions();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dd-&gt;UseMinimalMemoryOff();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dd-&gt;Update();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;vtkPieceScalars *ps = vtkPieceScalars::New();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;ps-&gt;SetInputConnection(dd-&gt;GetOutputPort());<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;ps-&gt;SetScalarModeToCellData();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;vtkDataSetSurfaceFilter *dss = vtkDataSetSurfaceFilter::New();<br>
&gt;&gt; &gt;&gt;&gt;&gt; &nbsp;dss-&gt;SetInputConnection(ps-&gt;GetOutputPort());<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; The dd object works fine and writing its contents out on each<br>
&gt;&gt; &gt;&gt;&gt;&gt; processor<br>
&gt;&gt; &gt;&gt;&gt;&gt; gives nprocs worth of meshes, each of which look slightly different<br>
&gt;&gt; &gt;&gt;&gt;&gt; to the<br>
&gt;&gt; &gt;&gt;&gt;&gt; way I've partitioned them up, but sum to the same serial mesh so I am<br>
&gt;&gt; &gt;&gt;&gt;&gt; happy<br>
&gt;&gt; &gt;&gt;&gt;&gt; with that working correctly. But I can't for the life of me figure<br>
&gt;&gt; &gt;&gt;&gt;&gt; out how<br>
&gt;&gt; &gt;&gt;&gt;&gt; to obtain local to global cell mappings, allocate ghost cells, or<br>
&gt;&gt; &gt;&gt;&gt;&gt; work out<br>
&gt;&gt; &gt;&gt;&gt;&gt; how to exchange data given the above partition info and comms....<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Note I have not provided any additional information to &quot;dd&quot; regarding<br>
&gt;&gt; &gt;&gt;&gt;&gt; global cells as per the doxy notes so I assume it went away and<br>
&gt;&gt; &gt;&gt;&gt;&gt; computed it.<br>
&gt;&gt; &gt;&gt;&gt;&gt; I can't figure out how to extract it however. &nbsp;I also have no idea<br>
&gt;&gt; &gt;&gt;&gt;&gt; how to<br>
&gt;&gt; &gt;&gt;&gt;&gt; modify each local processor rgrid to include the ghost cells for that<br>
&gt;&gt; &gt;&gt;&gt;&gt; processor. &nbsp;Finally given that info, I could exchange between<br>
&gt;&gt; &gt;&gt;&gt;&gt; processors to<br>
&gt;&gt; &gt;&gt;&gt;&gt; write to each local processors ghost cells the corresponding &quot;real&quot;<br>
&gt;&gt; &gt;&gt;&gt;&gt; cell<br>
&gt;&gt; &gt;&gt;&gt;&gt; data from the neighbouring meshes and continue the code.<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Any help really appreciated!<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;&gt; Cheers,<br>
&gt;&gt; &gt;&gt;&gt;&gt; Andy<br>
&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; --<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; __________________________________<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &nbsp; &nbsp;Dr Andrew Parker<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt; &nbsp; &nbsp;Em@il: &nbsp;<a href="mailto:andrew.parker@cantab.net">andrew.parker@cantab.net</a><br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; __________________________________<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &nbsp; &nbsp;Dr Andrew Parker<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &nbsp; &nbsp;Em@il: &nbsp;<a href="mailto:andrew.parker@cantab.net">andrew.parker@cantab.net</a><br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; __________________________________<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &nbsp; &nbsp;Dr Andrew Parker<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &nbsp; &nbsp;Em@il: &nbsp;<a href="mailto:andrew.parker@cantab.net">andrew.parker@cantab.net</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">
http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the VTK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt;<br>
&gt; __________________________________<br>
&gt;<br>
&gt; &nbsp; &nbsp;Dr Andrew Parker<br>
&gt;<br>
&gt; &nbsp; &nbsp;Em@il: &nbsp;<a href="mailto:andrew.parker@cantab.net">andrew.parker@cantab.net</a><br>
&gt;<br>
&gt;<br>
</div>
</div>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<p>__________________________________</p>
<p>&nbsp;&nbsp; Dr Andrew Parker</p>
<p>&nbsp;&nbsp; <a href="mailto:Em@il" target="_blank">Em@il</a>:&nbsp; <a href="mailto:andrew.parker@cantab.net" target="_blank">
andrew.parker@cantab.net</a></p>
<br>
</div>
</div>
</div>
</blockquote>
</span>
</body>
</html>