资源简介
干货!这是本人基于光滑粒子流体动力学做的一个杯中水的模拟,比较成功!两年的sph学习不容易,今天特意拿出来与你们分享——sph方法的编程核心技巧!
代码片段和文件信息
#include
#include
#include
#include
#include “cpu_sph.h“
//#define RADIUS 0.03f
#define EPSILON 0.00001f
const float PI = 3.1415926535f;
#define POS(i) sph->pos[i]
#define VEL(i) sph->vel[i]
#define ACC(i) sph->acc[i]
#define VELH(i) sph->vel_half[i]
void cpu_sph_create(cpu_sph* sph //创建SPH流体
int size const vector3* pos const vector3* vel
float smoothlen float viscosity float mass float stiff float r_search int n_loops)
{
int i;
float h = smoothlen;
float* mem;
sph->viscosity = viscosity;
sph->n_particles = size;
sph->smoothlen = smoothlen;
sph->n_loops = n_loops;
sph->stiff = stiff;
sph_neighbour_list_create(&sph->n_list size);//为SPH的list分配空间,与sph的size同大小
sph_grid_create(&sph->grid sph->n_particles h);//为网格分配空间
sph->grid.grid_len = r_search;
sph->r_search = r_search;
// Allocate memory for attributes of particles
mem = (float*)malloc(49*size*sizeof(float));
sph->mass = (float*)&mem[0];
sph->density = (float*)&mem[size];
sph->pressure = (float*)&mem[2*size];
sph->pos = (vector3*)&mem[3*size];
sph->vel = (vector3*)&mem[6*size];
sph->vel_half = (vector3*)&mem[9*size];
sph->acc = (vector3*)&mem[12*size];
sph->normal = (vector3*)&mem[15*size];
sph->curvature = (float*)&mem[18*size];
sph->fluid_start = 0;
sph->n_fluidp = size - sph->fluid_start;
for (i = sph->fluid_start; i < sph->fluid_start + sph->n_fluidp; i++)
{
sph->mass[i] = mass;
}
memcpy(sph->pos pos sph->n_particles*sizeof(vector3));
memcpy(sph->vel vel sph->n_particles*sizeof(vector3));
memcpy(sph->vel_half vel sph->n_particles*sizeof(vector3));
// Precompute kernel coefficients
sph->poly6_coef = 315.0f/(64.0f*PI*(float)pow(h 9));
sph->grad_poly6_coef = 945.0f/(32.0f*PI*(float)pow(h 9));
sph->lap_poly6_coef = 945.0f/(32.0f*PI*(float)pow(h 9));
sph->grad_spiky_coef = -45.0f/(PI*h*h*h*h*h*h);
sph->lap_vis_coef = 45.0f/(PI*h*h*h*h*h*h);
/**** FOR TEST ****/
mat4_set_identity(&sph->mat_col);//把参数内容置0
sph_grid_clear(&sph->grid sph->pos 0 sph->n_particles - 1);
}
void cpu_sph_transform_obstacles(cpu_sph* sph const matrix4* m)//根据障碍物信息,更新粒子的位置
{
mat4_mul(&sph->mat_col m &sph->mat_col);
mat4_invert(&sph->mat_inv_col &sph->mat_col);
}
void cpu_sph_compute_density(cpu_sph* sph bool first)//计算密度,被模拟函数调用
{
int i;
int j;
int nindex;
sph_neighbour_list* nlist;
memset(sph->density 0 sph->n_particles*sizeof(float));
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-08-01 09:46 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\
目录 0 2018-08-01 09:46 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\
目录 0 2018-08-01 09:46 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\
文件 6088 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\BuildLog.htm
文件 145 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\SPH.exe.intermediate.manifest
文件 14302 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\cpu_sph.obj
文件 21430 2011-05-12 16:49 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\glg.obj
文件 13231 2011-05-25 16:47 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\main.obj
文件 67 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\mt.dep
文件 6094 2011-05-25 16:48 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\sph_common.obj
文件 224256 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\Debug\vc80.idb
文件 3489 2011-05-24 09:23 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\SPH.vcproj
文件 1409 2011-05-07 18:01 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\SPH.vcproj.412-PC.412.user
文件 1427 2010-09-02 19:35 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\SPH.vcproj.51F8FAE1C2F0405.Administrator.user
文件 1427 2011-05-27 21:14 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\SPH.vcproj.WWW-531B1916A99.Administrator.user
文件 11059 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\cpu_sph.cpp
文件 2008 2010-09-02 19:18 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\cpu_sph.h
文件 28791 2010-09-02 19:18 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\glg.cpp
文件 10001 2010-09-02 19:30 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\glg.h
文件 6060 2011-05-25 16:47 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\main.cpp
文件 6826 2011-05-25 16:48 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\sph_common.cpp
文件 1632 2010-09-02 19:21 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH\sph_common.h
文件 12233728 2011-05-27 21:14 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH.ncb
文件 874 2010-09-02 19:25 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH.sln
文件 22016 2011-05-27 21:14 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\SPH.suo
目录 0 2018-08-01 09:46 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\debug\
文件 94208 2011-05-26 10:44 基于物理的动力学流体模拟方法,即SPH方法杯中水的模拟\debug\SPH.exe
- 上一篇:Dspace使用入门
- 下一篇:opencv车牌识别系统可直接运行
评论
共有 条评论