• 大小: 3.38MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-10
  • 语言: 其他
  • 标签: SPH代码  

资源简介

干货!这是本人基于光滑粒子流体动力学做的一个杯中水的模拟,比较成功!两年的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

评论

共有 条评论