使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

原文:

Losasso, Frank, Frédéric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462.

引言

这篇文章扩展了 [Popinet 2003] 的工作,拓展到表面自由流,并且使得八叉树不受限制

自适应网格划分的一个缺点是,它的模板不是均匀的,进而导致泊松方程中的系数矩阵是非对称的

我觉得他这个模板的意思就是,离散化速度的二阶导的这个离散的模板吧
或者说是格式?
比如对于最简单的均匀网格,对于某一个网格,考虑它的前后左右上下,因为是对称的,所以只需要三个方向,up right front 三个变量。以自己为中心,自己有一个 center 变量。所以构建矩阵的时候,每一个网格都有自己的一套 up = 0 right = 0 front = 0 center = 1。如果上方向是流体,那么 up = -c, center += c。这种模板?

[Popinet 2003] 对于这个非均匀的方程组是使用多级泊松求解器来求解的

但是 [Day et al. 1998] 指出这种方法在处理具有高频细节的物体的时候存在问题

这种方法也难以处理界面,比如空气与水的界面

本身界面的准确表达就是很困难的

[Suss-man et al. 1999] 提出了在界面处涂抹密度的方法(听起来这个涂抹就是一种混合?)

界面上的波是由压力差导致的,这种涂抹就是在减小高频的压力差,所以会消除细节

这篇文章坚持使用八叉树作为自适应方法,虽然一般情况下这会导致非均匀的泊松方程组,但是这篇文章使用了特殊的设计,根据这种设计,他们得到的泊松方程仍然是对称正定的

虽然“使用了特殊的设计”并不是它的原话,但是我觉得他是这个意思?

以往的工作

求解 NS 方程,半拉格朗日求解平流,火、云、粒子爆炸、粘性流、气泡和表面张力、水花和泡沫

SPH

八叉树上的 SDF

SDF 的重新初始化

速度外推

半拉格朗日法求解水平集可能耗散比较大,导致质量损失严重

粒子水平集法的耗散可能更少

使用四叉树的水平集演化

但是这些研究都没有考虑到水的界面

水的界面,不就是水平集的一个应用吗?有点不理解

自适应网格细化 adaptive mesh refinement (AMR) 通常使用多个不同分辨率的网格,重叠在一起

一开始这是为了研究激波的,所以块状结构能够减少切换网格层次所带来的伪激波反射

但是,如果不考虑激波,那么就可以使用不受限的八叉树

这里讲的是它的灵感来源?

八叉树

压强存储在格子中心,速度存储在面上(MAC 网格),其他标量存储在格子节点

他说使用节点存储标量很方便,因为它的插值方便(我怎么不觉得)

在这里插入图片描述

粗粒化是把小单元合并成大单元

在这个过程中,节点中的旧值,要么被删除,要么保持不变;面上的旧值经过平均赋给新值

我一开始想,这里讲的“节点中的旧值”,包不包括网格中心上的值?

在这里插入图片描述

画了一下,八个块变成一个块,最后的大块的中心的那个压强应该是平均来的才对,之前那个位置是存别的标量的顶点的位置……所以他指的“节点中的旧值”应该是不包括网格中心的值

那他这里就说少了一个情况啊……算了

细化是从一个大单元细分成多个小单元。边的半点上的值来自两端顶点的平均值,面中心的顶点的新值来源于这个面的四个角点的平均值。细分后的面上的速度,是来源于细分后的顶点上的速度的平均。而细分后的顶点上的速度,来源于他周围四个细分前的面的平均。

这个"细分前"、"细分后"定语都是我自己加的
我觉得这个细分后的顶点上的速度的来源很奇怪啊,不是所有细分后的顶点都是周围四个面,也有周围两个面的。那对于这个两个面的,是不是只是两个面的速度的平均?
下面是我画的,获得细分后的顶点上的速度的两种情况的示意图

在这里插入图片描述

对于所有变量,我们将边上的 T 形连接节点约束为从该边上的邻居进行线性插值。类似地,面上的 T 形连接节点被限制为周围四个角值的平均值。参见,[Westermann et al. 1999]

这个是真的有点难理解,只好机翻了

八叉树上的 NS 方程

散度算子

泊松方程

∇ 2 p = ∇ ⋅ u ∗ / Δ t \nabla^2 p = \nabla \cdot u^* / \Delta t 2p=ut

他把泊松方程应用在体积上,得到

V c e l l ∇ 2 p = V c e l l ∇ ⋅ u ∗ / Δ t V_{cell} \nabla^2 p =V_{cell} \nabla \cdot u^* / \Delta t Vcell2p=Vcellut

不知道怎么就这样直接得到的

或许他是默认,对于整个体积,物理量都是一样的,所以相当于 ∫ 1 d V = V \int 1 dV = V 1dV=V

然后他说用格林公式,或者说是高斯公式吧?把体积分转换成面积分

这里就是它处理八叉树的部分了,我猜,不同分辨率的网格的相接可以转换为一个大的网格面和多个小的网格面的重叠,这样的情况?

