There have been lots of changes to the streamline code recently. This page is to document some of them.
Dave has been changing a lot. He knows what he's doing, so he probably doesn't need the peer review the way I do.
- Rename avtStreamline to avtIntegralCurve
- Rename avtStreamlineFilter to avtPICSFilter (PICS = Parallel Integral Curve System)
- Motivation for #'s 1 and 2: the current filter is tied up with streamlines (advecting particles based on a fixed velocity field and looking at its path) and our system is capable of much more. I believe the renamings will help establish the identity of what this code should do.
- Create a new derived type of avtPICSFilter called avtStreamlineFilter. Pull out code from avtPICSFilter specific to streamlines and place in avtStreamlineFilter. Note: most of the really streamline specific code, the code that sets up vtkPolyData, is already separated out. So this should be a small deal. But it allows us to hang other filters off PICS and not Streamline.
- Add flags to avtIntegralCurve to specify what information should be stored in the output (point locations along the curve, scalar fields, arc lengths, vorticity). These flags will be set via virtual functions. So if the Streamline filter wants to color by a scalar, it will communicate this via virtual function to the PICS filter, which will set the flag in the integral curve. Similarly, the streamline filter will communicate that it always wants point locations. (I will do this in a more efficient way than it reads.)
- NOT DONE ... but possibly ill-conceived ... we want to have each derived type examine the step and pull out data members right then.
- Motivation: we are calculating a lot more than we need. This should help improve performance.
- Make many of the methods in avtIntegralCurve be virtual, which will enable the avtPICSFilter to use other types of integral curves.
- Motivation: Christoph identified to me that the purpose of the integral curve class is to take action based on the advection step done by the integrators. Right now, the actions are streamline-centric. We are envisioning much more general analysis, similar in spirit to Poincare analysis.
- Remove avtStreamlineWrapper and put functionality into avtIntegralCurve (nee avtStreamline) and avtPICSFilter (nee avtStreamlineFilter).
- I wanted to remove avtIntegralCurve::seedPtDomainList, but it is still in there.
- I'm not confident (at all) that I did avtIntegralCurve::HandleGhostZones right. (I stored off lastStep and used that.)
- I noticed there are a lot of data members in avtIVPStep that I don't think should be there.
- Poincare and Streamline need to be separated out from avtStateRecorderIC
- Data members should be set up in the derived type of avtIntegralCurve, not the avtIVPStep.
- Data members need to be taken out of avtIVPStep and put into derived types of avtStateRecorder.
- Are we really sending the right arguments into AnalyzeStep?
- We need some serious regression testing.
- Result and Status (seem redundant) both in avtStreamline.
- I never did anything to address termination.
- Haven't addressed setting up the seed list
Testing the infrastructure
I'd like to set up an Advect operator to test the infrastructure. This will take some work:
- Need per-processor point lists
- Need communication pattern to communicate back
- Need new derived type of avtIntegralCurve
- Need new derived type of PICS