【深度学习驱动流体力学】VTK创建、处理和可视化流体数据

Visualization Toolkit(VTK)是一个强大的开源软件系统,用于处理和可视化三维数据。它提供了丰富的工具和算法,可以处理从简单的网格数据到复杂的流体动力学模拟数据等各种类型的数据。本文将完整介绍如何使用 VTK 创建、处理和可视化流体数据的基本步骤和相关概念。

  1. VTK 概述
    VTK 是由 Kitware 公司开发的开源软件,用于三维计算机图形学、图像处理和可视化。它提供了一组丰富的 C++ 类库和 Python 接口,支持多种数据类型的处理和可视化,包括结构化和非结构化网格、图像数据、多边形数据等。VTK 被广泛应用于科学研究、医学图像处理、工程仿真和可视化等领域。

  2. 创建流体数据
    在 VTK 中,可以通过多种方式创建流体数据,最常见的是创建结构化网格(Structured Grid)和非结构化网格(Unstructured Grid)。下面我们以创建结构化网格为例进行说明。

创建结构化网格
结构化网格是由规则排列的点组成的网格,适用于表示规则的三维空间区域。例如,我们可以创建一个简单的立方体结构化网格,并添加标量数据(如温度)。

import vtk# 创建一个结构化网格
def create_structured_grid():# 创建点数据points = vtk.vtkPoints()for i in range(10):for j in range(10):for k in range(10):points.InsertNextPoint(i, j, k)# 创建一个结构化网格grid = vtk.vtkStructuredGrid()grid.SetDimensions(10, 10, 10)grid.SetPoints(points)# 创建一个标量数据(假设为温度数据)temperature_array = vtk.vtkFloatArray()temperature_array.SetName("Temperature")temperature_array.SetNumberOfComponents(1)temperature_array.SetNumberOfTuples(grid.GetNumberOfPoints())# 设置温度数据for i in range(grid.GetNumberOfPoints()):temperature_array.SetValue(i, i)# 将温度数据添加到点数据grid.GetPointData().AddArray(temperature_array)grid.GetPointData().SetActiveScalars("Temperature")return grid

上述代码创建了一个立方体网格,网格包含 10x10x10 个点,每个点的坐标范围在 (0, 0, 0) 到 (9, 9, 9)。添加了名为 “Temperature” 的标量数据作为网格的一部分。

  1. 处理流体数据
    在处理流体数据时,VTK 提供了许多用于数据处理、过滤和分析的工具和算法。例如,可以对网格进行剖析、滤波、插值等操作,以准备数据进行后续的可视化或分析。

数据滤波和处理示例

import vtk# 加载 VTK 文件
def load_vtk_file(file_path):reader = vtk.vtkXMLStructuredGridReader()reader.SetFileName(file_path)reader.Update()return reader.GetOutput()# 数据滤波和处理
def process_data(grid):# 示例:创建一个高斯平滑滤波器smooth_filter = vtk.vtkImageGaussianSmooth()smooth_filter.SetInputData(grid)smooth_filter.SetStandardDeviation(2.0)smooth_filter.Update()processed_grid = smooth_filter.GetOutput()return processed_grid

在上面的示例中,使用了 VTK 的 vtkXMLStructuredGridReader 类来加载存储为 VTK 文件的结构化网格数据。然后,应用了一个高斯平滑滤波器 vtkImageGaussianSmooth 来平滑处理数据。

  1. 可视化流体数据
    VTK 提供了多种可视化技术和工具,可以将处理后的流体数据呈现为三维图像或动画。可以使用 VTK 自带的可视化工具,也可以结合其他库(如 PyVista)进行更高级的可视化操作。

可视化流体数据示例

import vtk
import pyvista as pv# 可视化结构化网格
def visualize_grid(grid):# 将 VTK 结构化网格转换为 PyVista 网格pv_grid = pv.wrap(grid)# 创建一个绘图窗口plotter = pv.Plotter()# 添加网格到绘图窗口plotter.add_mesh(pv_grid, scalars="Temperature", show_scalar_bar=True)# 显示绘图窗口plotter.show()# 主程序入口
if __name__ == "__main__":# 创建结构化网格grid = create_structured_grid()# 可视化网格数据visualize_grid(grid)

