[Paraview] Precisions about Surface Flow Filter

Berk Geveci berk.geveci at kitware.com
Fri Feb 11 12:34:53 EST 2011


The easiest way to answer this is to show the code. Below is what it
does for triangles. You can find what it does for other polygon types
in here:

http://paraview.org/gitweb?p=ParaView.git;a=blob_plain;f=Servers/Filters/vtkIntegrateAttributes.cxx;hb=HEAD

Note that the actual filter is vtkIntegrateFlowThroughSurface which
uses vtkSurfaceVectors to calculate vector . normal and then
vtkIntegrateAttributes to integrate it over a polygonal surface. If
you find a bug or inaccuracy that can be improved, please let us know.

void vtkIntegrateAttributes::IntegrateTriangle(vtkDataSet* input,
                                               vtkUnstructuredGrid* output,
                                               vtkIdType cellId,
                                               vtkIdType pt1Id,
                                               vtkIdType pt2Id,
                                               vtkIdType pt3Id)
{
  double pt1[3], pt2[3], pt3[3];
  double mid[3], v1[3], v2[3];
  double cross[3];
  double k;

  input->GetPoint(pt1Id,pt1);
  input->GetPoint(pt2Id,pt2);
  input->GetPoint(pt3Id,pt3);

  // Compute two legs.
  v1[0] = pt2[0] - pt1[0];
  v1[1] = pt2[1] - pt1[1];
  v1[2] = pt2[2] - pt1[2];
  v2[0] = pt3[0] - pt1[0];
  v2[1] = pt3[1] - pt1[1];
  v2[2] = pt3[2] - pt1[2];

  // Use the cross product to compute the area of the parallelogram.
  vtkMath::Cross(v1,v2,cross);
  k = sqrt(cross[0]*cross[0] + cross[1]*cross[1] + cross[2]*cross[2]) * 0.5;

  if (k == 0.0)
    {
    return;
    }
  this->Sum += k;

  // Compute the middle, which is really just another attribute.
  mid[0] = (pt1[0]+pt2[0]+pt3[0])/3.0;
  mid[1] = (pt1[1]+pt2[1]+pt3[1])/3.0;
  mid[2] = (pt1[2]+pt2[2]+pt3[2])/3.0;
  // Add weighted to sumCenter.
  this->SumCenter[0] += mid[0]*k;
  this->SumCenter[1] += mid[1]*k;
  this->SumCenter[2] += mid[2]*k;

  // Now integrate the rest of the attributes.
  this->IntegrateData3(input->GetPointData(), output->GetPointData(),
                       pt1Id, pt2Id, pt3Id, k,
                       *this->PointFieldList, this->FieldListIndex);
  this->IntegrateData1(input->GetCellData(), output->GetCellData(), cellId, k,
    *this->CellFieldList, this->FieldListIndex);
}

void vtkIntegrateAttributes::IntegrateData3(vtkDataSetAttributes* inda,
  vtkDataSetAttributes* outda,
  vtkIdType pt1Id, vtkIdType pt2Id,
  vtkIdType pt3Id, double k,
  vtkIntegrateAttributes::vtkFieldList& fieldList, int index)
{
  int numArrays, i, numComponents, j;
  vtkDataArray* inArray;
  vtkDataArray* outArray;
  numArrays = fieldList.GetNumberOfFields();
  double vIn1, vIn2, vIn3, dv, vOut;
  for (i = 0; i < numArrays; ++i)
    {
    if (fieldList.GetFieldIndex(i) < 0)
      {
      continue;
      }
    // We could template for speed.
    inArray = inda->GetArray(fieldList.GetDSAIndex(index, i));
    outArray = outda->GetArray(fieldList.GetFieldIndex(i));
    numComponents = inArray->GetNumberOfComponents();
    for (j = 0; j < numComponents; ++j)
      {
      vIn1 = inArray->GetComponent(pt1Id, j);
      vIn2 = inArray->GetComponent(pt2Id, j);
      vIn3 = inArray->GetComponent(pt3Id, j);
      vOut = outArray->GetComponent(0, j);
      dv = (vIn1+vIn2+vIn3)/3.0;
      vOut += dv*k;
      outArray->SetComponent(0, j, vOut);
      }
    }
}


2011/2/11 Aurélien Marsan <aur.marsan at gmail.com>:
> Dear all,
>
> Using the surface flow filter, I get results that are not those expected.
> Could you give me some informations about how the integration is performed ?
>
> Is this a "local" approach, computing the surface of each face, and doing
> some point data to face data interpolation ?
>
> Thanks,
>
> Aurélien.
> _______________________________________________
> 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
>
> Follow this link to subscribe/unsubscribe:
> http://www.paraview.org/mailman/listinfo/paraview
>
>


More information about the ParaView mailing list