现在等式左右两个都可以这么转换。只看对于速度散度的转换,相等于考虑一个散度算子。转换成面积分的话,只有垂直于面的分量才有效,所以速度乘以了一个法向量

然后我猜他是要强调处理一个大面和多个小面的重叠,所以才不写成 ( u f a c e ⋅ n ) A f a c e (u_{face} \cdot n) A_{face} (ufacen)Aface

而是写成求和的形式

V c e l l ∇ ⋅ u ∗ = ∑ f a c e s ( u f a c e ⋅ n ) A f a c e V_{cell} \nabla \cdot u^* = \sum_{faces} (u_{face} \cdot n) A_{face} Vcellu=faces(ufacen)Aface

重新看他画的网格

在这里插入图片描述

后面他印证了我的想法,这么写就是为了适应一个面和多个小面重叠的情况

在这里插入图片描述

然后导数就可以把大面和小面联系起来,真的很奇妙,虽然从泰勒展开的直接上是消掉了常数项,但是不知道为什么就这么直接得到了

然后压强的拉普拉斯算子的转换到面积分的过程,只是在压力梯度上套用散度算子

在这里插入图片描述

压力梯度

在这里插入图片描述

如果是两个大小相同的,那么就是压强梯度 py

如果是为了在网格 1 和 2 之间的话,那么首先在 p1 和 p10 之间插值得到 pa,然后在 pa 和 p2 之间得到压强梯度 px hat

但是 px hat 不在面上,所以可能会采用更加复杂的离散化的方法,比如使用 pa p2 p6 来构造压强梯度,例如 [Chen et al. 1997]

但是这种复杂的离散化方法就导致了泊松方程的非对称性

因为 1 和 2 之间的压强梯度会依赖于 p10 和 p6,这就是明显网格 1 依赖于某一个方向上的压强了。相反地,网格 6 不太可能依赖于网格 1,因为网格 6 已经和一个相等大小的网格 2 并列了。即使依赖了,也不会对称

之后感觉是精华的部分,就是他为了消除这种依赖,进而得到对称的结构所做的事

之前说 px hat 不在面上,所以采用了更加复杂的离散化措施,这是一个导致不对称性的原因。所以现在他就干脆不用复杂的离散化措施,就直接令 px hat 代表面上的压强梯度,也就是网格 1 与网格 2 之间的压强梯度

然后不对称性的第二个原因是 pa 由 p1 和 p6 插值,会依赖 p6。那么他就直接令 pa = p1,不要这个插值了

经过这一通化简,计算网格 1 和网格 2 之间的压强梯度就只用到网格 1 和 2 的压强了

他这里就认为,引入了 O ( Δ x ) O(\Delta x) O(Δx) 级别的误差是可以接受的

那么现在网格 1 和网格 2 之间是对称的了

现在泊松方程组就是对称的了

准确度

他认为半拉格朗日平流是一阶,现在压强求解是一阶,也只是两个的精度相同

但是它的测试是精度还是挺好的

烟雾

总结

后面的都无关紧要了

总之他这个文章的核心就是,现在八叉树的两个网格就只考虑彼此,暴力忽略其他网格,就这么得到了对称的模板

忽然发现称为模板隐含着一个很优雅的事情,就是它可以包括某个点是流体或者是固体的情况

这样,我们只需要最后讨论一下边界条件怎么放进来就好了,一开始推公式的时候就不用想边界

好酷啊

在这里插入图片描述

总之好羡慕啊,我现在的心情就跟我第一次看到半拉格朗日平流的 stable fluid 一样,感觉这么简单但是有效的东西,他们就能够研究到,然后发出来,就很优雅,很有应用上的美感的这么一件事

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

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

相关文章

数据输入时,数据的类型不匹配

一、问题背景 数据输入时,数据类型不匹配。此时输入失败,变量的值还是原来的值。 说明: 变量如果不做初始化,它的值是不确定的。 良好的编程习惯:变量在定义时,进行初始化,eg&#xff1…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲: 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具,泛指业务软件开发,所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动

