<div dir="ltr"><div><div><div><div><div>Hi Michel,<br><br></div>Yep, I saw your email that you figured out the issue. The Fortran API for Catalyst is probably a little bit clunky but it's difficult to tell who's using what for that so I didn't want to change anything there. Feel free to push some of that code back if you want to. The gitlab tools are much nicer than gerrit so hopefully it's easier to make changes. <br><br></div>As for the IsFieldNeeded() function, it's already been tested for a simulation code and works quite nicely. That code has a lot of derived variables that it can compute but doesn't store explicitly. We hope to make it easy to take advantage of that when generating scripts but there's quite a bit of work to do in order to get it working. It's probably too much to try to completely automate it by going through the pipeline (impossible to automate for data extract output since it's not known what fields the user wants written out). If you have a specific script that you want modified for that though, if you share it I can help modify it to get that behavior. Hopefully the changes are just a couple of lines so that in the future you can follow along and maybe make the changes yourself if you're in a rush.<br><br></div>Cheers,<br></div>Andy<br><br></div>ps. If you're going to be at SC15, we can meet up there and talk about requesting specific fields if you have the time.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 27, 2015 at 1:45 PM, Michel Rasquin <span dir="ltr"><<a href="mailto:michel.rasquin@colorado.edu" target="_blank">michel.rasquin@colorado.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div style="word-wrap:break-word">
Hi Andy,
<div><br>
</div>
<div>Thank you for your quick answer.</div>
<div><br>
</div>
<div>You probably already read my previous answer about this issue.</div>
<div>The problem was located in NeedToCreateGrid(...), which also clears any field data associated with an existing grid.</div>
<div>The solution consists in calling simply this function only once for every new time step.</div>
<div><br>
</div>
<div>That said, you raised a good point about IsFieldNeeded(…), which was also on my radar.</div>
<div><br>
</div>
<div>I already observed that RequestDataDescription(datadescription) in the python script sets AllFields in the data description object to On. As a consequence, all the fields specified in the adaptor are passed to Catalyst since IsFieldNeeded() always
 returns true, whether the corresponding field is used in the Catalyst pipeline or not. Since we have improved our adaptor (we should commit it back now) and increased the number of fields we are potentially interest in for coprocesing purpose, this can indeed
 leads to additional memory usage and cpu time.</div>
<div><br>
</div>
<div>I definitely agree it would therefore be quite useful to have the possibility to request only the desired field variables through the IsFieldNeeded() function in the adaptor.</div>
<div>If you have any advice regarding this feature, I would be very interested in trying that out.</div>
<div><br>
</div>
<div>Thank you for your help!</div>
<div><br>
</div>
<div>Cheers,</div>
<div><br>
</div>
<div>Michel</div><div><div class="h5">
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
<div>
<blockquote type="cite">
<div>On Oct 26, 2015, at 5:57 PM, Andy Bauer <<a href="mailto:andy.bauer@kitware.com" target="_blank">andy.bauer@kitware.com</a>> wrote:</div>
<br>
<div>
<div dir="ltr">
<div>
<div>
<div>
<div>
<div>Hi Michel,<br>
<br>
</div>
You should be able to pass a single field at a time to Catalyst. I'm not sure where the problem is but my first guess is that maybe you're giving the same name to all of the fields. What does the code that's calling addfield() look like?
<br>
<br>
</div>
Note that the Catalyst API uses things like idd->IsFieldNeeded("pressure") to check if a field is needed by the pipeline. This has been in the API since nearly the beginning but we've never had a chance to generate Python scripts which can take advantage of
 loading only desired fields. This can potentially save on both execution time and memory usage. This is on my radar again but I'm not sure when it will get done. You can modify the Python scripts though to just request the desired field variables in the RequestDataDescription()
 method and everything should work as desired. Let us know if you want to try that out and need help with it.<br>
<br>
</div>
Cheers,<br>
</div>
Andy<br>
</div>
<div>
<div>
<div>
<div>
<div>
<div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Oct 26, 2015 at 11:22 AM, Michel Rasquin <span dir="ltr">
<<a href="mailto:michel.rasquin@colorado.edu" target="_blank">michel.rasquin@colorado.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hi everyone,<br>
<br>
I am trying to add some fields to a vtkCPAdaptorAPI object for coprocessing with Catalyst.<br>
I rely for that purpose on the successful implementation of the Phasta adaptor provided along with ParaView.<br>
See ParaView-v4.4.0-source/CoProcessing/Adaptors/PhastaAdaptor/PhastaAdaptor.cxx.<br>
After the initialization of the coprocessing objects and the generation of the grid, the current implementation to add fields in the phasta adaptor relies on the following function:<br>
<br>
void addfields(… double* dofArray, double* vortArray, double * otherFieldOfInterest … )<br>
{<br>
  vtkCPInputDataDescription* idd = vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input”);<br>
  vtkUnstructuredGrid* UnstructuredGrid = vtkUnstructuredGrid::SafeDownCast(idd->GetGrid());<br>
  if(!UnstructuredGrid) {<br>
    vtkGenericWarningMacro("No unstructured grid to attach field data to.");<br>
    return;<br>
  }<br>
<br>
  // now add numerical field data<br>
  //velocity<br>
  vtkIdType NumberOfNodes = UnstructuredGrid->GetNumberOfPoints();<br>
  if(idd->IsFieldNeeded("velocity"))<br>
  {<br>
    vtkDoubleArray* velocity = vtkDoubleArray::New();<br>
    velocity->SetName("velocity");<br>
    velocity->SetNumberOfComponents(3);<br>
    velocity->SetNumberOfTuples(NumberOfNodes);<br>
    for (vtkIdType idx=0; idx<NumberOfNodes; idx++) {<br>
      velocity->SetTuple3(idx, dofArray[idx],<br>
                          dofArray[idx+ *nshg],<br>
                          dofArray[idx+ *nshg*2]);<br>
    }<br>
    UnstructuredGrid->GetPointData()->AddArray(velocity);<br>
    velocity->Delete();<br>
  }<br>
<br>
  if(idd->IsFieldNeeded(“vorticity"))<br>
  {<br>
    vtkDoubleArray* vorticity = vtkDoubleArray::New();<br>
    velocity->SetName(“vorticity");<br>
    velocity->SetNumberOfComponents(3);<br>
    velocity->SetNumberOfTuples(NumberOfNodes);<br>
    for (vtkIdType idx=0; idx<NumberOfNodes; idx++) {<br>
      velocity->SetTuple3(idx, vortArray[idx],<br>
                          vortArray[idx+ *nshg],<br>
                          vortArray[idx+ *nshg*2]);<br>
    }<br>
    UnstructuredGrid->GetPointData()->AddArray(vorticity);<br>
    vorticity->Delete();<br>
    }<br>
<br>
  // etc for any the other fields of interest for Catalyst<br>
}<br>
<br>
Currently, all the fields requested for coprocessing needs to be attached in this function at the same time, using the same pointer to vtkUnstructuredGrid resulting from the SafeDownCast mentioned above. However, I need a more flexible implementation so that
 I can call addfield (with no “s”) as many times as needed and attach a single field to the vtkCPAdaptorAPI object each time this function is called.<br>
<br>
Concretely, my first implementation is simply the following:<br>
<br>
void addfield(std::string fieldName, int* NumberOfComp, double* fieldArray)<br>
{<br>
  vtkCPInputDataDescription* idd = vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input");<br>
  vtkUnstructuredGrid* UnstructuredGrid = vtkUnstructuredGrid::SafeDownCast(idd->GetGrid());<br>
  if(!UnstructuredGrid) {<br>
    vtkGenericWarningMacro("No unstructured grid to attach field data to.");<br>
    return;<br>
  }<br>
<br>
  // Get number of nodes<br>
  vtkIdType NumberOfNodes = UnstructuredGrid->GetNumberOfPoints();<br>
<br>
  // Add field<br>
  if(idd->IsFieldNeeded(fieldName.c_str())) {<br>
    vtkDoubleArray* dataArray = vtkDoubleArray::New();<br>
    dataArray->SetName(fieldName.c_str());<br>
    dataArray->SetNumberOfComponents(*NumberOfComp);<br>
    dataArray->SetNumberOfTuples(NumberOfNodes);<br>
    // fill in dataArray from fieldArray, NumberOfNodes and NumberOfComp<br>
    …<br>
    UnstructuredGrid->GetPointData()->AddArray(dataArray);<br>
    dataArray->Delete();<br>
  }<br>
}<br>
<br>
The problem is that only the last field passed to this new addfield() function can be actually used by Catalyst for coprocessing.<br>
Indeed, it appears that all other fields previously passed to addfield() cannot be retrieved from the vtkCPAdaptorAPI object.<br>
Consequently, any filter in the Catalyst pipeline that relies on the N-1 first fields (out of N in total) passed to addfields() will be ignored because relevant data is missing.<br>
<br>
I suspect the issue is in one of the first two lines of the addfield() function, namely<br>
<br>
  vtkCPInputDataDescription* idd = vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input");<br>
  vtkUnstructuredGrid* UnstructuredGrid = vtkUnstructuredGrid::SafeDownCast(idd->GetGrid());<br>
<br>
Could you please let me know if it is possible to pass one single field at a time to the Catalyst adaptor from different locations of the code, or if all the fields must be passed in one shot?<br>
<br>
Thank you for your help.<br>
<br>
Best regards,<br>
<br>
Michel<br>
<br>
<br>
<br>
_______________________________________________<br>
Powered by <a href="http://www.kitware.com/" rel="noreferrer" target="_blank">
www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">
http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the ParaView Wiki at: <a href="http://paraview.org/Wiki/ParaView" rel="noreferrer" target="_blank">
http://paraview.org/Wiki/ParaView</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=ParaView" rel="noreferrer" target="_blank">
http://markmail.org/search/?q=ParaView</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/paraview" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/paraview</a><br>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div></div></div>

</blockquote></div><br></div>