tulpaMesh takes point coordinates and returns a triangulated mesh with FEM matrices ready for SPDE models.
set.seed(42)
coords <- cbind(x = runif(100), y = runif(100))
mesh <- tulpa_mesh(coords)
mesh
#> tulpa_mesh:
#> Vertices: 138
#> Triangles: 236
#> Edges: 373
#> ( 100 input + 38 generated)The mesh extends slightly beyond the convex hull of your points
(controlled by extend). Plot it:
Use max_edge to add refinement points. The mesh
generator places a hexagonal lattice of points at this spacing,
producing near-equilateral triangles.
mesh_fine <- tulpa_mesh(coords, max_edge = 0.08)
mesh_fine
#> tulpa_mesh:
#> Vertices: 336
#> Triangles: 595
#> Edges: 930
#> ( 100 input + 236 generated)
plot(mesh_fine, main = "Refined mesh (max_edge = 0.08)")fem_matrices() returns the three sparse matrices needed
for SPDE models:
C: mass matrix (consistent, symmetric positive definite)
G: stiffness matrix (symmetric, zero row sums)
A: projection matrix mapping mesh vertices to observation locations
fem <- fem_matrices(mesh_fine, obs_coords = coords)
dim(fem$C)
#> [1] 336 336
dim(fem$A)
#> [1] 100 336
# Verify key properties
all(Matrix::diag(fem$C) > 0) # positive diagonal
#> [1] TRUE
max(abs(Matrix::rowSums(fem$G))) # row sums ~ 0
#> [1] 7.882583e-15
range(Matrix::rowSums(fem$A)) # row sums = 1
#> [1] 1 1For the SPDE Q-builder, you typically need the lumped (diagonal) mass matrix:
If your coordinates live in a data.frame, use a formula:
Check triangle quality with mesh_quality() and
mesh_summary():
mesh_summary(mesh_fine)
#> Mesh quality summary:
#> Triangles: 595
#> Min angle: 1.4 / 40.2 / 60.0 (min / median / max)
#> Max angle: 60.0 / 80.1 / 149.5
#> Aspect ratio: 1.00 / 1.52 / 40.75
#> Area: 0.0000 / 0.0023 / 0.0090
#> WARNING: 16 triangles with min angle < 10 degrees
#> WARNING: 8 triangles with min angle < 5 degrees (slivers)Color triangles by minimum angle:
For guaranteed minimum angles, use min_angle:
Spatial Workflows – boundary constraints, barrier models, sf integration
Spherical and Temporal Meshes – global meshes, space-time, metric graphs