我正在尝试实现用于在JavaScript中模拟流体的Clavet方法,因此调试是一个噩梦,这就是为什么我在这里问,希望有人经历过同样的事情会告诉我我做错了什么.
到目前为止,我有工作OKAY:
但我有两个问题:
1)因为在这种方法中,所有东西都被"偏移"了半步,我不确定如何正确地将粒子从墙上弹开.现在我取出粒子的位置和先前的位置并将它们绕过交叉的墙壁,然后通过反弹因子围绕交叉点进行缩放.
我的逻辑告诉我这应该有效.算法的下一步是更新粒子速度,所以我也反映了之前的位置.但在实践中,这给了我一个我不明白的结果:
这显示了粒子上的"力".墙壁反射过多的力量,使一切都保持永久运动.
公式4.58在本文中 明显显示了一种方法,以防止这一点,但我一直没能得到它的工作.
还有我没有得到的论文中的内容,例如"我们只想反映碰撞中省略的速度"的意思.为什么?请问ELI5这个东西给我好吗?
2)即使不涉及墙壁,模拟也会定期"爆炸".更高的压力会发生这种情况:
这是 JavaScript,所以就是这样,但是我已经完成了代码,并且没有任何划分零或者我可以想象NaN正在发生的情况.
我在论文中看到过关于SIM卡不稳定性的一些话题,我想知道是不是这样.这篇文献中的大部分内容都超出了我的范围.
根据我的理解(我认为),消除不稳定性的方法之一是粘度,但我添加它并且它对爆炸没有帮助:
我可以发布代码,但是在开始工作的第一阶段,它现在很难阅读.
最后一个问题:我如何弄清楚如何将此方法中的伪常量转换为物理单位?
编辑:我发现SIM卡偶尔会冻结,看起来它确实在某个地方产生了NaN,但是Chrome却抓得太晚了.
以下流体模拟是Stam翻译的一篇论文.发生了真正可怕的事情.每次程序以低运行时DIFF=0.01,值从小开始然后快速扩展或"爆炸".我仔细检查了数学例程.由于代码以1开始0.5,数学上它是乘法并添加一串零,因此最终结果应接近零密度和其他向量.
代码很长,所以我把它分成块并删除了额外的代码.减去所有开头和SDL代码只有大约120行.我花了几个小时尝试改变无济于事,所以非常感谢帮助.
经过一些实验,我相信当DIFF设置得太低时可能会出现一些浮点错误.当值从0.01to 增加时0.02,值不会爆炸.但我不认为这是整个问题.
需要明确的是,1201ProgramAlarm和vidstige的当前答案无法解决问题.
在部分大胆的重要组成部分,其余的是为了保持完整性.
开始的东西,跳过
#include <SDL2/SDL.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define IX(i,j) ((i)+(N+2)*(j))
using namespace std;
// Constants
const int SCREEN_WIDTH = 600;
const int SCREEN_HEIGHT = 600; // Should match SCREEN_WIDTH
const int N = 20; // Grid size
const int SIM_LEN = 1000;
const int DELAY_LENGTH = 40; // ms
const float VISC = 0.01;
const float …Run Code Online (Sandbox Code Playgroud) 我正在尝试在HTML5画布上编写一个流畅的动态模拟器.我在互联网上发现了一些非常酷的东西,它们总是看起来像一个很有前途的起点,但它们都是基于细胞的,并且使用了一些疯狂的数学.
我希望能够添加任意障碍(任何方向的线条,圆圈等)以使事情更有趣,但我不知道从哪里开始.
有没有人知道一些相当简单的流体模拟方程,包括任何方向的障碍?或者,是否有人能指出我需要采用上述例子中的一个并增加障碍?
我知道这个问题与我应该问的数学倒流有关,但它们似乎更多地涉及理论的东西.如果我在错误的地方,请道歉.我真的不知道从哪里开始 - 如果有人在之前使用任意障碍进行流体模拟,我可以使用一些指针.
这里的准确性在简单性方面落后了.
谢谢!
1)有没有证据表明混合刚体phisix和流体(比如SPH)的模拟可以为现实世界提供建模?
2)这种混合的框架如何工作?
假设我们在一个箱子里面有一个woden秋千,里面有两种不同的液体(油和水)和一个柔软的身体球.开始条件如下:

