KeitaNakamura/Tesserae.jl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
Tesserae.jl
Tesserae.jl 是一个用于在 Julia 中实现物质点法的工具包。它旨在保持数学表达式与源代码之间的一致性,从而实现快速开发。当前功能包括:
- 网格和粒子生成
- 各种基函数,包括 B-splines、GIMP、CPDI 和 MLS-MPM
- 用于在网格和粒子之间传输数据的便捷宏
- 多线程支持
- GPU 支持(CUDA 和 Metal)
- 导出 VTK 文件用于可视化
- FEM 和 IGA 的统一框架(IGA 支持为实验性)
为什么选择 Tesserae.jl?
Tesserae.jl 专为希望编写 MPM 仿真而不必与代码搏斗的人设计。你直接描述方程,Tesserae.jl 负责处理样板代码和性能细节。换句话说,它不是一个隐藏实现细节的参数驱动求解器——你自己编写数值过程。结果是透明的代码,直接源自你的推导,并且易于阅读。
数据模型极简——网格、粒子、权重——全部存储为普通数组,因此每个量都可见。张量保持为张量(不进行 Voigt 转换,使用 Tensorial.jl),这使得本构定律看起来就像其来源方程;切线可通过自动微分获得。诸如 @P2G 和 @G2P 之类的轻量级宏镜像了传输步骤的数学。Tesserae.jl 在笔记本电脑上高效运行,且只需极少改动即可在多核 CPU 和 GPU 上运行。如果你既想要清晰度又想要性能,Tesserae.jl 使其变得简单直接。
一个快速示例:两个软盘碰撞,动画保存为 GIF。
点击以展开
using Tesserae
import Plots
function main()
T = Float64; V2 = Vec{2,T}; M22 = Mat{2,2,T,4}
# Parameters
Δt = 1e-3; E = 500.0; ν = 0.3; ρ⁰ = 1e3
λ = (E*ν)/((1+ν)*(1-2ν)); μ = E/2(1+ν)
# Grid and particle generation
mesh = CartesianMesh(0.01, (0,1), (0,1))
grid = generate_grid(@NamedTuple{x::V2, m::T, v::V2, vⁿ::V2, mv::V2, f::V2}, mesh)
pcls = generate_particles(@NamedTuple{x::V2, V::T, v::V2, ∇v::M22, F::M22, σ::M22}, mesh)
# Particle initialization
V⁰ₚ = volume(mesh) / length(pcls); mₚ = ρ⁰ * V⁰ₚ; r = 0.2
filter!(p -> norm(p.x.-r)<r || norm(p.x.-(1-r))<r, pcls) # Set up two disks
@. pcls.V = V⁰ₚ; @. pcls.F = one(pcls.F)
map!(x -> ifelse(x[1]>0.5, -0.1, 0.1) * ones(V2), pcls.v, pcls.x) # Initial velocity
# Basis weights
wgts = generate_basis_weights(BSpline(Quadratic()), mesh, length(pcls))
# Simulation loop
Plots.@gif for t in 0:Δt:4
# Update basis weights
update!(wgts, pcls, mesh)
# Particle-to-grid transfer
@P2G grid=>i pcls=>p wgts=>ip begin
m[i] = @∑ w[ip] * mₚ
mv[i] = @∑ w[ip] * mₚ * v[p]
f[i] = @∑ -V[p] * σ[p] * ∇w[ip]
vⁿ[i] = mv[i] / m[i]
v[i] = vⁿ[i] + (f[i] / m[i]) * Δt
end
# Grid-to-particle transfer
@G2P grid=>i pcls=>p wgts=>ip begin
v[p] += @∑ w[ip] * (v[i] - vⁿ[i])
∇v[p] = @∑ v[i] ⊗ ∇w[ip]
x[p] += @∑ w[ip] * v[i] * Δt
F[p] = (I + ∇v[p]*Δt) * F[p]; Jₚ = det(F[p])
σ[p] = (μ*(F[p]*F[p]'-I) + λ*log(Jₚ)*I) / Jₚ # Neo-Hookean
V[p] = V⁰ₚ * Jₚ
end
# Visualization
Plots.scatter(
reinterpret(Tuple{T,T}, pcls.x), lims = (0,1),
aspect_ratio = 1, markersize = 0.4,
markerstrokecolor = :blue, legend = false,
)
end every 100
end
main()
文档
Julia 中的其他 MPM 软件包
灵感来源
部分功能受到以下软件包的启发:
引用
如果您认为 Tesserae.jl 对您的工作有帮助,恳请您按以下格式引用:
@software{NakamuraTesserae2024,
title = {Tesserae.jl: a {J}ulia toolkit for the material point method},
author = {Nakamura, Keita},
doi = {10.5281/zenodo.13956709},
year = {2024},
url = {https://github.com/KeitaNakamura/Tesserae.jl}
licence = {MIT},
}