使用八叉树模拟水和烟雾 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 一样,感觉这么简单但是有效的东西,他们就能够研究到,然后发出来,就很优雅,很有应用上的美感的这么一件事

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

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

相关文章

Oracle 基础入门指南

一、什么是Oracle? Oracle是一款由美国Oracle公司开发的关系型数据库管理系统。它支持SQL查询语言,并提供了丰富的功能和工具,用于管理大规模数据存储、处理和访问。Oracle被广泛应用于企业级应用中,包括金融、电信、零售等各行各…

第12章 反射

12.1 反射概述 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以得到任意一个对象所属的类的信息,可以调用任意一个类的成员变量和方法,可以获取任意一个对象的属性和方法…

js---webAPI

01 声明变量 js组成: DOM:操作网页内容的,开发页面内容特效和实现用户交互 BOM: DOM树:将 HTML 文档以树状结构直观的表现出来,我们称之为文档树或 DOM 树 文档树直观的体现了标签与标签之间的关系 CSS获取元素的方法 document.querySele…

精品springboot基于大数据的电脑主机硬件选购助手-可视化大屏

《[含文档PPT源码等]精品基于springboot基于大数据的电脑主机硬件选购助手[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: Java——涉及技术: 前端使用技术&a…

Cron表达式选择器

Cron表达式选择器 功能描述 Cron表达式选择器是用于定时任务调度的一种常见工具,通常用于指定任务的执行时间。Cron表达式由一系列时间单位和对应的时间值组成,用于指定任务的执行时间。下面是一个Cron表达式的示例 0 0 12 * * ?这个表达式的含义是每…

电阻器的脉冲浪涌能力?

由于现有需求,许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护,尤其是在电机控制器等电路中。当电机启动时,此时消耗的电流过大,可能导致电阻器故障。同样,如果电容器用于电机…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱13(附带项目源码)

效果演示 文章目录 效果演示前言每次丢弃一个物品源码完结前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将探索如何用unity制作一个3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机…

MySQL性能分析1

1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次,得到当前数据库是以插入,更新和删除为主还是以查询为主,如果是以插入,更新和删除为主的话,那么优化比重可以轻一点儿。 语法: …

Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按照输入点顺序连曲线

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136131310 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

适用于 Windows 的 12 个最佳 PDF 编辑器

PDF文档的普遍存在按理说,PDF文档的可读性和可移植性受到专业文档的青睐。 然而,PDF格式的可食用性是一大缺陷。幸运的是,各种 PDF 编辑工具和软件使 PDF 的编辑变得更加容易,这篇文章旨在帮助我们的读者找到其中最好的工具和软件…

CSS的注释:以“ /* ”开头,以“ */ ”结尾

CSS的注释:以“ /* ”开头,以“*/”结尾 CSS的注释: 以“ /* ”开头,以“ */ ”结尾 在CSS中,注释是一种非常重要的工具,它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…

JS进阶——垃圾回收机制以及算法

版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…

IDM6.42.3下载器(Internet Download Manager)俄罗斯大神版,

IDM下载器(Internet Download Manager)俄罗斯大神版,目前最新版是 6.42.3。 Internet Download Manager(简称:IDM)是一款来自国外的非常优秀网络资源高速下载及管理工具,该软件同时是一款收费共…

计算机毕业设计SSM基于的高校学习资源共享系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: vue mybatis Maven mysql5.7或8.0等等组成,B…

电子元器件基础6---三极管

了解了二极管后,接下来就是三极管了。二极管是一个PN结,而三极管是两个PN结构成。 一、三极管概念 三极管,全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种控制电流的半导体器件。其作用是把微弱信号放大成幅度值较大的电信号,也用作无触点开关。 三极管是半…

php数据类型以及运算符、判断条件

php数据类型以及运算符 1. php数据类型2. 使用举例3. 运算符4. 判断条件if else elseif 1. php数据类型 包括 String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值) 2. 使用举例 1.字符串 2.整型 3.浮点型 4.布尔型 5.数组…

出境游确实在恢复

新加坡开放中国大陆游客免签,我坦白承认,这是我之前未曾预料的。 那么春节期间,朋友圈里见证了市中心的蜂拥盛景,很多在坡多年的朋友说,在新加坡多年,从未见过如此拥挤的人群,甚至非常担心会出现…

代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90

文章目录 Day 2801. 复原 IP 地址(No. 93)1.1 题目1.2 笔记1.3 代码 02. 子集(No. 78)2.1 题目2.2 笔记2.3 代码 03. 子集 II(No. 90)3.1 题目3.2 笔记3.3 代码 Day 28 01. 复原 IP 地址(No. 9…

django中事务和锁

目录 一:事务(Transactions) 二:锁 在Django中,事务和锁是数据库操作中的两个重要概念,它们用于确保数据的完整性和一致性。下面我将分别解释这两个概念在Django中的应用。 一:事务&#xff…

EasyRecovery软件免费版与付费版有哪些功能区别?

免费版的EasyRecovery软件在功能和恢复能力上确实存在一些限制。 首先,在数据恢复方面,免费版通常只能恢复最多1GB的数据。这意味着,如果你需要恢复的数据量超过1GB,你将需要升级到付费版才能完全恢复。 其次,免费版…