【深度学习驱动流体力学】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 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 绘图窗口,以查看包含速度向量数据的结构化网格的可视化效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 单词大师(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

【每天学会一个渗透测试工具】Nessus安装及使用指南

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 其他扫描工具: AWVS和Xray:应用漏洞扫描工具 fscan:虽然能扫主机,但比较老了…

心跳机制讲解及实例

什么是心跳机制 心跳机制出现在tcp长连接中,客户端和服务器之见定时发送一种特殊的数据包通知对方还在线,以确保tcp链接地可靠性,有可能tcp链接由于某些原因(列入网线被拔了,突然断电)导致客户端断了,但是服务器不知道…

PDM 测试

文章目录 硬件拓扑AP 生成 PDM输出数据路径AP 输入时域数据频域数据逻辑分析与抓包硬件拓扑 如果使用 AP 需要注意公地 AP 生成 PDM输出 AP 的 output 选择 PDM,MCU 提供 Bit clock,AP 生成 PDM 数据,AP 配置如下 数据路径 AP sin data -> PDM -> codec -> RA…

从11个视角看全球Rust程序员4/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 8 Rust程序员最喜欢用什么工具调试程序? 用println!或dbg!宏来调试一下 2022年:55%2023年:55%在IDE里玩玩UI调试 2022年:27%2023年:29%在控制台里调试调试 2022年:11%2023年:10%不调试,任性 2022年:5%2023年:6%有其他奇思妙想 2022年:1%…

软考阅卷将完成?!软考成绩有望六月底公布!

2024上半年软考考试已于5月25日-28日举行,考完试后大家最关心的事情莫过于查分了。 一、最新消息 1、不同地区在报名时对成绩公布的时间有所预示,但并没有一个统一的日期举个例子,江苏考区预计在6月下旬公布成绩,而黑龙江考区则预…

自注意力与卷积高效融合!多SOTA、兼顾低成本与高性能

在自注意力机制中,模型计算输入序列中不同位置的相关性得分,以生成连接权重,从而关注序列中的重要部分。而卷积通过滑动窗口的方式,在输入上应用相同权重矩阵来提取局部特征。 如果将以上两者结合,就可以同时利用自注…

爱死了,4款逆天IOS App推荐!

河马喝水提醒 「河马喝水提醒」是一款生活小助手应用,旨在帮助用户建立并维持定时喝水的良好习惯。该应用不仅是一个提醒闹钟,更是健康生活的贴心伙伴。它每天定时推送提醒,帮助用户在繁忙的日常中不忘补充水分。此外,该应用还提供…

软件性能测试之负载测试、压力测试详情介绍

负载测试和压力测试是软件性能测试中的两个重要概念,它们在保证软件质量和性能方面起到至关重要的作用,本文将从多个角度详细介绍这两种测试类型。 一、软件负载测试   负载测试是在特定条件下对软件系统进行长时间运行和大数据量处理的测试&#xff…

电能表厂家的研发能力是实力的体现

电能表厂家的研发能力无疑是其整体实力的核心体现。一个拥有强大研发能力的电能表厂家,不仅能够持续推出具有竞争力的新产品,满足市场需求,还能引领行业发展,塑造企业品牌形象。 一、研发能力对电能表厂家的重要性 研发能力是电…

如何预防最新的Mallox变种hmallox勒索病毒感染您的计算机?

一、引言 近年来,网络安全问题日益严重,勒索病毒成为了其中的一大威胁。其中,.hmallox勒索病毒作为Malox勒索软件家族的新变种,凭借其高度的攻击性和隐蔽性,给全球用户的数据安全带来了严重威胁。本文将深入分析.hmal…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…

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

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

PHP基础语法【上】

文章目录 一、环境安装二、代码应该写在哪里?三、什么是错误?四、变量无需声明变量变量命名规则变量的作用域可变变量 五、常量常量的定义常量的特性 六、数据类型NULL 空值Boolean 布尔类型Integer 整型Float 浮点型String 字符串Array 数组Object 对象…

有效招聘营销策略的六个组成部分

任何想吸引更多人购买其产品的公司都必须投资于市场营销。然而,当涉及到让更多的人了解公司的工作时,许多有效的营销活动可能不是招聘团队的首要考虑因素。为了超越招聘委员会上的“发布祈祷”策略,有必要包括有效招聘营销策略的所有组成部分…

Redis 6.0新特性详解

Redis 6.0新特性主要有3个:多线程、Client Side Cache、Acls。下面详细说明一下。 1.多线程 redis 6.0 提供了多线程的支持,redis 6 以前的版本,严格来说也是多线程,只不过执行用户命令的请求时单线程模型,还有一些线…

【Axure高保真原型】动态统计中继器表格项目数

今天和大家分享动态统计中继器表格项目数的原型模板,具体包括以下功能: 表格下方可以自动根据表格内容统计表格的总项目数、启用和禁用数、选中和未选中数 我们可以点击开发切换启用和禁用 点击多选按钮,选中或取消选中对应行内容 选中后可…

跨境电商源码支持,多国语言与货币切换功能全解析

一、背景介绍 跨境电商的兴起,使得供货商和代理商们面临着一个全新的挑战:如何管理跨国交易和多语言 的销售平台。为了解决这一问题,跨境电商源码应运而生。本文将全面解析供货商和代理商后 台所具备的跨境电商源码支持功能&…

环境搭建---nginx

nginx离线安装 下载地址:https://nginx.org/download/ 一、安装编译工具及库文件 [rootVM-20-14-centos ~]# yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel二、安装 PCRE [rootVM-20-14-centos ~]# tar -zxvf pcre-8.35.tar.gz [r…

从热潮到理性,大模型迎来产业「拐点」

前言 无人不谈大模型,是今年上半年科技界的真实写照。 从市场热闹程度来看,大模型已经成为各家科技厂商争先涌入的赛道,无论是互联网巨头,还是科技公司,甚至是研究机构,均已加入这场大模型混战&#xff0…