[Paraview] Some D3 and MPI questions

John Biddiscombe biddisco at cscs.ch
Mon Nov 20 13:38:30 EST 2006


Ken,

> I'm a little confused.  Once you call SetCuts on a k-d tree, the
> distribution should be set and will never be recalculated.  Are you
> calling D3->GetKdTree()->SetCuts()?
>   
On the animation I posted, I was not re-using the cuts, I was allowing
the tree to be recomputed on each timestep.

When I tried to re-use the cuts, as below - the first time the reader
executes, we have this->FirstTime=true and the Cuts are saved, then
reused on subsequent passes - but the first frame looks ok and the ones
after look very dodgy.

The data is Multiblock and the D3 filter accepts only Unstructured, so I
pass the data through a multigroupscalar filter and force the pieces
manually to trigger the copmposite data pipeline into looping for me and
generating multiblock D3 output (it works very nicely).
The first execution gives the "right" looking data, but after that it
changes and looks less well balanced. I concluded that it was storing
not just the cuts, but also some Cell IDs and since these were invalid
onsubsequent time steps, the thing failed to generate the proper output.
It does seem to work consistently after the second execution, ie it does
not change as you correctly state, but it doesn't look so good either -
and why does it change the second time. I'm checking to see if I've made
a boo-boo somewhere, but I welcome help.

cheers

JB


#ifdef USE_D3
    if (this->updateNumPieces>1) {
      //
      // Before doing any D3 filter operation, set a barrier point to
synchronize things
      //
      this->Controller->Barrier();

      vtkCompositeDataPipeline *cp = vtkCompositeDataPipeline::New();
      this->D3->SetDefaultExecutivePrototype(cp);
      this->scalars->SetDefaultExecutivePrototype(cp);
      cp->Delete();

      vtkStreamingDemandDrivenPipeline* exec =
vtkStreamingDemandDrivenPipeline::SafeDownCast(this->D3->GetExecutive());
      exec->SetUpdateNumberOfPieces(exec->GetOutputInformation(0),
this->updateNumPieces);
      exec->SetUpdatePiece(exec->GetOutputInformation(0),
this->updatePiece);

      if (!this->FirstStep && this->BSPcuts) {
        this->D3->GetKdtree()->SetCuts(this->BSPcuts);
        CSCSOutputMacro(<<"Using BSPCuts from previously ");
      }
      this->scalars->SetInput(mb);
      this->D3->SetInputConnection(this->scalars->GetOutputPort());
      this->D3->SetController(this->Controller);
      this->D3->SetBoundaryModeToAssignToAllIntersectingRegions();
      this->D3->UseMinimalMemoryOff();
      this->D3->SetRetainKdtree(1);
      exec->Update();
      if (this->FirstStep) {
        if (this->BSPcuts) this->BSPcuts->Delete();
        this->BSPcuts = this->D3->GetKdtree()->GetCuts();
        this->BSPcuts->Register(this);
        this->BSPcuts->PrintSelf(std::cout, 0 );
        this->FirstStep = 0;
      }
      //
      //
      //
      dob = exec->GetOutputData(0);
    }
#endif




More information about the ParaView mailing list