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

news2024/11/19 22:34:50

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 random
    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

在上述示例中,我们创建了一个简单的 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.coloradmin.cn/o/1838303.html

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

相关文章

教育与学习助手:Kompas AI革新学习体验

一、引言 在个性化学习需求日益增长的今天,教育领域正经历着一场技术革命。Kompas AI,作为一款先进的人工智能助手,正以其独特的功能和应用,为学习者提供个性化的学习支持,满足不同背景和需求的学生。 二、功能介绍 Ko…

通过编辑器工具改变Inspector锁定状态

是在看一系列视频的时候,看到的,感觉挺有用,就记录下来。 就是这个小锁的按钮,后续可以通过快捷键,快速锁定和解锁。代码里没有加入快捷键控制,有需要用到的可以自己加一下,比较简单 using Uni…

大模型学习路线,存下吧很难找全的

随着人工智能技术的飞速发展,大模型在自然语言处理、计算机视觉、推荐系统等领域取得了显著成果。越来越多的学者和开发者开始关注并投身于大模型的研究与应用。本文将以大模型学习路线为核心,为您介绍从入门到精通所需掌握的知识和技能。 一、入门篇 …

简单好用的C++日志库spdlog使用示例

文章目录 前言一、spdlog的日志风格fmt风格printf风格 二、日志格式pattern三、sink,多端写入四、异步写入五、注意事项六、自己封装了的代码usespdlog.h封装代码解释使用示例 前言 C日志库有很多,glog,log4cpp,easylogging, eas…

[Java基础揉碎]QQ聊天项目

多用户系统演示 项目开发流程 多用户通讯需求 通讯系统整体分析 用户登录 新建项目 在建一个项目 user类 加上序列化, 加上UID增加兼容性 message类 消息类型 新建一个接口 客户端也拷贝过来 新建包和菜单界面类 工具类 新建一个类 新建一个类 回到这个类 写成这个名…

【论文精读】树环水印Tree-Ring Watermarks:隐形且稳健的扩散图像的指纹

文章目录 一、文章概览(一)主要工作(二)相关工作 二、具体方法(一)威胁模型(二)树轮水印概述(三)构造树轮水印键(四)提取用于水印检测…

【unity笔记】四、Enviro- Sky and Weather插件使用

一、 简介 Enviro内置 RP、URP、HDRP,开箱即用。 动态天空 随附的天空系统经过精心设计,以实现最佳性能和灵活性。使用多种颜色渐变,而不是调整人工数字。为您的项目创建独特且非常逼真的天空非常简单! 灯光 由 Enviro 控制的逼…

APMCM亚太地区大学生数学建模竞赛奖励细则

APMCM亚太地区大学生数学建模竞赛(以下简称竞赛)是由北京图象图形学学会、亚太地区大学生数学建模竞赛组委会主办的面向全日制普通高等院校在校学生的学科竞赛活动。根据竞赛的宗旨,为了切实提供有价值的奖励政策,鼓励广大师生参与…

6.深度卷积神经网络

目录 1.深度卷积神经网络ALexNet 2012AlexNetAlexNet架构AlexNet与LeNet复杂度对比总结代码实现2.使用块的网络VGG 2014 image竞猜第二VGG架构进度总结代码实现3.网络中的网络NiN全连接层的问题NiN块NiN架构总结代码实现4.含并行连结的网络(GoogLeNet)2014 image竞猜第一最好…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考: https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低,按照下面的步骤进行操作: 使用的硬件平台为Xavier NX,系统环境如下图: 搭建docker环境需求跟实际环境一致如下…

逻辑地址 线性地址 物理地址 Linux kernel 内存管理设计

linux kernel 2.6以后的MM,受到了兼容 risc arch cpu 的 MM 的启发,新的 MM 架构对 x86 上任务切换的效率上也有明显提高。 新的MM架构,GDT 不再随着进程的创建与结束而创建和删除 新的表项。 TSS段 也只有一个,进程切换时&…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来,手持风扇已成为人们出行的必备清凉神器。然而,面对市场上众多品牌的手持风扇,如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰,我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

STM32 JTAG 模式和 SWD 模式的区别详解

在调试和编程 STM32 微控制器时,使用 JTAG(Joint Test Action Group)模式和 SWD(Serial Wire Debug)模式是两种常见的方法。它们在接口需求、调试能力、引脚数量、通信速度等方面各有特点。我们一般采用的的下载器如ST…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中,如果能熟练掌握以下这些使用频率很高的脚本,那工作起来真的是手拿把攥,事半功倍,接下来给大家介绍一些我们日常使用率很高的一些脚本! 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…

MySQL数据库笔记(二)

第一章 单行函数 1.1 什么是函数 函数的作用是把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在SQL中使用函数,极大地提高了用户对数据库的管理效率。 1.2 定义 操作数据对象。 接受参数返回一个结果。 只对一行进行…

性能工具之 JMeter 常用组件介绍(八)

文章目录 一、Jmeter命令行启动二、Jmeter脚本录制 本文主要介绍JMeter命令行启动和脚本录制功能 一、Jmeter命令行启动 Jmeter有两种运行: 一种是采用的界面模式(GUI)启动,会占用不少系统资源;另一种是命令行模式(n…

力扣hot100:31. 下一个排列

LeetCode:31. 下一个排列 字典序的大小排序: 从前往后对比,如果先出现更小字符的,字典序更小,如果有个字符串结束了,则它更小。string s "112233"和string t "1122334",…

训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: "sea", "eat"输出: …

71. UE5 RPG 实现敌人召唤技能

在这一篇文章中,我们要实现敌人的召唤师能够召唤自己的仆从进行作战。 要实现这个技能,我们首先创建新的敌人蓝图,用于召唤。接着,我们将实现一个召唤技能基类,在基类中实现在召唤师的周围获取到可以生成的位置点&…

数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

概述 MapReduce 是 Google 大数据处理的三姐马车之一,另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深。实际上,万变不离其宗,它的本质就…