.. include:: ../../macros.hrst .. include:: ../../abbreviations.hrst .. _chapter:TargetedComputationalFluidDynamics: Targeted: Computational Fluid Dynamics ###################################### Introduction ============ This tutorial shows common visualization techniques for cfd datasets. We will be using the dataset disk_out_ref.ex2, found in Paraview under File/ Open/ Examples. It has a vector field in it called V. Note that we will reset session (i.e., start from scratch) every section. Slices ====== - Open disk_out_ref.ex2. - **Apply**. - **+X** - Select **Filters → Common → Slice**. - **Apply**. - Unselect the **Show Plane**. - Set **Coloring** to **v**. - In the pipeline browser, select **disk_out_ref.ex2** - Select **Filters → Common → Slice**. - **Y Normal**. - **Apply**. - Unselect the **Show Plane**. - Set **Coloring** to **pres**. - **View → Color Map Editor → Presets** (the little envelope with a heart) → **Turbo**. - With the mouse, rotate the slices around so you can see both surfaces. - **Edit → Reset Session**. There is also a shortcut icon just above where you have been changing colors. It looks like a green counterclockwise snake eating it's tail. .. figure:: ../../images/Cfd_slices2.png :width: 1000px Stream Tracers - lines and tubes ================================ - Open disk_out_ref.ex2. - **Apply**. - **+X** - Select **Filters → Common → Stream Tracer**. - **v**. - Set **Seed Type** to **Point Cloud**. - Uncheck **Show Sphere**. - Set **Coloring** to **v**. - **Apply**. Lines don't color as nicely as surfaces. Lets add a tube filter around each streamline. - Select **Filters → Search** - Type **Tube**. - **Apply**. Now, we want to know which directions the particles are moving. We will use a glyph filter. Note we place the glyph filter on the streamline, not the tube. - Select **StreamTracer1** in the Pipeline Browser. - Select **Filters → Common → Glyph**. - Set **Glyph Type** to **Cone**. - Set **Orientation Array** to **v**. - Set **Scale Array** to **v**. - **!Very Important!**: In the **Scale Factor** select the recycle button to the right. - **Apply**. - Set **Coloring** to **temp**. - **View → Color Map Editor → Presets** (the little envelope with a heart) → **Black Body Radiation**. Lets save this really cool image as a screenshot. - **File → Save Screenshot**. - Add a file name. - **OK**. - **OK**. - **Edit → Reset Session**. .. figure:: ../../images/Cfd_streamtracer1.png :width: 1000px Stream Tracers with Custom Source ================================= We want to create stream tracers from any arbitrary source. This can be a line, spline, circle, elipse or any other curving line. An extreme example would be a cylinder cut by a plane. - Open disk_out_ref.ex2. - **Apply**. - **+X** - Set **vtkBlockColors** to **Solid Color**. - Set **Opacity** to **0.3**. - Sources/Alphabetical/**Elipse**. - Set **Center** to **0,0,7**. - Set **Major Radius Vector** to **3,0,0**. - Set **Ratio** to **0.3**. - **Apply**. - Select **Filters → Search** - Type **Tube**. - **Apply**. - Select **disk_out_ref.ex2** in the **Pipeline Browser**. - Select **Filters → Alphabetical → Stream Tracer with Custom Source**. - Set **Seed Source** to **Elipse**. - **Apply**. - Set **Coloring** to **Solid Color**. The image below is a merging of Stream Tracers with lines and tubes, and Stream Tracer with Custom Source. I have also played with colors to make it look nicer. If interested, replicating is left to the user. .. figure:: ../../images/Cfd_streamtracer_with_custom_source.png :width: 1000px Glyphs perpendicular to a slice =============================== - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. - **+X**. Lets create a half slice. This will be used as the seed plane for glyphs. - Select **Filters → Common → Slice**. - **Z Normal**. - Set Origin to **0, 0, 5**. - Uncheck **Show Plane**. - **Apply**. - Select **Filters → Common → Clip**. - Uncheck **Show Plane**. - **Apply**. Now, apply glyphs. - Select **Filters → Common → Glyph**. - Set **Glyph Type** to **Arrow**. - Set **Orientation Array** to **v**. - Set **Scale Array** to **v**. - **!Very Important!**: In **Scale Factor** select the recycle button to the right. - **.5X**. - **.5X**. - **Apply**. - Set **Coloring** to **v**. - Change **Magnitude** to **Z**. Let's put these glyphs back into context by showing the original dataset. - Select **disk_out_ref.ex2** in the Pipeline Browser. - Set **Representation** to **Wireframe**. - In the **pipeline browser**, click on the **eyeball** next to **disk_out_ref.ex2**. - Set **Opacity** to **0.3**. - Use the mouse to zoom into the glyph vectors. .. figure:: ../../images/Cfd_slice_glyph1.png :width: 1000px Flow in a fluid =============== To show a velocity profile we need to sample the dataset with a line, and then create glyphs off of this line. This can be done using a trick in ParaView, i.e., the Plot over Line filter. Note that a Resample to Line filter will be added in ParaView 5.11 or so. - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. Lets sample over a line. - Select **Filters → Data Analysis → Plot over Line**. - **Y Axis**. - Change the **Z** component of **Point1** and **Point2** to **1**. - Change the **Resolution** to **40**. - **Apply**. - Close the **LineChartView**. - In the **Pipeline Browser**, turn visibility off for **disk_out_ref.ex2**. We now have a line sampled through the fluid. Lets calculate the negative Z component of V (so it goes the opposite direction on the line from V). That way we can have two profiles, one with V, and one with Vz. - Set **Filters → Common → Calculator**. - Change **Result** to **Vz**. - Set **Expression** to **0*iHat+0*jHat+-v_Z*kHat**. - **Apply**. Now we want to create two Glyphs - one from the **Calculator** filter, and one directly from the **Plot over Line** filter. - **Calculator1** should still be highlighted in the Pipeline Browser. - Select **Filters → Common → Glyph**. - Set **Glyph Type** to **Arrow**. - Set **Orientation Array** to **Vz**. - Set **Scale Array** to **Vz**. - **!Very Important!**: In **Scale Factor** select the recycle button to the right. - **.5X**. - **.5X**. - **Apply**. - Click on the **Color Editor** icon. - Change the color to Orange. - **Apply**. - In the Pipeline Browser select the **Plot over Line** filter. - Select **Filters → Common → Glyph**. - Set **Glyph Type** to **Arrow**. - Set **Orientation Array** to **v**. - Set **Scale Array** to **v**. - **!Very Important!**: In **Scale Factor** select the recycle button to the right. - **Apply**. Let's put these glyphs back into context by showing the original dataset. - Select **disk_out_ref.ex2** in the Pipeline Browser. - Click on the **eyeball** next to **disk_out_ref.ex2**. - Set **Opacity** to **0.3**. Just to create a nice image, I'm going to split the views horizontally, and show this visualization also from the side. .. figure:: ../../images/Cfd_fluid_velocity_profile1.png :width: 1000px You can write the data sampled down the line to a .csv file, where you can post process it with tools such as Excel. Here is how to do it. - Select **PlotOverLine** in the Pipeline Browser. - Split screen vertical. - **Spreadsheet view**. - Now, click on the **Export Scene** icon, and write the **Spreadsheet** down to a **.csv file**. Lets save this really cool image as a screenshot. - **File → Save Screenshot**. - Add a file name. - **OK**. - We want to save both views. Click **Save All Views**. - **OK**. .. figure:: ../../images/Cfd_fluid_velocity_profile_spreadsheet.png :width: 1000px 2D plots through a fluid ======================== - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. - **+X**. - Select **Filters → Data Analysis → Plot over Line**. - **Y Axis**. - Change the **Z** component of **Point1** and **Point2** to **4**. - **Apply**. - In the **Properties Tab**, turn all variables off other than **v_Z**. - Click on the **RenderView**, the left **view**. - Select **disk_out_ref.ex2** in the Pipeline Browser. - Set **Opacity** to **0.3**. .. figure:: ../../images/Cfd_2d_plots.png :width: 1000px Contours on a slice =================== - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. - **+X**. - Select Filters → Common → Slice**. - Uncheck **Show Plane**. - **Apply**. We need the magnitude for the Contour filter. - Select Filters → Common → Calculator**. - Result Array Name **vMag**. - Set **Expression** to **mag(v)**. - **Apply**. Now, draw contours on the 2d slice. - Select **Filters → Common → Contour**. - Contour by vMag. - Delete the **Value**, and create a new set using the **Add a Range of Values** icon. - **Apply**. A nice visualization is to turn visibility on for **Slice** and paint by **v**, and change **Contour** to be a **Solid Color**, and make that color **White**. Here is an example with additional **streamlines**, **tubes** and **glyphs**. .. figure:: ../../images/Cfd_contours_on_slices.png :width: 1000px Gradient, Divergence, Vorticity and Q Criterion =================================================== The **Gradient** filter (**Advanced** Properties tab) provides Gradient, Divergence, Vorticity and and Q Criterion. Here is am example, using disk_out_ref.ex2. .. figure:: ../../images/Cfd_gradient1.png :width: 1000px Probing a fluid =============== There are numerous ways to probe the cells and points of a fluid. One is with the **Hover Points On** and **Hover Cells On** icons just above the Renderview. Another is with Interactive Select Cells or Points On. Then, in the Find Data, turn on Cell or Point Labels. Yet another is with the Probe filter. Here is how to use the probe filter. - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. - **+X**. - Select **Filters → Common → Clip**. - Uncheck **Show Plane**. - Uncheck **Invert**. - **Apply**. The **Probe** filter works much better with **Auto Apply** turned on. This is the icon that looks like a tree growing out of a cube. - **Auto Apply** on - Select **Filters → Data Analysis → Probe**. - If needed, select the **RenderView** window, giving it focus. - Now, move over **disk_out_ref.ex2**, updating the probed location with the **p** key. The **probed** data will show in the Spreadsheet view. .. figure:: ../../images/Cfd_probe1.png :width: 1000px Animating a static vector field =============================== If you have a vector field in your data, you can animate a static dataset. Our goal is to create a set of streamlines from a vector field, place points on this set of streamlines, and animate the point down the streamlines. We will also add glyphs to the streamline points. - **Edit → Reset Session**. - Open disk_out_ref.ex2. - **Apply**. - Click the **-X** icon. - **Stream tracer** filter. (We are already streamtracing on V). - Set **Seed Type** to **Point Cloud**. - Optional - change the Opacity to 0.4. - **Apply**. - Select **Filters → Common → Contour**. - Contour on **IntegrationTime**. - **Apply**. - Select **Filters → Common → Glyph**. - Vectors **V**. - No Scale Array. - Scale 1. - Set **Glyph Mode** to **All Points**. - **Apply**. - Select **View → Animation View**. - Set **Mode** to **Sequence**. - Set **No. Frames** to **100**. - Change the pulldown box next to the blue **+** to be **Contour**. - Click the blue **+**. Note it works better if you use 0 for the start. - Now, click the play button. - In the pipeline browser, I also turned off visibility for the Contour filter. Lets save this as a movie. - **File → Save Animation**. - Add a file name. - Save as a **.avi**. - **OK**. - **OK**. .. figure:: ../../images/Cfd_animating_static_field.png :width: 1000px Volume Rendering ================ We are going to paint the fluid by volume rendered temperature and we will try to make it look like fire. To give context, we are also going to extract the exterior surface, and clip the disk_out_ref in half. We will paint this exterior surface black. Note: Volume rendering is very resource intensive. It is possible to display a dataset using surface that chokes using Volume Rendering. The solution is to grab more nodes of your cluster, thus picking up more memory. - **Edit → Reset Session**. - Open disk_out_ref.ex2 - **Apply**. - Select **Filters → Alphabetical → Extract Surface**. - **Apply**. - Select **Filters → Common → Clip**. - Deselect **Invert**. - **Apply**. - Set **Solid Color** to **black**. - Set **Representation** to **Wireframe**. - Open disk_out_ref.ex2 again. - **Apply**. - Set **Coloring** to **temp**. - Set **Representation** to **Volume**. Since the goal is to make it look like fire, we will finetune the **Color Map** settings. - Select **View → Color Map Editor** - Change **presets** (looks like a folder with a heart) to be **Black Body Radiation**. - The **Color Transfer function** (the lower 1D colored line) should already have 4 points. - Add a point in the orange area - Add another at the top of the black. .. figure:: ../../images/Cfd_volume_rendering_color_transfer_function.png :width: 500px .. admonition:: **Did you know?** :class: tip - You can create a point on the color scale by clicking in the window. - You can select a point on the color scale by clicking on it. - You can move between points using the **Tab** and **Shift** keys. - You can delete points using the delete key. - The temperature should be set by the physical laws of black ody curve. Thus, manually specify the color transfer function values of the 6 points as follows by clicking the **advanced** button. .. figure:: ../../images/Cfd_volume_rendering_color_transfer_values.png :width: 500px - The **Opacity Transfer function** (the upper 2D colored line) should already have 2 points. - Add 4 extra points as seen bellow. .. figure:: ../../images/Cfd_volume_rendering_opacity_transfer_function.png :width: 500px - The Opacity requires a bit of artistic license. What we are trying to do is show the different temperatures inside of the flame. Also, we may want to show differing amounts of soot - which will be point number1. Thus, manually specify the opacity transfer function values of the 6 points as follows. .. figure:: ../../images/Cfd_volume_rendering_opacity_transfer_values.png :width: 500px The end result of the volume rendered fire should look like this: .. figure:: ../../images/Cfd_volume_rendering.png :width: 1000px