在上述示例中,使用了 PyVista 来创建一个绘图窗口,并将 VTK 结构化网格转换为 PyVista 网格对象进行可视化。通过 plotter.add_mesh 方法,可以将网格添加到绘图窗口中,并显示温度标量数据(假设已经将温度数据添加到网格中)。

  1. 保存流体数据
    VTK 允许将处理后的数据保存为 VTK 文件,以便后续加载和分析。这在数据处理和模拟结果保存中非常有用。

保存结构化网格示例

import vtk# 保存网格数据到 VTK 文件
def save_to_vtk(grid, file_path):writer = vtk.vtkXMLStructuredGridWriter()writer.SetFileName(file_path)writer.SetInputData(grid)writer.Write()# 主程序入口
if __name__ == "__main__":# 创建结构化网格grid = create_structured_grid()# 保存网格数据到 VTK 文件file_path = "structured_grid.vtk"save_to_vtk(grid, file_path)print(f"Grid saved to {file_path}")

在上述示例中,使用 vtkXMLStructuredGridWriter 将创建的结构化网格数据保存到名为 “structured_grid.vtk” 的文件中。

在这里插入图片描述

  1. 创建流体数据
    首先,我们将演示如何创建一个简单的流体数据模拟,然后将其用于动画效果的可视化。在 VTK 中,我们可以通过生成结构化网格来表示流体数据,然后将数据添加到网格中。
import vtk# 创建结构化网格表示流体数据
def create_structured_grid():# 创建点数据points = vtk.vtkPoints()dimensions = (20, 20, 20)  # 网格维度for i in range(dimensions[0]):for j in range(dimensions[1]):for k in range(dimensions[2]):points.InsertNextPoint(i, j, k)# 创建结构化网格grid = vtk.vtkStructuredGrid()grid.SetDimensions(dimensions)grid.SetPoints(points)# 添加速度向量数据velocity_array = vtk.vtkFloatArray()velocity_array.SetName("Velocity")velocity_array.SetNumberOfComponents(3)  # 三维向量velocity_array.SetNumberOfTuples(grid.GetNumberOfPoints())# 设置速度向量数据(示例中简单设置为随机向量)import randomfor i in range(grid.GetNumberOfPoints()):velocity_array.SetTuple(i, (random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)))grid.GetPointData().AddArray(velocity_array)grid.GetPointData().SetActiveVectors("Velocity")return grid

在上述示例中,我们创建了一个简单的 20x20x20 的立方体结构化网格,并添加了名为 “Velocity” 的速度向量数据。实际应用中,速度数据可以根据实际模拟结果进行设置。

  1. 可视化流体数据并添加动画效果
    接下来,我们使用 VTK 来可视化上面创建的流体数据,并添加动画效果以展示流体的运动状态。
import vtk
import numpy as np
import pyvista as pv# 创建结构化网格
grid = create_structured_grid()# 将 VTK 结构化网格转换为 PyVista 网格
pv_grid = pv.wrap(grid)# 创建一个绘图窗口
plotter = pv.Plotter()# 添加网格到绘图窗口
plotter.add_mesh(pv_grid, scalars="Velocity", show_scalar_bar=True)# 设置相机位置和视角
plotter.camera_position = [(50, 50, 50), (10, 10, 10), (0, 0, 1)]# 添加动画效果
def update_scene():# 模拟动画效果,例如更新速度数据或网格位置displacement = np.random.uniform(-0.1, 0.1, size=pv_grid.points.shape)pv_grid.points += displacement# 添加回调函数来更新场景
plotter.add_callback(update_scene)# 显示绘图窗口
plotter.show()

在上述代码中,我们使用了 PyVista 来创建绘图窗口,并将 VTK 结构化网格转换为 PyVista 网格对象进行可视化。通过 plotter.add_callback 方法,我们添加了一个回调函数 update_scene,在每次渲染时更新网格的位置,以模拟流体的动态效果。

  1. 结果展示
    运行上述代码将打开一个 PyVista 的交互式窗口,显示具有动画效果的流体数据可视化。您可以通过修改回调函数 update_scene 中的更新逻辑来实现不同的动画效果,比如根据实际的流体模拟数据更新网格的位置或属性。