我们怎么能模拟这种情况呢?用什么工具?
我现在如何看待它(如果我错了请高高在上)
*)*在RB\SB phisix引擎中加载()并制作框架.*在流体发动机的tate()中表示我们的rb/sb,作为来自力场的脉冲的粒子*)使用RB和SB作为粒子,其密度对应于它们制作的材料,并且脉冲对应于先前计算的矢量场**)这至少在理论上可以近乎实时地用gpu上的当前流体3 +子弹3来计算......对于简单的情况......但是我想知道这使得系统不真实多少?
这种流体模拟基于Stam的论文.在第7页,他描述了平流背后的基本思想:
从两个网格开始:一个包含上一个时间步长的密度值,另一个包含新值.对于后者的每个网格单元,我们通过速度场向后追踪单元的中心位置.然后,我们从先前密度值的网格线性插值,并将此值分配给当前网格单元格.
Advect代码.两个密度网格是d和d0,u并且v是速度分量,dt是时间步长,N(全局)是网格大小,b可以忽略:
void advect(int b, vfloat &d, const vfloat &d0, const vfloat &u, const vfloat &v, float dt, std::vector<bool> &bound)
{
float dt0 = dt*N;
for (int i=1; i<=N; i++)
{
for (int j=1; j<=N; j++)
{
float x = i - dt0*u[IX(i,j)];
float y = j - dt0*v[IX(i,j)];
if (x<0.5) x=0.5; if (x>N+0.5) x=N+0.5;
int i0=(int)x; int i1=i0+1;
if (y<0.5) …Run Code Online (Sandbox Code Playgroud) 我是一名航空航天学生,正在为我们的python编程课程学习项目.赋值是仅使用Pygame和numpy创建程序.我决定创建一个模拟二维机翼上气流的风洞模拟.我想知道是否有更有效的方法从编程角度进行计算.我会解释一下这个程序:
(稳定)流场使用涡旋面板方法建模.基本上,我使用Nx乘Ny点的网格,其中在每个点给出速度(u,v)向量.然后使用Pygame我将这些网格点映射为圆圈,这样它们就像一个影响区域.网格点是下图中的灰色圆圈:
我创建N个粒子并通过迭代确定它们的速度如下:
创建一个粒子列表.
创建一个网格列表.
对于网格列表中的每个网格点:
对于粒子列表中的每个粒子:
如果粒子A在网格点n(xn,yn)的影响区域内:
粒子A,其速度=网格点n处的速度.
在Pygame中可视化所有内容.
这种基本方式是我能想到在Pygame中可视化流程的唯一方法.模拟效果很好,但如果我增加网格点的数量(增加流场的精度),性能会下降.我的问题是,如果有一个更有效的方法来做这个只是使用pygame和numpy?
我在这里附上了代码:
import pygame,random,sys,numpy
from Flow import Compute
from pygame.locals import *
import random, math, sys
#from PIL import Image
pygame.init()
Surface = pygame.display.set_mode((1000,600))
#read the airfoil geometry from a dat file
with open ('./resources/naca0012.dat') as file_name:
x, y = numpy.loadtxt(file_name, dtype=float, delimiter='\t', unpack=True)
#parameters used to describe the flow
Nx=30# 30 column grid
Ny=10#10 row grid
N=20#number of panels
alpha=0#angle of attack
u_inf=1#freestream velocity
#compute the flow field …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在Unity中实现浅水方程,但我遇到了一个奇怪的错误.我在水中得到了这些奇怪的摆动涟漪.我做了一些截图:

您可以在此处找到视频:https://www.youtube.com/watch?v = crXLrvETdjA
我的代码基于Xing Mei的GPU快速水力侵蚀模拟和可视化.你可以在这里找到整个解算器代码:http://pastebin.com/JktpizHW(或见下文.)每次我使用论文中的公式时,我都会将其编号添加为注释.
我尝试了不同的时间步,对于我使用0.02的视频,降低它只是让它振荡得更慢.我也尝试了一个更大的网格(视频使用100,我尝试了200但是涟漪只是更小.)我检查了所有公式几次,并且找不到任何错误.
这里的任何人都可以弄清楚出了什么问题?
额外信息:
从pastebin中可以看出,我用c#编写了它.我使用Unity作为我的可视化引擎,我只是使用网格网来显示水.我改变网格的顶点y分量以匹配我计算的高度.
DoUpdate方法获取一个float[][] lowerLayersHeight参数,该参数基本上是水下地形的高度.在视频中它就是全部0.
public override void DoUpdate(float dt, float dx, float[][] lowerLayersHeight) {
int x, y;
float totalHeight, dhL, dhR, dhT, dhB;
float dt_A_g_l = dt * _A * g / dx; //all constants for equation 2
float K; // scaling factor for the out?ow ?ux
float dV;
for (x=1 ; x <= N ; x++ ) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Unity 的计算着色器中复制我的工作 2d 流体着色器玩具,希望尽快将其移至 3D。当我以同样的方式复制算法时,我得到了一些非常奇怪的行为(在我拍摄的这个视频中看到)。我试图调试我能想到的一切,但我不明白为什么它们不一样。我正在可视化此捕获中的矢量矩阵(与查看我的着色玩具时按 Space 相同)。
我用我用来执行驱动速度矩阵的 Navier-Stokes 方程的代码创建了一个pastebin。模拟的核心归结为:
float4 S(RWTexture2D<float4> target, uint2 id)
{
return target[(id.xy + resolution)%resolution];
}
void Fluid(RWTexture2D<float4> target, uint2 id, float2 offset, float4 values, inout float2 velocity, inout float pressure, inout float divergence, inout float neighbors)
{
float2 v = S(target, id.xy + offset);
float4 s = S(target, id.xy + offset.xy - v);
float2 o= normalize(offset);
velocity += o * (s.w …Run Code Online (Sandbox Code Playgroud) 我想知道有效存储(以及随后访问)具有可变长度的多维数据数组的最佳实践.重点是性能,但我还需要能够在运行时更改单个数据集的长度,而不会产生太多开销.
注意:我知道这是一个有点冗长的问题,但是我已经看了很多,并且找不到解决方案或示例来描述手头的问题并且具有足够的准确性.
背景
上下文是基于不连续Galerkin谱元素方法(DGSEM)的计算流体动力学(CFD)代码(参见Kopriva(2009),Workinging Spectral Methods for Partial Differential Equations).为简单起见,让我们假设一个2D数据布局(实际上它是三维的,但从2D到3D的扩展应该是直截了当的).
我有一个由K方形元素k(k = 0,...,K-1)组成的网格,可以是不同的(物理)大小.在每个网格元素(或"单元格")中k,我有N_k^2数据点.N_k是每个维度中的数据点的数量,并且可以在不同的网格单元之间变化.
在每个数据点n_k,i(其中i = 0,...,N_k^2-1)我必须存储一个解决方案值数组,它nVars在整个域中(即在任何地方)具有相同的长度,并且在运行时期间不会更改.
尺寸和变化
栅格单元的数量K是O(10^5)对O(10^6)与能够在运行期间改变.
数据点的数量N_k在每个网格单元之间2并8与可以在运行时期间改变(并且可以是用于每个小区不同的).
变量的数目nVars存储在每个网格点是左右5到10并不能在运行时期间改变(它也是对于每个网格单元是相同的).
要求
性能是这里的关键问题.我需要能够以有效的方式在所有单元的所有网格点上以有序的方式定期迭代(即,没有太多的高速缓存未命中).通常,K并且N_k在模拟期间不经常改变,因此例如可以选择用于所有单元和数据点的大的连续存储器块.
但是,我确实需要能够在运行时精炼或粗化网格(即删除单元格并创建新单元格,新的单元格可以附加到结尾).我还需要能够更改近似顺序N_k,因此我为每个单元格存储的数据点数量也可以在运行时更改.
结论
任何输入都表示赞赏.如果您有自己的经验,或者只是了解一些我可以看到的好资源,请告诉我.然而,虽然解决方案对最终程序的性能至关重要,但它只是众多问题中的一个,因此解决方案需要具有应用性,而不是纯粹的学术性.
如果这是一个提出这个问题的错误场所,请告诉我一个更合适的地方.
我正在寻找一种算法来描述流体在高度图表面上的瞬态行为.我在t = 0时的起始条件是:
我想要的是一种算法,可以在t'= t + 1处计算流体高度矩阵F的新值.在任何时候,我都可以通过v = a*(F(x,y) - H(x,y))来计算给定点处的流体体积.该算法的理想属性是:
我正在寻找的一个简单例子是:
该算法将描述在几个时间步长上在5×5矩阵上展开的流体"列".最终算法将在所有位置以10/25的均匀高度稳定下来,但我真的对它们之间发生的事情感兴趣.
我试图搜索这种算法,但我能找到的只是描述流体中颗粒行为的方程式,这对于我的目的而言太过细化.有谁知道我可以参考这个问题的任何好的来源,或者可能满足我需要的现有算法.
fluid-dynamics ×10
c++ ×3
simulation ×3
algorithm ×2
javascript ×2
c# ×1
caching ×1
canvas ×1
game-physics ×1
hpc ×1
html5 ×1
modeling ×1
numpy ×1
performance ×1
physics ×1
pygame ×1
python ×1
sdl ×1
shader ×1