Data access
The catalog is distributed as a single static file. To use it programmatically:
import json, urllib.request
url = 'atlas.json' # or full URL once hosted publicly
with urllib.request.urlopen(url) as f:
atlas = json.load(f)
print(f"{atlas['metadata']['n_grounds']} grounds in version "
f"{atlas['metadata'].get('version', 'unknown')}")
# Each ground is a dict with mechanical + dynamical + humidity fields
for g in atlas['grounds']:
nu_min = g['beam']['nu_min'][1] # AR=10 default
eta_pore = g['humidity']['eta_pore']
if nu_min < -2 and eta_pore < -0.3:
print(g['family'], g['name'], nu_min, eta_pore)
For users who prefer a flat tabular form, a companion
atlas_features.csv with
one row per ground is provided alongside the JSON.
See the data dictionary below for field meanings and units.
Data dictionary
Every field in atlas.json. All quantities are dimensionless
except where noted.
Metadata (atlas['metadata'])
| Field | Type | Meaning |
|---|---|---|
n_grounds | int | Number of grounds in the catalog |
build_date | str | ISO date the atlas was built |
version | str | Catalog version (semantic versioning) |
spring_k_ang_grid | list[float] | Angular-stiffness sweep values for spring model |
spring_default_idx | int | Index into spring_k_ang_grid for the default value (0.01) |
beam_AR_grid | list[float] | Strut aspect-ratio sweep values for beam model |
beam_default_idx | int | Index into beam_AR_grid for the default (AR=10) |
theta_grid_deg | list[float] | Angles (degrees) used for the directional ν(θ) sweep |
attribution | str | Source-catalog citation string |
Per-ground top-level fields (atlas['grounds'][i])
| Field | Type | Meaning |
|---|---|---|
family | str | Hole-shape profile (e.g. 3_6, 4, cloth) |
name | str | Per-family identifier (e.g. 2x4_86) |
n_rows, n_cols | int | Period parallelogram dimensions |
n_vertices, n_edges | int | Vertex / edge count in the unit cell |
cell_area | float | Unit-cell area in lattice units |
vertices | list[[col,row]] | Vertex coordinates in lattice units |
edges | list[dict] | Edge list: {src, dst, wrap: [dx,dy]} |
lattice | list[[x,y]] | 2×2 cartesian lattice basis vectors |
thumbnails | dict | Paths to lace, thread, deformed, dispersion PNG previews |
graph_canonical | str | SHA-256 hex hash of the wrap-labeled quotient graph's nauty certificate. Two grounds with the same value share an abstract topology (same combinatorial graph, possibly different geometric embedding). |
lace_canonical | str | SHA-256 hex hash combining graph topology and embedding geometry. Two grounds with the same value are physically identical lattices. Every ground in the current catalog has a unique value. |
Manufacturability (g['manufacturability'])
Per-ground boolean predicates classifying the lattice's physical
realizability. Each property is one of: true, false,
or null (= "not yet checked").
| Field | Type | Meaning |
|---|---|---|
is_2in2out | bool | Admits a directed orientation where every vertex has exactly 2 incoming and 2 outgoing edges. Required for bobbin-lace thread-circuit interpretation. |
is_planar | bool | null | Embedded planar (no rod crossings) at the canonical vertex positions. null if not yet checked. |
is_printable | bool | null | 3D-printable: planar, connected, no degenerate vertices, no overlapping rods. null if not yet checked. |
is_lace_workable | bool | null | Admits a valid bobbin-lace thread circuit decomposition with all circuits having wrap (1, 0). null if not yet checked. |
For grounds in Irvine's TesseLace catalog, all four properties are
known to be true by construction. Grounds added by the
enumerator have these properties computed individually.
Provenance (g['provenance'])
Where the ground came from.
| Field | Type | Meaning |
|---|---|---|
source | str | Origin: "irvine" for grounds from Irvine's TesseLace catalog; "enumerated_NxM" for grounds discovered by the enumerator at cell size N×M; or other strings for future sources. |
irvine_label | str | null | Original family/name in Irvine's catalog (e.g. "3_6/2x4_86") for cross-reference. null for non-Irvine grounds. |
enumerator_run | str | null | Identifier of the enumerator run that produced this ground. null for non-enumerated grounds. |
Mechanics: spring model (g['spring'])
The spring model (also referred to as the pin-jointed truss
model, or central-force lattice model) treats each strut as an axial
Hookean spring with stiffness k = 1 per unit length and
frictionless pin joints at every vertex. To this base model we add a
small angular regularization term kang
at each vertex that penalizes changes in the angle between rods
meeting there:
Uangular = (kang / 2) Σ (θij − θij(0))2
The angular term lifts mechanism-mode eigenvalues away from zero so
the stiffness matrix is invertible. Mechanism modes are kinematic
deformations that change vertex positions without stretching any rod
— they are central to auxetic behavior in this catalog. We sweep
kang over spring_k_ang_grid
(with axial stiffness fixed at 1) to characterize the sensitivity of
the elastic response to this regularization. The default reported value
is kang = 0.01, where angular stiffness is 1%
of axial: mechanism modes remain soft but the calculation is
well-conditioned.
The spring model is distinct from the beam model below:
spring uses pin joints with adjustable angular regularization, beam
uses rigid Euler-Bernoulli joints with bending stiffness set by the
strut aspect ratio. Each field below is a list, one entry per value
in spring_k_ang_grid.
| Field | Type | Meaning |
|---|---|---|
k_ang | list[float] | Angular regularization values (matches spring_k_ang_grid) |
C_voigt | list[3×3] | Effective elastic stiffness in Voigt form |
nu_profile | list[list[float]] | ν(θ) sampled on theta_grid_deg |
nu_min, nu_max | list[float] | Minimum / maximum Poisson ratio over loading direction |
classification | list[str] | One of: homogeneously_auxetic, directionally_auxetic, non_auxetic |
Mechanics: beam model (g['beam'])
Same shape as the spring model but indexed by strut aspect ratio.
| Field | Type | Meaning |
|---|---|---|
AR | list[float] | Aspect ratios (matches beam_AR_grid) |
C_voigt, nu_profile, nu_min, nu_max, classification | (as above) | Per-AR analogues of the spring fields |
Phonon dispersion (g['phonon'])
Spring-model phonon dispersion (kang = 0.01) sampled on a Brillouin-zone path. 22 scalar descriptors summarize the dispersion.
| Field | Type | Meaning |
|---|---|---|
acoustic_min | float | Lowest non-zero acoustic-branch frequency |
acoustic_max | float | Highest acoustic-branch frequency |
v_long, v_trans | float | Long-wavelength longitudinal / transverse sound speed |
v_anisotropy | float | Sound-speed anisotropy: max(v)/min(v) over BZ directions |
flat_acoustic_score | float | 0–1 measure of how flat the acoustic branch is (1 = mechanism) |
soft_mode_count | int | Number of branches with frequency below threshold |
| (15 more) | various | Additional moments and gap descriptors. See src/auxetic_lace/phonons.py |
Humidity / swelling response (g['humidity'])
Macroscopic strain ε per unit perpendicular swelling δ on each strut (fiber-grain model: water swells perpendicular to strut axis, not along it).
| Field | Type | Meaning |
|---|---|---|
eta_xx, eta_yy, eta_xy | float | Strain components under isotropic perpendicular swelling, in the cell frame |
eta_xx_x, eta_yy_x, eta_xy_x | float | Same, but only x-aligned struts swell (probes anisotropic chemistry) |
eta_aniso | float | ηxx − ηyy (cell-frame directional response) |
eta_max, eta_min | float | Principal strains (frame-invariant) |
eta_anisotropy_ratio | float | |ηmax/ηmin|, frame-invariant directionality |
eta_pore | float | Fractional pore-area change per unit δ. Negative = pores close when wet. |