通过以上步骤,您可以在 VTK 中创建、处理和动态可视化流体数据,并根据需要定制动画效果,以便更好地展示流体的运动和行为。

import vtk
import pyvista as pv
import numpy as np
import random# 创建结构化网格表示流体数据
def create_structured_grid(dimensions=(20, 20, 20)):# 创建点数据points = vtk.vtkPoints()for i in range(dimensions[0]):for j in range(dimensions[1]):for k in range(dimensions[2]):points.InsertNextPoint(i, j, k)# 创建结构化网格grid = vtk.vtkStructuredGrid()grid.SetDimensions(dimensions)grid.SetPoints(points)# 添加速度向量数据velocity_array = vtk.vtkFloatArray()velocity_array.SetName("Velocity")velocity_array.SetNumberOfComponents(3)  # 三维向量velocity_array.SetNumberOfTuples(grid.GetNumberOfPoints())# 设置速度向量数据(示例中简单设置为随机向量)for i in range(grid.GetNumberOfPoints()):velocity_array.SetTuple(i, (random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)))grid.GetPointData().AddArray(velocity_array)grid.GetPointData().SetActiveVectors("Velocity")return grid# 创建结构化网格
grid = create_structured_grid()# 将 VTK 结构化网格转换为 PyVista 网格
pv_grid = pv.wrap(grid)# 创建一个绘图窗口
plotter = pv.Plotter()# 添加网格到绘图窗口,确保指定正确的数据数组名称
plotter.add_mesh(pv_grid, scalars="Velocity", show_scalar_bar=True)# 显示绘图窗口
plotter.show()

在这里插入图片描述
代码说明:
创建结构化网格函数 (create_structured_grid):

使用 VTK 创建一个简单的结构化网格,其中包含了三维点数据。
添加了名为 “Velocity” 的速度向量数据数组,数据内容为随机生成的三维向量。
转换为 PyVista 网格:

使用 pv.wrap 将 VTK 结构化网格转换为 PyVista 网格,以便后续使用 PyVista 进行可视化。
创建绘图窗口 (plotter):
在这里插入图片描述

使用 pv.Plotter() 创建一个 PyVista 绘图窗口,用于显示网格和数据。
添加网格到绘图窗口:

使用 plotter.add_mesh() 将 PyVista 网格添加到绘图窗口中,并指定要显示的数据数组为 “Velocity”,同时显示标量条。
显示绘图窗口:

使用 plotter.show() 显示 PyVista 绘图窗口,以查看包含速度向量数据的结构化网格的可视化效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot + Mybatis 实现sql打印

参照这个视频:https://www.bilibili.com/video/BV1MS411N7mn/?vd_source90ebeef3261cec486646b6583e9f45f5 实现mybatis对外暴露的接口Interceptor 使用Intercepts接口,这里的写法参照mybatis-plus中的拦截器写法 Intercepts({Signature(type Executor.class, m…

BC153 [NOIP2010]数字统计

数字统计 一.题目描述二.输入描述:三.输出描述:四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次…

如何恢复iPhone iCloud云盘资料删除?给出建议

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

【Java】已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决com.mysql.cj.jdbc.exceptions.CommunicationsException异常 一、分析问题背景 com.mysql.cj.jdbc.exceptions.CommunicationsException是Java程序在使用MySQL Connector/J与…

目标检测—Fast RCNN

介绍Fast R-CNN之前先简单回顾一下R-CNN和SPP-net R-CNN(Regions with CNN) affine image wraping 解析 Bounding Box Regression(边界框回归) 如何回归? 问题1:为什么要使用相对坐标差? …

立创开源学习篇(一)

