<HTML>
<HEAD>
<TITLE>Re: [Paraview] Parallel Data Redistribution</TITLE>
</HEAD>
<BODY>
<FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>In either case, I&#8217;m thinking this is not a great idea if the filter John is writing is intended to be used with anything other than his special reader. &nbsp;Otherwise, the reader is going to get the request and do something unpredictable.<BR>
<BR>
Maybe a safer approach is to make a new key like UPDATE_NO_DATA. &nbsp;The filter could then set request some arbitrary piece and number of pieces and also add UPDATE_NO_DATA to its input. &nbsp;If the reader understand UPDATE_NO_DATA, it will not actually read the data requested. &nbsp;If it does not understand, it will simply read a piece that is ignored: no big deal. &nbsp;That said, is this adding unnecessary complications to the pipeline mechanisms (which are already difficult for reader/filter designers)?<BR>
<BR>
-Ken<BR>
<BR>
<BR>
On 12/15/09 12:48 PM, &quot;Berk Geveci&quot; &lt;<a href="berk.geveci@kitware.com">berk.geveci@kitware.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>In the past we had the pipeline execution stop if update number of<BR>
pieces was 0. We can easily add that back in. It would be a one line<BR>
change in vtkStreamingDemandDrivePipeline::NeedToExecuteData().<BR>
<BR>
Alternatively, the reader could check for UPDATE_NUMBER_OF_PIECES and<BR>
do nothing it is is 0. I think that's better that requested piece<BR>
being -1 which is ambiguous.<BR>
<BR>
-berk<BR>
<BR>
On Tue, Dec 15, 2009 at 2:41 PM, Moreland, Kenneth &lt;<a href="kmorel@sandia.gov">kmorel@sandia.gov</a>&gt; wrote:<BR>
&gt; I think the part that John wants that is missing is the ability for a filter<BR>
&gt; to say I want no data (or simply, I don&#8217;t care).  The idea being that during<BR>
&gt; the RequestUpdateExtent phase you could send a flag to tell the pipeline to<BR>
&gt; not propagate the request upstream.  Instead, simply call RequestData and<BR>
&gt; propagate back down.  However, like Berk said, this is a bad idea because<BR>
&gt; any upstream objects that do parallel communication will lock up.  I would<BR>
&gt; hope that your reader itself does parallel communication.  You&#8217;re going to<BR>
&gt; get contention on your disks otherwise as different processes request the<BR>
&gt; same pieces.<BR>
&gt;<BR>
&gt; I suppose the filter could also simply request piece &#8211;1 and the reader could<BR>
&gt; take that as a flag to read nothing.  Assuming neither the executive or<BR>
&gt; another filter tries to do anything with the piece number you should be OK,<BR>
&gt; but I don&#8217;t know if that will just work.<BR>
&gt;<BR>
&gt; -Ken<BR>
&gt;<BR>
&gt;<BR>
&gt; On 12/15/09 9:21 AM, &quot;Berk Geveci&quot; &lt;<a href="berk.geveci@kitware.com">berk.geveci@kitware.com</a>&gt; wrote:<BR>
&gt;<BR>
&gt; Hmmm. I don't exactly see the difference between the two (I mean<BR>
&gt; streaming and distributing). In your case, I would think that a filter<BR>
&gt; can arbitrarily change the pipeline request to either request nothing<BR>
&gt; or ask the same piece on two processes. It would like this:<BR>
&gt;<BR>
&gt; reader0 - request piece 0 of 1 - filter - request piece 0 of 1 -<BR>
&gt; update suppressor<BR>
&gt; reader1 - request piece 0 of 1 - filter - request piece 1 of 1 -<BR>
&gt; update suppressor<BR>
&gt;<BR>
&gt; This should work fine as long as the reader does not have another<BR>
&gt; consumer (for example a representation if the visibility is on) that<BR>
&gt; is asking for a different piece. The following should also work<BR>
&gt;<BR>
&gt; reader0 - request piece 0 of 1 - filter - request piece 0 of 1 -<BR>
&gt; update suppressor<BR>
&gt; reader1 - request piece 0 of 0 - filter - request piece 1 of 1 -<BR>
&gt; update suppressor<BR>
&gt;<BR>
&gt; Of course, if you have any filters that do parallel communication in<BR>
&gt; between, you are SOL.<BR>
&gt;<BR>
&gt; Does that make sense?<BR>
&gt;<BR>
&gt; Now if you have structured data and the frickin' extent translator<BR>
&gt; gets in between, things are not as straightforward - which why I hate<BR>
&gt; the extent translator. If I had some time/funding, I would write a new<BR>
&gt; executive that does not use structured extents.<BR>
&gt;<BR>
&gt; -berk<BR>
&gt;<BR>
&gt; On Tue, Dec 15, 2009 at 11:07 AM, Biddiscombe, John A. &lt;<a href="biddisco@cscs.ch">biddisco@cscs.ch</a>&gt;<BR>
&gt; wrote:<BR>
&gt;&gt; Berk,<BR>
&gt;&gt;<BR>
&gt;&gt; We had a discussion back in 2008, which resides here<BR>
&gt;&gt; <a href="http://www.cmake.org/pipermail/paraview/2008-May/008170.html">http://www.cmake.org/pipermail/paraview/2008-May/008170.html</a><BR>
&gt;&gt;<BR>
&gt;&gt; Continuing from this, my question of the other day, touches on the same<BR>
&gt;&gt; problem.<BR>
&gt;&gt;<BR>
&gt;&gt; I'd like to manipulate the piece number read by each reader. As mentioned<BR>
&gt;&gt; before, UPDATE_PIECE is not passed into RequestInformation at first (since<BR>
&gt;&gt; nobody knows how many pieces there are yet!), so I can't (directly) generate<BR>
&gt;&gt; information in the reader which is 'piece dependent'. And I can't be sure<BR>
&gt;&gt; that someone doing streaming won't interfere with piece numbers when using<BR>
&gt;&gt; the code differently.<BR>
&gt;&gt;<BR>
&gt;&gt; For the particle tracer (for example), I'd like to tell the upstream<BR>
&gt;&gt; pipeline to read no pieces when certain processes are empty of particles<BR>
&gt;&gt; (currently they update and generate{=read} data when they don't need to). I<BR>
&gt;&gt; may be able to suppress the forward upstream somehow, but I don't know of an<BR>
&gt;&gt; easy way for the algorithm to say &quot;Stop&quot; to the executive to prevent it<BR>
&gt;&gt; updating if the timestep changes, but the algorithm has determined that no<BR>
&gt;&gt; processing is required (ForwardUpstream of Requests continues unabated). I'd<BR>
&gt;&gt; like to set the UPdatePiece to -1 to tell the executive to stop operating.<BR>
&gt;&gt;<BR>
&gt;&gt; Also : for dynamic load balancing, I'd like to instruct several reader to<BR>
&gt;&gt; read the same piece - since the algorithm controls (for example) the<BR>
&gt;&gt; particles the algorithm can internally communicate information about what to<BR>
&gt;&gt; do amongst its processes, but it can't talk upstream to the readers and<BR>
&gt;&gt; fudge them.<BR>
&gt;&gt;<BR>
&gt;&gt; I am wondering if there is any way of supporting this kind of thing using<BR>
&gt;&gt; the current information keys and my instinct says no. It seems like the<BR>
&gt;&gt; update pice and numpieces were really intended for streaming and we need two<BR>
&gt;&gt; kinds of 'pieces', one for streaming, another for splitting in _parallel_<BR>
&gt;&gt; because they aren't quite the same. (Please note that I haven't actually<BR>
&gt;&gt; tried changing piece requests in the algorithms yet, so I'm only guessing<BR>
&gt;&gt; that it won't work properly)<BR>
&gt;&gt;<BR>
&gt;&gt; &lt;cough&gt;<BR>
&gt;&gt; UPDATE_STREAM_PIECE<BR>
&gt;&gt; UPDATE_PARALLEL_PIECE<BR>
&gt;&gt; &lt;\cough&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; Comments?<BR>
&gt;&gt;<BR>
&gt;&gt; JB<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;&gt;<BR>
&gt;&gt;&gt; I would have the reader (most parallel readers do this) generate empty<BR>
&gt;&gt;&gt; data on all processes of id &gt;= N. Then your filter can redistribute<BR>
&gt;&gt;&gt; from those N processes to all M processes. I am pretty sure<BR>
&gt;&gt;&gt; RedistributePolyData can do this for polydata as long as you set the<BR>
&gt;&gt;&gt; weight to 1 on all processes. Ditto for D3.<BR>
&gt;&gt;&gt;<BR>
&gt;&gt;&gt; -berk<BR>
&gt;&gt;&gt;<BR>
&gt;&gt;&gt; On Fri, Dec 11, 2009 at 4:13 PM, Biddiscombe, John A. &lt;<a href="biddisco@cscs.ch">biddisco@cscs.ch</a>&gt;<BR>
&gt;&gt;&gt; wrote:<BR>
&gt;&gt;&gt; &gt; Berk<BR>
&gt;&gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; It sounds like M is equal to the number of processors (pipelines) and<BR>
&gt;&gt;&gt; &gt;&gt; M &gt;&gt; N. Is that correct?<BR>
&gt;&gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt; Yes, That's the idea. N blocks, broken (in place) into M new blocks,<BR>
&gt;&gt;&gt; &gt; then<BR>
&gt;&gt;&gt; fanned out to the M processes downstream where they can be processed<BR>
&gt;&gt;&gt; separately . If it were on a single node, then each block could be a<BR>
&gt;&gt;&gt; separate 'connection' to a downstream filter, but distributed, an<BR>
&gt;&gt;&gt; explicit<BR>
&gt;&gt;&gt; send is needed.<BR>
&gt;&gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt; JB<BR>
&gt;&gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt;<BR>
&gt;&gt;&gt; &gt;&gt; -berk<BR>
&gt;&gt;&gt; &gt;&gt;<BR>
&gt;&gt;&gt; &gt;&gt; On Fri, Dec 11, 2009 at 10:40 AM, Biddiscombe, John A.<BR>
&gt;&gt;&gt; &gt;&gt; &lt;<a href="biddisco@cscs.ch">biddisco@cscs.ch</a>&gt;<BR>
&gt;&gt;&gt; &gt;&gt; wrote:<BR>
&gt;&gt;&gt; &gt;&gt; &gt; Berk<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt; The data will be UnstructuredGrid for now. Multiblock, but actually,<BR>
&gt;&gt;&gt; &gt;&gt; &gt; I<BR>
&gt;&gt;&gt; &gt;&gt; don't really care what each block is, only that I accept one block on<BR>
&gt;&gt;&gt; each<BR>
&gt;&gt;&gt; &gt;&gt; of N processes, split it into more pieces, and the next filter accepts<BR>
&gt;&gt;&gt; one<BR>
&gt;&gt;&gt; &gt;&gt; (or more if the numbers don't match up nicely) blocks and process<BR>
&gt;&gt;&gt; &gt;&gt; them.<BR>
&gt;&gt;&gt; The<BR>
&gt;&gt;&gt; &gt;&gt; redistribution shouldn't care what data types, only how many blocks in<BR>
&gt;&gt;&gt; and<BR>
&gt;&gt;&gt; &gt;&gt; out.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt; Looking at RedistributePolyData makes me realize my initial idea is<BR>
&gt;&gt;&gt; &gt;&gt; &gt; no<BR>
&gt;&gt;&gt; &gt;&gt; good. In my mind I had a pipeline where multiblock datasets are passed<BR>
&gt;&gt;&gt; down<BR>
&gt;&gt;&gt; &gt;&gt; the pipeline and simply the number of pieces is manipulated to achieve<BR>
&gt;&gt;&gt; what<BR>
&gt;&gt;&gt; &gt;&gt; I wanted - but I see now that if I have M pieces downstream mapped<BR>
&gt;&gt;&gt; upstream<BR>
&gt;&gt;&gt; &gt;&gt; to N pieces, what will happen is the readers will be effectively<BR>
&gt;&gt;&gt; duplicated<BR>
&gt;&gt;&gt; &gt;&gt; and M/N readers will read the same pieces. I don't want this to happen<BR>
&gt;&gt;&gt; &gt;&gt; as<BR>
&gt;&gt;&gt; IO<BR>
&gt;&gt;&gt; &gt;&gt; will be a big problem if readers read the same blocks M/N times.<BR>
&gt;&gt;&gt; &gt;&gt; &gt; I was hoping there was a way of simply instructing the pipeline to<BR>
&gt;&gt;&gt; manage<BR>
&gt;&gt;&gt; &gt;&gt; the pieces, but I see now that this won't work, as there needs to be a<BR>
&gt;&gt;&gt; &gt;&gt; specific Send from each N to their M/N receivers (because the data is<BR>
&gt;&gt;&gt; &gt;&gt; physically in another process, so the pipeline can't see it). This is<BR>
&gt;&gt;&gt; very<BR>
&gt;&gt;&gt; &gt;&gt; annoying as there must be a class which already does this (block<BR>
&gt;&gt;&gt; &gt;&gt; redistribution, rather than polygon level redistribution), and I would<BR>
&gt;&gt;&gt; like<BR>
&gt;&gt;&gt; &gt;&gt; it to be more 'pipeline integrated' so that the user doesn't have to<BR>
&gt;&gt;&gt; &gt;&gt; explicitly send each time an algorithm needs it.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt; I'll go through RedistributePolyData in depth and see what I can<BR>
&gt;&gt;&gt; &gt;&gt; &gt; pull<BR>
&gt;&gt;&gt; out<BR>
&gt;&gt;&gt; &gt;&gt; of it - please feel free to steer me towards another possibility :)<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt; JB<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; -----Original Message-----<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; From: Berk Geveci [<a href="mailto:berk.geveci@kitware.com">mailto:berk.geveci@kitware.com</a>]<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; Sent: 11 December 2009 16:09<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; To: Biddiscombe, John A.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; Cc: <a href="paraview@paraview.org">paraview@paraview.org</a><BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; Subject: Re: [Paraview] Parallel Data Redistribution<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; What is the data type? vtkRedistributePolyData and its subclasses<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; do<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; this for polydata. It can do load balancing (where you can specify<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; a<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; weight for each processor) as well.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; -berk<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; On Fri, Dec 11, 2009 at 9:59 AM, Biddiscombe, John A.<BR>
&gt;&gt;&gt; &lt;<a href="biddisco@cscs.ch">biddisco@cscs.ch</a>&gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; wrote:<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; I have a filter pipeline which reads N blocks from disk, this<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; works<BR>
&gt;&gt;&gt; &gt;&gt; fine<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; on N processors.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; I now wish to subdivide those N blocks (using a custom filter) to<BR>
&gt;&gt;&gt; &gt;&gt; produce<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; new data which will consist of M blocks - where M &gt;&gt; N.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; I wish to run the algorithm on M processors and have the piece<BR>
&gt;&gt;&gt; &gt;&gt; information<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; transformed between the two filters (reader -&gt; splitter), so that<BR>
&gt;&gt;&gt; blocks<BR>
&gt;&gt;&gt; &gt;&gt; are<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; distributed correctly. The reader will Read N blocks (leaving M-N<BR>
&gt;&gt;&gt; &gt;&gt; processes<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; unoccupied), but the filter which splits them up needs to output a<BR>
&gt;&gt;&gt; &gt;&gt; different<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; number of pieces and have the full M processes receiving data.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; I have a reasonably good idea of how to implement this, but I'm<BR>
&gt;&gt;&gt; &gt;&gt; wondering<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; if any filters already do something similar. I will of course take<BR>
&gt;&gt;&gt; apart<BR>
&gt;&gt;&gt; &gt;&gt; the<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; D3 filter for ideas, but I don't need to do a parallel spatial<BR>
&gt;&gt;&gt; &gt;&gt; decomposition<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; since my blocks are already discrete - I just want to redistribute<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; the<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; blocks around and more importantly change the numbers of them<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; between<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; filters.<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; If anyone can suggest examples which do this already, please do<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Thanks<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; JB<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; --<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; John Biddiscombe,                            email:biddisco @<BR>
&gt;&gt;&gt; cscs.ch<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; <a href="http://www.cscs.ch/">http://www.cscs.ch/</a><BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; CSCS, Swiss National Supercomputing Centre  | Tel:  +41 (91)<BR>
&gt;&gt;&gt; 610.82.07<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Via Cantonale, 6928 Manno, Switzerland      | Fax:  +41 (91)<BR>
&gt;&gt;&gt; 610.82.82<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; _______________________________________________<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Powered by www.kitware.com<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Visit other Kitware open-source projects at<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Please keep messages on-topic and check the ParaView Wiki at:<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; <a href="http://paraview.org/Wiki/ParaView">http://paraview.org/Wiki/ParaView</a><BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt; <a href="http://www.paraview.org/mailman/listinfo/paraview">http://www.paraview.org/mailman/listinfo/paraview</a><BR>
&gt;&gt;&gt; &gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;&gt; &gt;<BR>
&gt;&gt;&gt; &gt;<BR>
&gt;&gt;<BR>
&gt; _______________________________________________<BR>
&gt; Powered by www.kitware.com<BR>
&gt;<BR>
&gt; Visit other Kitware open-source projects at<BR>
&gt; <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><BR>
&gt;<BR>
&gt; Please keep messages on-topic and check the ParaView Wiki at:<BR>
&gt; <a href="http://paraview.org/Wiki/ParaView">http://paraview.org/Wiki/ParaView</a><BR>
&gt;<BR>
&gt; Follow this link to subscribe/unsubscribe:<BR>
&gt; <a href="http://www.paraview.org/mailman/listinfo/paraview">http://www.paraview.org/mailman/listinfo/paraview</a><BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt;    ****      Kenneth Moreland<BR>
&gt;     ***      Sandia National Laboratories<BR>
&gt; ***********<BR>
&gt; *** *** ***  email: <a href="kmorel@sandia.gov">kmorel@sandia.gov</a><BR>
&gt; **  ***  **  phone: (505) 844-8919<BR>
&gt;     ***      web:   <a href="http://www.cs.unm.edu/~kmorel">http://www.cs.unm.edu/~kmorel</a><BR>
&gt;<BR>
&gt;<BR>
<BR>
<BR>
</SPAN></FONT></BLOCKQUOTE><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'><BR>
</SPAN></FONT><FONT SIZE="2"><FONT FACE="Consolas, Courier New, Courier"><SPAN STYLE='font-size:10pt'><BR>
&nbsp;&nbsp;&nbsp;**** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kenneth Moreland<BR>
&nbsp;&nbsp;&nbsp;&nbsp;*** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sandia National Laboratories<BR>
*********** &nbsp;<BR>
*** *** *** &nbsp;email: <a href="kmorel@sandia.gov">kmorel@sandia.gov</a><BR>
** &nbsp;*** &nbsp;** &nbsp;phone: (505) 844-8919<BR>
&nbsp;&nbsp;&nbsp;&nbsp;*** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web: &nbsp;&nbsp;<a href="http://www.cs.unm.edu/~kmorel">http://www.cs.unm.edu/~kmorel</a><BR>
</SPAN></FONT></FONT><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'><BR>
</SPAN></FONT>
</BODY>
</HTML>