Skip to content

SHOREStructured Hyperbolic Overlapping Remeshing Engine

Hyperbolic mesh generation for Chimera CFD β€” body-fitted near-body grids and parametric backgrounds, in one tool.

What is SHORE? ​

SHORE produces every structured grid a Chimera (overset) CFD assembly needs and packages them for the solver. Two product lines, one tool:

Body-fitted near-body meshes by hyperbolic normal extrusion of a body surface. Surface input is a triangulated STL today; CAD (STEP / IGES / BREP) is on the roadmap. Four CLI-selectable topologies (--topology cubed_sphere|ogrid|cgrid|ch); two further topologies (OHTopology, CGridTipCap) are available from the Python API:

bash
# 6-block cubed sphere (default) β€” no polar singularity, conforming seams
shore mesh fuselage.stl --ni 60 --nj 80 --nk 40 --ds 1e-4 --growth 1.15 -o fuselage -v

# Single-block O-grid β€” j-periodic, one .geo file
shore mesh fuselage.stl --topology ogrid --ni 60 --nj 80 --nk 40 -o fuselage

# 3-/4-block C-grid for airfoils (sharp / blunt TE auto-detected)
shore mesh airfoil.stl --topology cgrid \
    --ni-body 80 --ni-wake 20 --n-stations 5 --wake-length 15 \
    --nk 12 --ds 5e-4 --growth 1.08 -o airfoil

# 12-/14-block CH hybrid β€” C-grid wrap + far-field H-channel in one mesh
shore mesh airfoil.stl --topology ch \
    --ni-body 80 --ni-wake 20 --n-stations 5 --wake-length 15 --nk 12 \
    --ch-chord-min -2 --ch-chord-max 20 --ch-normal-min -2.5 --ch-normal-max 2.5 \
    --nk-channel 8 -o ch

Parametric backgrounds that fill the far field β€” no STL needed, just analytic geometry:

bash
# Cartesian box
shore primitive box --min -10 -10 -10 --max 10 10 50 --ni 30 --nj 30 --nk 60 -o background

# 5-block flat-caps cylinder (Chimera-fringe-free; central square + 4 trapezoidal sub-blocks)
shore primitive flat-caps --r-out 10 --z0 -10 --z1 50 --ni 16 --nc 24 --nk 60 -o background

Then assemble with the Xall pipeline:

bash
# Pack each component into binary .grd
shore grd wall_*.geo -o wall.grd
shore grd background_*.geo -o background.grd

# Generate the chimera descriptor with marker boxes for hole-cutting
shore boxes-from-stl fuselage.stl --block sub0 --max-outward-gap 0.10 -o boxes.json
shore cc-par wall.adjacency.json wall.cc.par --grd wall.grd --boxes boxes.json
shore cc-par background.adjacency.json background.cc.par --grd background.grd --free-bc -9

# Merge multi-component runs into a single Xall job
shore grd-merge    background.grd    wall.grd    -o assembly.grd
shore cc-par-merge background.cc.par wall.cc.par -o assembly.cc.par --grd assembly.grd

Hole cutting, fringe identification, and donor search are the solver's responsibility β€” SHORE produces every grid and every descriptor the solver needs, then steps out of the way.

Pipeline at a glance ​

Body-fitted (STL)                 Parametric backgrounds
  STL (raw triangles)               (no surface input)
        β”‚                                  β”‚
        β–Ό  shore mesh                      β–Ό  shore primitive
  cubed sphere (6 blocks)            box | annulus | flat-caps
  or O-grid (1 block)                (1 or 5 blocks)
        β”‚                                  β”‚
        β–Ό                                  β–Ό
  wall_*.geo                          background_*.geo
        β”‚                                  β”‚
        β–Ό  shore grd                       β–Ό  shore grd
  wall.grd                            background.grd
        β”‚                                  β”‚
        β–Ό  shore cc-par                    β–Ό  shore cc-par
  + shore boxes-from-stl              (no boxes for far-field)
  wall.cc.par                         background.cc.par
        β”‚                                  β”‚
        β–Ό  shore proc-input                β–Ό  shore proc-input
  wall.proc.input                     background.proc.input
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β–Ό  shore grd-merge / cc-par-merge / proc-input-merge
            assembly.grd  +  assembly.cc.par  +  assembly.proc.input
                       (Xall multi-component job)

Body-fitted topologies ​

The cubed-sphere topology is SHORE's flagship and the default for shore mesh: 4 equatorial sub-blocks plus 2 polar cap blocks, all conforming through SHARED-memory seams (sub-sub) and DIRICHLET pinning (cap-equator). Cap k=0 seeds use gnomonic flat-square projection β€” a flat diamond in the tangent plane at each cap pole, radially projected onto the body β€” so cap cells are square by construction with no concentric pole pattern.

bash
shore mesh sphere.stl --ni 40 --nj 60 --nk 30
# β†’ sphere_sub0.geo .. sphere_sub3.geo, sphere_cap_north.geo, sphere_cap_south.geo

Spacing continuity is enforced at two levels:

  • k=0 seam C1: the equator's first/last meridional cell is per-j pinned to the cap-edge first cell at every seam vertex (so the 3 edges meeting at each cap-corner share a single first-step length).
  • Volume seam continuity: each block computes its outward normal using centred differences across multi-block seams (ghost rows from partner blocks), so the spacing stays continuous on the outer surface layer-by-layer.

The single-block O-grid is the simpler alternative β€” one j-periodic block, polar singular axis rows, one .geo file. Suitable for downstream tools that need a single periodic-j block.

The OH hybrid topology extends the cubed-sphere wrap with a 6-block structured H-channel that bridges the wrap envelope to a user-supplied axis-aligned bounding box. The wrap and channel are SHARED-by-view (one numpy buffer per pair) and the seam is C1 by construction β€” wrap and channel cells line up bit-exactly and grow geometrically across the seam. The result is a 12-block, single-component near-body mesh that covers everything from the body surface out to a Cartesian box without a chimera-fringe handover. Available as a Python API (shore.mesh.OHTopology); CLI integration is on the roadmap.

The CH hybrid does the same for C-grid airfoils: it extends the C-grid wrap (3-block sharp-TE or 4-block blunt-TE) with 7 (sharp) / 8 (blunt) channel sub-blocks bridging the wrap to a chord/normal-aligned far-field frame. The k_hi-side channels share memory with the wrap; the outflow sub-blocks are conformal SHARED to the wrap's wake far-tip faces (no chimera-fringe handover). Total: 12 blocks (sharp) or 14 blocks (blunt). Available as shore mesh --topology ch.

See Cubed-sphere topology, O-grid topology, C-grid topology, OH hybrid topology, and CH hybrid topology for the full algorithm.

Authors ​

Stefano Zaghi Β· stefano.zaghi@cnr.it

Chief Yak Shaver, Accidental Research Scientist, and HPC Farmer β€” CFD researcher who decided that one more day debugging Fortran build systems was one day too many, opened a Python REPL "just to prototype," and now finds himself maintaining a meshing library, a chimera assembler, an MPI load balancer, and the seven blog tabs he keeps meaning to read.

Andrea Di Mascio Β· andrea.dimascio@univaq.it

Sommo Vate & Resident Gandalf β€” responsible for the deep CFD intuitions SHORE pretends to know.

Claude (Anthropic)

Omniscient Code Oracle & Tireless Rubber Duck β€” AI pair programmer, responsible for writing the boring parts so humans don't have to.

Released under the MIT License.