在国内视频应用对GB监控接入是常规操作,很多系统需要接入监控视频交互处理。我们以ovmedia视频会议为例做一个接入互动。 GB28181协议在流媒体系统较为普及,我们以开源SRS系统对接监控端再接入会议(也可以用商用GB流平台,操作基本…

Midjourney绘图欣赏系列(五)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

React18原理: React核心对象之ReactElement对象和Fiber对象

React中的核心对象 在React应用中,有很多特定的对象或数据结构.了解这些内部的设计,可以更容易理解react运行原理列举从react启动到渲染过程出现频率较高,影响范围较大的对象,它们贯穿整个react运行时 如 ReactElement 对象如 Fi…

OpenAl 视频生成模型 —— Sora技术报告解读

这里是陌小北,一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的,背诗的里面最会写段子的,写段子的里面代码写得最好的…厨子。 写在前面 早上醒来,就看到OpenAl推出的视频模型Sora炸锅了,感觉所…

Windows环境部署nginx 文件服务器

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 在Windows环境下使用nginx部署简单的文件服务器 一、版本 1. Windows 使用版本 2. nginx 使用版本 选择Mainline Version版本 二、nginx配置 1. 下载 https://nginx.org/en/download.…

leetcode日记(31)缺失的第一个正数

挺简单的困难题 class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());int nnums.size();int i0;bool b0;if(nums[0]>0) b1;int p1;for(;i<n;i){if(i1>0&&i1<nums.size()&&nums[i]<…

Switch开关(antd-design组件库)简单使用

1.Switch开关 开关选择器。 2.何时使用 需要表示开关状态/两种状态之间的切换时&#xff1b; 和 checkbox 的区别是&#xff0c;切换 switch 会直接触发状态改变&#xff0c;而 checkbox 一般用于状态标记&#xff0c;需要和提交操作配合。 组件代码来自&#xff1a; 开关 Swit…

专业140+总410+合工大合肥工业大学833信号分析与处理综合考研经验电子信息与通信工程,真题,大纲,参考书。

经过一年努力奋战&#xff0c;今年初试总分410&#xff0c;其中专业课833信号分析与处理综合&#xff08;ss和dsp&#xff09;140&#xff08;感谢信息通信Jenny老师去年的悉心指导&#xff09;&#xff0c;数一130&#xff0c;顺利上岸&#xff0c;被合工大录取&#xff0c;看…

18-k8s控制器资源-cronjob控制器

job控制器是执行完一次任务&#xff0c;就结束&#xff1b; cronjob控制器&#xff0c;是基于job控制器&#xff0c;定期频率性执行任务&#xff1b;等同于linux系统中的crontab一样&#xff1b; 1&#xff0c;编辑cronjob资源清单 [rootk8s231 pi]# vim cronjob.yaml apiVers…

【Python如何在列表中随机抽出一个元素】

1、python代码如下&#xff1a; import random a [2, 4, 8, 9, "whats up"] q random.choice(a) # 随机从列表a中输出一个元素 b random.choices(a) # 随机从列表a中取出一个元素输出一个列表 lucky_num random.randint(1, 50) # 随机从1-50中取出一个整数包…

GuitarPro8激活许可证24位下载

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 如何安装激活。 Guitar Pro 8.1官方中文解锁版如何安装 …

Qt的安装

下载安装包 我们选择Open Source的版本。 可以从https://www.qt.io/download-open-source直接下载最新版本&#xff0c;对于想要选择特定版本&#xff0c;或者尝试beta版功能的用户&#xff0c;也可以从https://download.qt.io选择自己需要的版本。 如果你的网速可以的话&am…

系统集成商如何成功集成 MDR

安全系统集成商在为各行业组织设计、安装和维护复杂的安全解决方案方面发挥着关键作用。 在运营技术(OT) 中&#xff0c;物理和数字环境比以往任何时候都更加交织在一起&#xff0c;需要额外保持警惕来检查威胁检测和响应。随着网络威胁日益丰富和复杂&#xff0c;许多客户现在…

21-k8s中pod的调度-污点和污点容忍

一、污点的概念 所谓的污点&#xff0c;就是给k8s集群中的节点设置的污点&#xff0c;通过设置污点&#xff0c;来规划资源创建时所在的节点&#xff1b; 污点的类型解释说明PreferNoshedule 节点设置这个五点类型后&#xff1b; 表示&#xff0c;该节点接受调度&#xff0c;但…

MCU看门狗

目录 一、独立看门狗(IWDG) 1、IWDG 主要作用 2、IWDG 主要特性 3、编程控制 4、注意地方 二、窗口看门狗(WWDG) 1、窗口看门狗作用&#xff1a; 2、窗口看门狗产生复位信号有两个条件&#xff1a; 3、WWDG 框图 4、WWDG 将要复位的时间 5、编程控制 一、独立看门…

记一次有趣的逻辑漏洞挖洞经历

前言 前几天在网上冲浪的时候无意间看到了一个Edu的站点&#xff0c;是一个很常见的类似MOOC的那种在线学习系统&#xff0c;对外开放&#xff0c;同时有注册和登录功能。对于我这种常年低危的菜鸡来说&#xff0c;这是最愿意看到的&#xff0c;因为一个Web网站有了登录功能&a…

VMware Workstation下载安装

一、VMware Workstation的简介 VMware Workstation是一种虚拟化软件&#xff0c;允许用户在单台PC上创建和运行多个虚拟机。它支持不同操作系统的同时运行&#xff0c;提供灵活的网络配置和资源管理&#xff0c;方便开发、测试和部署应用程序&#xff0c;提高工作效率和资源利用…

20-k8s中pod的调度-nodeSelector节点选择器

一、概念 我们先创建一个普通的deploy资源&#xff0c;设置为10个副本 [rootk8s231 dns]# cat deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: dm01 spec: replicas: 10 selector: matchLabels: k8s: k8s template: metadata: …