Helical wire surface

The wire’s surface in the examples/wire_coil.py hex mesh (face tag coil), smoothed as a free-standing surface with its open rim frozen, as built or with perturbed input.

Key points

  • The target surface is circular: the wire has no CAD description, so its vertices are held to a tessellation of the mesh’s own curved quads. This shows how the smoother redistributes vertices on a given surface, not a check against an independent geometry.

  • Vertices move a lot: the helical template skews its quads by design, so vertices move by whole local edges (the lines below the table). As built, the minimum barely changes while the mean and the worst 5 % improve.

  • The smoother does not touch the hexes, and moving the surface this far on its own does not leave valid layers around it (The hexes). The surface numbers are not volume-mesh quality.

  • Perturbed input: every movable vertex shifted by up to 0.2 of its local edge length, then put back on the surface.

The numbers

run

quads

inverted

overlapping

min scaled J

mean scaled J

worst 5 % scaled J

as built

1344

0 → 0

0 → 0

0.5187 → 0.5338

0.8282 → 0.9463

0.5237 → 0.8347

perturbed input

1344

2 → 0

0 → 0

-0.0440 → 0.5316

0.7684 → 0.9460

0.3158 → 0.8322

  • as built: min scaled J rose (0.5187 → 0.5338), mean scaled J rose (0.8282 → 0.9463), worst 5 % rose (0.5237 → 0.8347); no quad is inverted or overlapping at the end.

  • perturbed input: min scaled J rose (-0.0440 → 0.5316), mean scaled J rose (0.7684 → 0.9460), worst 5 % rose (0.3158 → 0.8322); no quad is inverted or overlapping at the end.

  • as built: vertices of the wire surface moved 2.17 local edges on average (largest 8.71); the size ratio between neighbours went 1.89 → 1.95.

  • perturbed input: vertices of the wire surface moved 2.23 local edges on average (largest 13.12); the size ratio between neighbours went 2.32 → 1.95.

Run python examples/smoother/quad/cs_wire_coil.py to reproduce; it prints these numbers.

The hexes

  • examples/smoother/quad/cs_wire_coil_hex.py takes the order-1 hex mesh (the corner geometry a .re2 file holds) and puts the smoothed surface’s vertices in place of the old ones; every other vertex stays where the example put it.

  • Measured at the 8 corners (what .re2 holds) and re-read on a finer lattice at order 7, the solver’s.

Carrying the smoothed wire surface into the hexes replaces its 1360 vertices by the smoothed ones (it moved 2.12 local edges on average, largest 8.71) and leaves every other vertex where the example put it. At the corners that makes 652 of 9248 hexes inverted (min scaled J 0.2239 → -0.2768, mean 0.6376 → 0.4865) and, re-read at order 7, 664 inverted (min 0.2239 → -0.2768). 0 of the 652 inverted hexes are in the solid region and 652 in the fluid region; 652 of them touch the wire surface. The 2864 hexes that touch the wire surface read min 0.3323 → -0.2768 at the corners (one hex layer on each side of the surface); the remaining 6384 hexes are unchanged (min 0.2239 → 0.2239).

The smoothed wire surface cannot be carried into the volume for this case. The carried mesh is not valid, so the view below shows only the mesh as built (all toggles stay). Every inverted hex touches the wire surface: it is a layer between the moved surface and the vertices beyond it, which did not move.

mesh

hexes

min scaled J

mean

worst 5 %

inverted

order-7 sampling: min / inverted

conforming, watertight

as built

9248

0.2239

0.6376

0.2496

0

0.2239 / 0

yes

smoothed surface carried in

9248

-0.2768

0.4865

-0.0109

652

-0.2768 / 664

yes

Scaled Jacobian of the order-1 hexes read at their 8 corners (what a .re2 file holds), and the same trilinear map re-read on an 8^3 lattice (order 7, the solver’s).

  • Exterior: every named face by boundary group, one checkbox each (outer and wall start off so coil is visible). Cross-section: across and along the pipe, by scaled Jacobian or region (fluid or solid). Drag to orbit.

Run python examples/smoother/quad/cs_wire_coil_hex.py to reproduce; it prints these numbers.

Notes and caveats
  • coil separates fluid from wire, so hexmesh.boundary_mesh(mesh, "coil") returns every quad twice, once per side; the script keeps one of each pair.

  • The surface is too large for the data to keep a stage history, so the viewer shows only the input and the final state (panels and histogram as in Simple geometries).

  • The tables are regenerated by docs/_ext/gen_smoother_quad_assets.py and docs/_ext/gen_smoother_quad_hexviews_assets.py; nothing is typed in.