ITADN
KeitaNakamura/Tesserae.jl
KeitaNakamura/Tesserae.jl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Tesserae.jl Logo
Tesserae.jl

用于物质点法的 Julia 工具包

Tesserae.jl 是一个用于在 Julia 中实现物质点法的工具包。它旨在保持数学表达式与源代码之间的一致性,从而实现快速开发。当前功能包括:

  • 网格和粒子生成
  • 各种基函数,包括 B-splines、GIMP、CPDI 和 MLS-MPM
  • 用于在网格和粒子之间传输数据的便捷宏
  • 多线程支持
  • GPU 支持(CUDA 和 Metal)
  • 导出 VTK 文件用于可视化
  • FEM 和 IGA 的统一框架(IGA 支持为实验性)

Image Image Image Image

为什么选择 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()

文档

Stable

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},
}