1.机壳地 外面包围的一圈是机壳地,和金属外壳相连与电路板的GND不相连:(大疆很多产品有此设计) 屏蔽和接地:通过在电路板周围打孔,并连接到机壳地,可以形成有效的电磁屏蔽层(形成金…

【C语言】回调函数 和 部分库函数的用法以及模拟实现

一、回调函数: 1、定义: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 2、qsort的模拟实现…

怎样打印微信文档文件?

在日常生活和工作中,我们经常需要打印微信中的文档文件,无论是工作资料、学习笔记还是其他重要信息。随着科技的发展,我们不再需要前往打印店进行繁琐的操作,而是可以通过一些便捷的在线打印平台轻松实现。今天,我们就…

echarts学习:通过图例事件实现选中后控制多条折线的显隐

1.问题描述 我在工作中遇到了这样一个需求:我们都知道点击echarts折线图的图例,是可以控制折线的显隐的。我现在希望点击某一个图例可以改变多条折线的显隐。 例如在下面这张图中,我将“xxx水位”和“yyy水位”分为一组;将“xxx…

SGPT论文阅读笔记

这是篇想要用GPT来提取sentence embedding的工作,提出了两个框架,一个是SGPT-BE,一个是SGPT-CE,分别代表了Bi-Encoder setting和Cross-Encoder setting。CE的意思是在做阅读理解任务时,document和query是一起送进去&am…

Maven 配置学习:存在两个本地私服如何配置

Maven 配置学习:存在两个本地私服如何配置 目录 Maven 配置学习:存在两个本地私服如何配置解释:1.本地仓库位置:2.Profiles 定义:3.Repositories 定义顺序:4.Active Profiles: 操作步骤&#xf…

在Pycharm使用Github Copilot

文章目录 1.GitHub Copilot 是什么2.注册GitHub Copilot3.官方使用文档4.安装 GitHub Copilot插件5.在Pycharm中使用6.相关功能键7.启用或禁用 GitHub Copilot 1.GitHub Copilot 是什么 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码&#xff…

【MySQL进阶之路 | 高级篇】SQL执行过程

1. 客户端与服务器的连接 运行中的服务器程序与客户端程序本质上都是计算机的一个进程,所以客户端进程向服务器端进程发送请求并得到相应过程的本质就是一个进程间通信的过程. 我们可以使用TCP/IP网络通信协议,命名管道和共享内存等方式,实…

2024/6/18(RBAC,查询用户权限,细粒度授权,选课,支付宝生成二维码支付,支付结果查询需要内网穿透)

黑马程序员【学成在线项目】,P141 测试沙箱支付宝_黑马学成在线支付宝沙箱-CSDN博客 需要内网穿透

31.加载配置文件中的游戏到辅助列表

上一个内容:30.保存游戏配置到文件 以 30.保存游戏配置到文件 它的代码为基础进行修改 效果图: 加载配置文件到列表的函数: void CWndINJ::LoadGame() {int count GetPrivateProfileInt(L"main", L"count", 0, GameI…

通勤必备!重回儿时回忆,完全免费!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利三个网站,可以完全免费在线玩的小霸王游戏机,重回童年游戏时刻! 最后一款还可以网页在线和朋友联机CS、吃鸡、暗黑破坏神、拳皇、恐龙…

【数学】负数

Hello!大家好,我是学霸小羊,今天讲讲负数。 目录 1.负数的概念 2.绝对值 附:c求绝对值方法 3.负数的大小比较 1.负数的概念 比0小的数,叫做负数。 负数全称负实数,负数与正数表示意义相反的量。负数用负号(Min…

[NISACTF 2022]babyserialize(pop链详细分析、构造)

目录 [NISACTF 2022]babyserialize (一)理清pop链(链尾 链头),标注步骤 1. 先找eval、flag这些危险函数和关键字样(这是链尾) 2.往eval()上面看 3.往$bb()上面看 4.往strtolower()上面看 …

【GD32F303红枫派使用手册】第十六节 USART-DMA串口收发实验

16.1 实验内容 通过本实验主要学习以下内容: 串口DMA工作原理 使用DMA进行串口收发 16.2 实验原理 16.2.1 串口DMA工作原理 在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串…

烂笔头笔记:为JDK安装Charles证书,让你的请求能够像在浏览器中那样被抓包

为什么要为JDK安装Charles证书 众所周知,https就是为了防止中间过程被拦截从而导致数据泄密的。若强行加入Charles代理,数据被解密后再被其重新加密,数据已经被“破坏”,客户端从而拒绝建立连接或解析内容。 #mermaid-svg-ksLo5W…