SPH法一维实例:启发

左志华(在读硕士) [email protected]
@深圳市罗湖区 2021.1.12
ThinkPad S2 2018 Windows10 Home
关键词:SPH法;一维;启发;B样条核函数;Octave 6.1

1. 背景

在5月31号,我的“傻弟弟”室友不太会编程,有一道SPH习题不会做,当时我给他写了一份Matlab代码。
如今正式自己学SPH时发现,网上这方面的基础资料还是挺匮乏的,所以找到了这份代码,希望对初学者有启发效果。

2. 题目

拉格朗日型无网格粒子法在描述结构毁伤行为时具有先天的优势。假定单位长度细长梁结构如下图所示,梁的截面内被离散为单个粒子,在初始状态下梁内变量,请选用三次样条核函数,光滑长度,通过SPH方法中的粒子近似原理编程求解每个粒子处的变量值。

(1)粒子分辨率和情况;

参考答案:(1)对于函数的粒子近似存在以下表达形式:

三次样条函数为:

其中,。

①粒子分辨率为情况:

支持域半径为,粒子从左到右编号分别为1~6:

粒子1:与其相互作用的粒子编号:1,2,3

因此

粒子2:与其相互作用的粒子编号:1,2,3,4

因此

粒子3:与其相互作用的粒子编号:1,2,3,4,5

因此

粒子分辨率为\Delta x=0.2情况

3. 代码

% func B-Spline_w 是B-样条函数(光滑核函数). 
function w = B_Spline_w(r,h)
    r = abs(r);
    alpha = 1/h;
    q = r/h;
    if q>=0 & q<1
        w = alpha*(2/3-q^2+0.5*q^3);
    elseif q>=1 & q<2
        w = alpha*(1/6*(2-q)^3);
    elseif q>=2
        w = 0;
    else
        fprintf("q = %d 是否小于了0; 请检查! ",q);
    end
end
% func partcleApproximation 粒子近似值函数. 
function f = particleApproximation_f(i,tol,h,dx)
    A1 = 1; A2 = 1; A3 = 1; A4 = 1;
    if i == 1
        A1 = 0; A2 = 0;
    elseif i == 2
        A1 = 0;
    elseif i == tol
        A3 = 0; A4 = 0;
    elseif i == tol-1
        A4 = 0;
    else
        % 此处不执行任何语句.
    end
    f = A1*dx*(i-3)*B_Spline_w(2*dx,h)*dx+A2*dx*(i-2)*B_Spline_w(dx,h)*dx+...
        dx*(i-1)*B_Spline_w(0,h)*dx+A3*dx*i*B_Spline_w(-dx,h)*dx+...
        A4*dx*(i+1)*B_Spline_w(-2*dx,h)*dx;
end
% SPH(Smoothed Particle Hydrodynamics)法 是光滑粒子流体动力学方法的缩写.
% 描述:
% 一维无网格实例
%
% 方法:
% B样条核函数
% 
% 代码所有者:
% 左志华[zoziha] [email protected]
%
% 版本   日期     注释
% ---- -------- -------
% V1.0 2020-6-1 原始版本 左志华
%
% 软件标准:Octave 6.1
%
close all; % 关闭所有图像.
% float dx 是粒子分辨率; 下语句 并且赋值 dx=0.2. [2020-6-1 wrote; 可修改 dx 值]
dx  = 0.2;
% float tol 是粒子总数. [2020-6-1 wrote; 可修改 tol 值]
tol = 6;
% float h 是光滑长度. 
h   = 1.3*dx;
% float r 是域半径. 
r   = 2*h;
% 下语句 在屏幕打印出 f
for i = 1:tol
    f(i) = particleApproximation_f(i,tol,h,dx);
end
disp(f);
plot(f,"rp");
grid on;
运行结果

运行图像

4. 解析

可以发现SPH法在边界处的精度不高,在求解域内精度较高。
如果要开发一个核心的SPH计算程序,则需要包含三个模块:

  1. 核函数模块;
  2. 粒子近似模块;
  3. 实例求解模块。
    如果需要配合核心的SPH计算程序,还需要:
  4. 建模的前处理模块;
  5. 数据的可视化模块。
    (挖坑一个,有空整理和修改。)

5. 思考

网上有挺多的SPH法的代码,还有基于分子动力学的MPS法代码和程序,如LAMMPS。要我这数学基础弱的工科人来用别人的代码,看懂都费劲;自己编写也不现实,需要花费很多时间和精力,而且有可能失败。难熬~

  1. 现有的常用的建模工具都是基于有限元的,少有粒子建模;
  2. 我估计还得学一个粒子可视化软件。
  3. SPHysics是有Fortran代码的,我可以参考,我学Fortran的;
  4. SPHysics依靠的建模与可视化工具是Blender软件;
  5. LAMMPS偏分子学科,完成度很高,基于C++,我不太想多学这么多语言;
  6. LAMMPS文档挺多,资料也全,但是我一个学船的挺难看进去分子层面的编程的;
  7. 自己编程一般几年时间内能编写和维护的代码量仅为5千~5万的中小型程序,还存在不确定性;
  8. 我现在正在请教师兄,看看能给我点意见不。之后找找老师。希望能给我指条明路。
    前路漫漫,上下求索~

你可能感兴趣的:(SPH法一维实例:启发)