Grid and particle generation
Tesserae.generate_grid
— Functiongenerate_grid(GridProp, mesh)
Generate a background grid where each element is of type GridProp
. The first field of GridProp
is designated for mesh
, and thus its type must match eltype(mesh)
. The resulting grid is a StructArray
.
Examples
julia> struct GridProp{dim, T}
x :: Vec{dim, T}
m :: Float64
mv :: Vec{dim, T}
f :: Vec{dim, T}
v :: Vec{dim, T}
vⁿ :: Vec{dim, T}
end
julia> grid = generate_grid(GridProp{2, Float64}, CartesianMesh(0.5, (0,3), (0,2)));
julia> grid[1]
GridProp{2, Float64}([0.0, 0.0], 0.0, [0.0, 0.0], [0.0, 0.0], [0.0, 0.0], [0.0, 0.0])
julia> grid.x
7×5 CartesianMesh{2, Float64, Vector{Float64}}:
[0.0, 0.0] [0.0, 0.5] [0.0, 1.0] [0.0, 1.5] [0.0, 2.0]
[0.5, 0.0] [0.5, 0.5] [0.5, 1.0] [0.5, 1.5] [0.5, 2.0]
[1.0, 0.0] [1.0, 0.5] [1.0, 1.0] [1.0, 1.5] [1.0, 2.0]
[1.5, 0.0] [1.5, 0.5] [1.5, 1.0] [1.5, 1.5] [1.5, 2.0]
[2.0, 0.0] [2.0, 0.5] [2.0, 1.0] [2.0, 1.5] [2.0, 2.0]
[2.5, 0.0] [2.5, 0.5] [2.5, 1.0] [2.5, 1.5] [2.5, 2.0]
[3.0, 0.0] [3.0, 0.5] [3.0, 1.0] [3.0, 1.5] [3.0, 2.0]
julia> grid.v
7×5 Matrix{Vec{2, Float64}}:
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
[0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0] [0.0, 0.0]
Tesserae.generate_particles
— Functiongenerate_particles([ParticleProp], mesh; alg=PoissonDiskSampling())
Generate particles across the entire mesh
domain based on the selected alg
algorithm. See also GridSampling
and PoissonDiskSampling
.
The generated particles
is a StructArray
where each element is of type ParticleProp
. The first field of ParticleProp
is designated for particle positions.
julia> ParticleProp = @NamedTuple begin
x :: Vec{2, Float64}
m :: Float64
V :: Float64
v :: Vec{2, Float64}
F :: SecondOrderTensor{2, Float64, 4}
σ :: SymmetricSecondOrderTensor{2, Float64, 3}
end
@NamedTuple{x::Vec{2, Float64}, m::Float64, V::Float64, v::Vec{2, Float64}, F::Tensor{Tuple{2, 2}, Float64, 2, 4}, σ::SymmetricSecondOrderTensor{2, Float64, 3}}
julia> mesh = CartesianMesh(0.5, (0,3), (0,2));
julia> particles = generate_particles(ParticleProp, mesh; alg=GridSampling());
julia> particles.F[1] = one(eltype(particles.F));
julia> particles[1]
(x = [0.125, 0.125], m = 0.0, V = 0.0, v = [0.0, 0.0], F = [1.0 0.0; 0.0 1.0], σ = [0.0 0.0; 0.0 0.0])
julia> particles.F
96-element Vector{Tensor{Tuple{2, 2}, Float64, 2, 4}}:
[1.0 0.0; 0.0 1.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
⋮
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
[0.0 0.0; 0.0 0.0]
Tesserae.GridSampling
— TypeGridSampling(spacing = 1/2)
The generated particles are aligned with the grid using uniform spacing. Setting spacing = 1/η
will produce η^dim
particles per cell, where dim
is the problem dimension.
Tesserae.PoissonDiskSampling
— TypePoissonDiskSampling(spacing = 1/2, rng = Random.default_rng())
The particles are generated based on the Poisson disk sampling. The spacing
parameter is used to produce a similar number of particles as are generated with GridSampling
.