NSF Site Visit
In order to get everything done for the upcoming NSF site visit, I have created this page to share both temporary and complete results as well as to hold discussions on visualization methods being used, why they are employed, and how to better depict data for the scientists in Oregon. Below are links to images and animations showing the current state of visualization of the curvilinear grid simulation sent to me by Yvette.
- This visualization uses a combination of iso-surfaces of phytoplankton concentration and O2 saturation of the domain.
- Same as above only using Temperature instead of O2 saturation
- Using the same iso-surfaces extracted in the above visualizations, we have loaded the O2 saturation scalar field and determined the values of this field on the phytoplankton concentration surfaces. Additionally, the entire domain is shown using an interactive cutting plane that determines the value of the 2D slice visualization as before.
- Improving on the previous visualization, I am now providing equally spaced contours of the domain in the 2D slice-based visualization. This provides a much more intuitive visualization of the scalar field. Additionally, while the large 3D domain uses a relatively narrow range of the present scalar values for the colormap, I have increased this range for the 2D case. This provides a more complete visualization of the depth-based components present in the slices while accentuating surface variations in the 3D domain. I have also included the location of each slice in the dataset coordinates in the scalar bar associated with the 2D slice.
- Initial visualization of the extracted velocity field of the regular grid. I use salt for coloring the domain and velocity magnitude for the vectors. This is just an initial visualization and will be refined. The placement of the velocity glyphs is interactively defined by using a seeding plane (Not shown).
- Building off of 4.png and 5.png, I've added the vector field as scaled, but uncolored, glyphs representing the velocity of the water in the simulation. The placement of vectors is determined by a user-defined, interactive seeding plane. I've also modified the underlying workflows to help simplify changing timesteps.
- 1.avi | .mov
- This is a test animation generated in VisTrails depicting two types of planktons with temperatures and the flow field. I still haven't gotten the colormaps exactly correct yet, but that should be fixed shortly.
- 2.avi | .mov
- This animation is generated in VisTrails similarly to the first one. Iso-surfaces of planktons are given as level-sets defined as percentages of the valid range of data. Additionally, adaptive colormapping provides a much better coloring scheme given the pretty high dynamic range of the data. The flow field is shown as arrow glyphs colored by the temperature at each point. This allows us to get a feel for the water temperature even after the domain colored by this field is clipped to expose the plankton concentrations. These animations make use of 69 of the available timesteps in the simulation - approximately half. I will be converting the remaining timesteps into a more usable form and will post a video using all of them (barring any feedback for changes for the visualization).
- 3.avi | .mov
- This animation was generated in response to several of the comments I got regarding the first 2 attempts. The flow field remains largely unchanged; however, I have set an adaptive colormap in order to render the temperature values as I could. If this is not appropriate, please let me know a static range of scalar values by which I can set the colormap. This is necessary due to the large dynamic range of this particular scalar field in the dataset.
- 4.avi | .mov
- This animation was generated from the SELFE simulation using 24 timesteps looping 1 time. The salinity of the domain is being shown in concert with 4 iso-surfaces of salinity in the water to highlight both depth information as well as give an indication of the gradients of this field.
Flow Field Animations
- This video is the raw video captured to show visualization of dynamic flow fields. Although it's large now, it will be edited a little to cut unnecessary parts and text-based comments will be added to clarify what is going on.
- This video is the raw video captured to show visualization of dynamic flow fields. Although it's large now, it will be edited a little to cut unnecessary parts and text-based comments will be added to clarify what is going on. This video visualizes all 120 timesteps of the flow field I have.
New Horizon Images
Please note that although the cast data does not currently have any good spatial reference, we are currently working on converting bathymetry information from one of the simulations to the lat/long coordinate frame. This will give the 3D renderings a good spatial context with which we can view them.
- The scatter plots graph measurements of time, oxygen, temperature, salinity and conductivity against the changes in pressure. This image is an initial visualization of the readings made by the vessel New Horizon at Station and Cast NH-3. The data is now readable, and hopefully these initial plots will inspire more sophisticated visualizations.
- The scatter plot compares the salinity versus pressure plots for the data sets measured at 10 separate sites, overlaying all of the measurements using semi-transparent points.
- Using the Lat/long coordinates associated with each cast, we use the data's pressure value as an approximation of depth. Each data point is colored by salinity.
- Using the Lat/long coordinates associated with each cast, we use the data's pressure value as an approximation of depth. This image is just a different view (zoomed in to the lower portion of the data) of the same dataset.
- Using the Lat/long coordinates associated with each cast, we use the data's pressure value as an approximation of depth. This image is just a different view (zoomed in to the upper portion of the data) of the same dataset.
After installing VisTrails, you must have the following 2 packages installed for VisTrails to use. Simply unzip these into the directory: $HOME\.vistrails\userpackages
- .vt files
- Sample data files
After installing VisTrails and unpacking the required packages into the proper directory, start VisTrails. At this point, 2 windows will open - the spreadsheet and the builder window. The builder window is where visualizations are specified and the spreadsheet then displays the results of their execution. To enable the required packages, Go to the VisTrails menu and select Preferences. This will bring up a new window with a Module Packages tab. Go to this tab and select NumSciPy from the disabled packages list and enable it. Then do the same for the CMOP-SELFE package. With these module packages enabled you can open the reg.vt file posted above.
Once this file is open, the builder window will display multiple ovals. Each oval represents a visualization. Select the appropriate visualization and press the Execute button. The results will then be displayed in the appropriate spreadsheet cells. However, before this executes properly, you may need to change filenames. To do this, enter the Pipeline mode by pressing the Pipeline button in the builder window. This will allow you to edit the visualization specification. The first filenames to change are in the Gridpak Reader Modules. These files specify the geometry to use for the visualization (for me it's OR_rect_3d_grid_z.nc) The Selfe Array Reader modules then need to be changed to the appropriate filenames for the timestep you wish to display. It is also here that you specify the appropriate scalar fields to use in the visualization.
As an example:
- Open reg.vt
- Select the oval titled "3 fields"
- Enter Pipeline mode
- Change the filenames as appropriate on 3 Gridpak Reader and 3 Selfe Array Reader Modules. If you forget one, it will turn red on execution to indicate an error.
- The spreadsheet will now have 2 windows with visualizations present. The left pane is the 3D view and the right is a 2D slice.
- You may notice scalar bars are overlapping. To fix this, press 'a' and click and drag on a scalar bar. This will move it allowing you to resize and position it as you like. To select the other bar, press 'b' and do the same. If you find you are accidentally moving the bars instead of the model, press 'a' and 'b' again to disable the scalar bar interactions
- To rotate, zoom, and pan the model, use your mouse. Left-click and drag controls rotation. Right-click and drag (apple+click) or the mouse wheel controls zooming and middle-click (I'm not sure how to do this on a 1 button mouse) controls panning
- To set the slice and cut away some of the domain, press 'i' This enables the interactive cutting plane. To move it, left-click and drag on the white portion of the plane. You can then click on the white arrow normal to the plane to rotate the plane. The 2D slice will then update with the slice intersecting the small sphere on the cutting plane. The location of the plane (in native (stc?) coordinates will be shown along with the slice).
- Particle Tracer
- Windows Binary
- Particle Tracer Files
- Timestep 1
- Timestep 2
Particle tracing for dynamic vector field visualizations
I'm having a small issue generating the appropriate vector field from the netCDF files I have. This is due to the fact that each component of the vector exists in a different coordinate space. From some research I've done, it seems like it's based on an Arakawa C Grid. This is not a game-stopping problem, but will take some time to get things figured out. This will be an important question to be resolved in my conversations with Yvette later today (Thurs. May 28). For now, I am planning on extracting 3 different scalar fields (each with its own coordinate system) and then interpolating these values onto the domain of the scalars (the rho-grid) to coalesce the data.
I'm not entirely sure how to generate the appropriate vector field, and at first this will be further limited by the data type - the visualization software requires regular grids instead of curvilinear ones as we have. There are several possible fixes to this:
- Generate a large regular grid by embedding the curvilinear grid in a regularly gridded space. This is computationally expensive, but need only be done once per time-step and can be done with relatively little development effort - this will be the first step.
- Generate a transformation function to apply to the regular grid as a post-processing step. This is better than the first one, although more time-consuming.
- Modify the renderer to respect curvilinear grids. This is the preferred option, but takes the most time.