MyNixOS website logo
Description

Constrained Delaunay Triangulation Meshes for Spatial 'SPDE' Models.

Generate constrained Delaunay triangulation meshes for use with stochastic partial differential equation (SPDE) spatial models (Lindgren, Rue and Lindstroem 2011 <doi:10.1111/j.1467-9868.2011.00777.x>). Provides automatic mesh generation from point coordinates with boundary constraints, Ruppert refinement for mesh quality, finite element method (FEM) matrix assembly (mass, stiffness, projection), barrier models, spherical meshes via icosahedral subdivision, and metric graph meshes for network geometries. Built on the 'CDT' header-only C++ library (Amirkhanov 2024 <https://github.com/artem-ogre/CDT>). Designed as the mesh backend for the 'tulpa' Bayesian hierarchical modelling engine but usable standalone for any spatial triangulation task.

tulpaMesh

a mesh from scattered points

R-CMD-check Codecov test coverage License: MIT

Spatial meshes and finite-element matrices for SPDE models, built on a constrained Delaunay triangulation in C++.

Hand it a point cloud. tulpaMesh triangulates it, refines the triangles to a guaranteed minimum angle (Ruppert), and assembles the mass, stiffness, and projection matrices the SPDE approach (Lindgren, Rue & Lindstrom 2011) needs. The triangulation runs on the CDT header-only library with exact geometric predicates; the FEM assembly has no dependency beyond Rcpp and Matrix. It is the mesh backend for the tulpa Bayesian engine and runs standalone for any spatial triangulation task.

library(tulpaMesh)

coords <- cbind(runif(200), runif(200))
mesh   <- tulpa_mesh(coords, max_edge = 0.1)
fem    <- fem_matrices(mesh, obs_coords = coords)
# fem$C (mass), fem$G (stiffness), fem$A (projection), ready for SPDE

Drop-in for fmesher

If you already build SPDE meshes with fmesher, convert an existing mesh and get the same C, G, and A matrices:

library(fmesher)
fm  <- fm_mesh_2d(loc = coords, max.edge = c(0.3, 0.6))
tm  <- as_tulpa_mesh(fm)        # direct conversion
fem <- fem_matrices(tm)         # same C, G, A

Mesh generation

  • tulpa_mesh(): constrained Delaunay from points, a ~ x + y formula, or an sf boundary (POLYGON, MULTIPOLYGON, holes). Ruppert refinement via min_angle and max_area; hexagonal-lattice density via max_edge.
  • tulpa_mesh_sphere(): icosahedral geodesic meshes with 3D surface FEM, for global-scale models.
  • tulpa_mesh_1d(): temporal meshes with tridiagonal FEM, for space-time SPDE.
  • tulpa_mesh_graph(): metric-graph meshes for river and road networks.

FEM assembly

fem_matrices() returns the mass (C), stiffness (G), and projection (A) sparse matrices. The options cover the cases SPDE work runs into:

  • lumped = TRUE: diagonal mass matrix for the SPDE Q-builder.
  • parallel = TRUE: multithreaded assembly via RcppParallel/TBB.
  • barrier = ...: barrier models (Bakka et al. 2019), where the field cannot cross a region such as a coastline.
  • fem_matrices_p2(): quadratic (P2) elements on 6-node triangles for higher accuracy.
  • fem_matrices_nonstationary(): spatially varying range and variance.

Barrier model on a coastline

library(sf)

barrier <- st_polygon(list(rbind(c(3,3), c(7,3), c(7,7), c(3,7), c(3,3))))
bt      <- barrier_triangles(mesh, st_sfc(barrier))
fem     <- fem_matrices(mesh, barrier = bt)
# fem$G carries zero stiffness across the barrier triangles

Quality, diagnostics, and mesh operations

  • mesh_quality() / mesh_summary(): per-triangle angles, aspect ratio, area, and their min/median/max.
  • plot(): mesh visualization, with color = "quality" to shade by minimum angle.
  • subdivide_mesh(), subset_mesh(), mesh_components(): 1-to-4 subdivision, submesh extraction, connected-component finding.
  • refine_mesh(): adaptive refinement from per-triangle error indicators.
  • barrier_triangles(), mesh_crs(), set_crs(): barrier identification and CRS handling.

Installation

install.packages("tulpaMesh")            # CRAN

install.packages("pak")                  # development version
pak::pak("gcol33/tulpaMesh")

Documentation

Support

"Software is like sex: it's better when it's free." — Linus Torvalds

I'm a PhD student who builds R packages in my free time because I believe good tools should be free and open. I started these projects for my own work and figured others might find them useful too.

If this package saved you some time, buying me a coffee is a nice way to say thanks. It helps with my coffee addiction.

Buy Me A Coffee

License

MIT (see the LICENSE.md file)

Citation

@software{tulpaMesh,
  author = {Colling, Gilles},
  title = {tulpaMesh: Constrained Delaunay Triangulation Meshes for Spatial SPDE Models},
  year = {2026},
  url = {https://CRAN.R-project.org/package=tulpaMesh},
  doi = {10.32614/CRAN.package.tulpaMesh}
}
Metadata

Version

0.1.3

License

Unknown

Platforms (79)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    uefi
    wasip1
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-uefi
  • aarch64-windows
  • aarch64_be-none
  • arc-linux
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-linux
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • sh4-linux
  • vc4-none
  • wasm32-wasip1
  • wasm64-wasip1
  • x86_64-cygwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-uefi
  • x86_64-windows