I found the issue. Never mind. For the short story, NeedToCreateGrid() in CatalystCAdaptorAPI.cxx not only check if a grid already exists or not. If a grid exists, it also clears the field data, which was my issue. This function should therefore be called only once per data set.
Best, Michel > On Oct 26, 2015, at 4:22 PM, Michel Rasquin <[email protected]> wrote: > > Hi everyone, > > I am trying to add some fields to a vtkCPAdaptorAPI object for coprocessing > with Catalyst. > I rely for that purpose on the successful implementation of the Phasta > adaptor provided along with ParaView. > See > ParaView-v4.4.0-source/CoProcessing/Adaptors/PhastaAdaptor/PhastaAdaptor.cxx. > 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: > > void addfields(… double* dofArray, double* vortArray, double * > otherFieldOfInterest … ) > { > vtkCPInputDataDescription* idd = > vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input”); > vtkUnstructuredGrid* UnstructuredGrid = > vtkUnstructuredGrid::SafeDownCast(idd->GetGrid()); > if(!UnstructuredGrid) { > vtkGenericWarningMacro("No unstructured grid to attach field data to."); > return; > } > > // now add numerical field data > //velocity > vtkIdType NumberOfNodes = UnstructuredGrid->GetNumberOfPoints(); > if(idd->IsFieldNeeded("velocity")) > { > vtkDoubleArray* velocity = vtkDoubleArray::New(); > velocity->SetName("velocity"); > velocity->SetNumberOfComponents(3); > velocity->SetNumberOfTuples(NumberOfNodes); > for (vtkIdType idx=0; idx<NumberOfNodes; idx++) { > velocity->SetTuple3(idx, dofArray[idx], > dofArray[idx+ *nshg], > dofArray[idx+ *nshg*2]); > } > UnstructuredGrid->GetPointData()->AddArray(velocity); > velocity->Delete(); > } > > if(idd->IsFieldNeeded(“vorticity")) > { > vtkDoubleArray* vorticity = vtkDoubleArray::New(); > velocity->SetName(“vorticity"); > velocity->SetNumberOfComponents(3); > velocity->SetNumberOfTuples(NumberOfNodes); > for (vtkIdType idx=0; idx<NumberOfNodes; idx++) { > velocity->SetTuple3(idx, vortArray[idx], > vortArray[idx+ *nshg], > vortArray[idx+ *nshg*2]); > } > UnstructuredGrid->GetPointData()->AddArray(vorticity); > vorticity->Delete(); > } > > // etc for any the other fields of interest for Catalyst > } > > 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. > > Concretely, my first implementation is simply the following: > > void addfield(std::string fieldName, int* NumberOfComp, double* fieldArray) > { > vtkCPInputDataDescription* idd = > vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input"); > vtkUnstructuredGrid* UnstructuredGrid = > vtkUnstructuredGrid::SafeDownCast(idd->GetGrid()); > if(!UnstructuredGrid) { > vtkGenericWarningMacro("No unstructured grid to attach field data to."); > return; > } > > // Get number of nodes > vtkIdType NumberOfNodes = UnstructuredGrid->GetNumberOfPoints(); > > // Add field > if(idd->IsFieldNeeded(fieldName.c_str())) { > vtkDoubleArray* dataArray = vtkDoubleArray::New(); > dataArray->SetName(fieldName.c_str()); > dataArray->SetNumberOfComponents(*NumberOfComp); > dataArray->SetNumberOfTuples(NumberOfNodes); > // fill in dataArray from fieldArray, NumberOfNodes and NumberOfComp > … > UnstructuredGrid->GetPointData()->AddArray(dataArray); > dataArray->Delete(); > } > } > > The problem is that only the last field passed to this new addfield() > function can be actually used by Catalyst for coprocessing. > Indeed, it appears that all other fields previously passed to addfield() > cannot be retrieved from the vtkCPAdaptorAPI object. > 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. > > I suspect the issue is in one of the first two lines of the addfield() > function, namely > > vtkCPInputDataDescription* idd = > vtkCPAdaptorAPI::GetCoProcessorData()->GetInputDescriptionByName("input"); > vtkUnstructuredGrid* UnstructuredGrid = > vtkUnstructuredGrid::SafeDownCast(idd->GetGrid()); > > 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? > > Thank you for your help. > > Best regards, > > Michel > > > _______________________________________________ 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 ParaView Wiki at: http://paraview.org/Wiki/ParaView Search the list archives at: http://markmail.org/search/?q=ParaView Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/paraview
