```html Parametric Seastead Design Pipeline — Open Source CAD, Hydro, FEA, Print

Early-stage naval architecture · open source

A single parametric model for seastead concepts: print, waves, structure, and CFD

How to keep one ground-truth geometry in OpenSCAD (or a Python CAD sibling), then derive Froude-scale prints, Capytaine meshes, FEA models, and later CFD — without pretending a plastic 1:50 print is an aluminum strength test.

Short answers

Yes

A single parametric 3D definition as ground truth is the right idea. OpenSCAD can be that definition for concept work, especially if AI is already writing .scad well for you. All print / hydro / FEA / CFD files should be exports and idealizations of that model, not separately redrawn hulls.

But

Do not send the same STL to the printer, Capytaine, FEA, and OpenFOAM and expect good physics. Each analysis wants a different idealization of the same geometry (watertight outer hull vs printable parts vs shells/beams vs CFD domain). Also: a geometrically scaled plastic print is useful for hydrodynamics (Froude) and for “does it fit,” not as a quantitative stand-in for aluminum strength.

One ground-truth model

Yes, it is reasonable — it is the whole point of parametric CAD. The mistake is treating “one 3D drawing” as “one mesh.” Think of three layers:

  1. Parameters — lengths, diameters, wall thicknesses, freeboard, draft, material names, print scale, analysis scale.
  2. Master geometry — modules that build the seastead in full-scale meters (or mm, but pick one and never mix).
  3. Views / derivatives — which bodies are included, how they are meshed, and at what scale.

Keep the master in full scale. Scaling for a Froude model is an export option (scale = 1/50), not a second design. That way Capytaine and FEA always see the real vessel, and the printer sees a derived toy.

OpenSCAD is a good master for this phase if your designs are mostly extrusions, hulls of polygons, booleans, and repeating modules (columns, pontoons, decks, trusses). It is weaker when you need class-fair NURBS hulls, production plate expansions, or constraint-based assemblies. You do not need those yet.

How to structure the OpenSCAD project

Split by role, not by “files small enough to print.” A layout that scales:

seastead/
  params.scad              // ALL numbers live here
  lib/
    util.scad              // fillets-as-chamfers, bolts, repeating rings
    materials.scad         // names only; properties for docs/FEA export
  geometry/
    pontoon.scad
    column.scad
    deck.scad
    bracing.scad
    superstructure.scad
  assembly/
    seastead.scad          // full vessel, full scale
    exploded.scad
    printable/             // one file per printer part
      col_lower.scad
      deck_panel_A.scad
  export/
    hydro_hull.scad        // outer wet surface only, closed
    fea_shell.scad         // mid-surfaces or chunky solids
    cfd_body.scad          // outer envelope + maybe appendages
  scripts/
    export.sh              // openscad CLI → stl/amf/3mf
    params.json            // optional mirror of params for Python tools
  README.md                // units, waterline, origin, part map

Rules that keep AI-generated SCAD from rotting

// assembly/seastead.scad
include <../params.scad>
use <../geometry/column.scad>
use <../geometry/pontoon.scad>

part = "assembly"; // override: openscad -D 'part="column"' 

if (part == "assembly") seastead();
if (part == "column")    column();
if (part == "hydro")     hydro_envelope();

OpenSCAD CLI then becomes your “file generator”:

openscad -D 'part="hydro"' -o export/hydro_hull.stl assembly/seastead.scad
openscad -D 'part="column"' -D 'scale=0.02' -o print/column.stl assembly/seastead.scad

Parameters that belong in params.scad from day one

GroupExamples
Missiondisplacement, payload, persons, draft, freeboard, air gap
Configurationn_columns, column_spacing, pontoon_L/B/D, deck_size
Structureplate thicknesses, frame spacing, alloy name
Hydrowaterline Z, density, g, design sea states (Hs, Tp)
Modellambda (e.g. 50), print_tolerance, split_planes
Mesh$fn or explicit segment counts for hydro vs print

If you also keep params.json (or YAML) generated from the same numbers, Python tools (Capytaine, Gmsh, CalculiX pre-processors) can read them without parsing SCAD.

How printed parts fit together

Breaking the .scad into printable files is correct. What you are missing is an explicit mating contract, not just “these STLs look like they nest.”

Specify fit in the model, not in a chat log

OpenSCAD has no real assembly solver (no mates like FreeCAD/Onshape). You simulate that with modules:

module placed_column(i, j) {
  translate([i*s, j*s, 0])
    rotate([0, 0, col_yaw])
      column();
}

If assemblies get painful, keep OpenSCAD as the part generator and do the assembly in FreeCAD (App::Link / Assembly) or even just document transforms in Python. The ground truth for shape can stay SCAD; the ground truth for instance positions can be a small table.

Color / attribute convention

Use color only as metadata in preview: hull = teal, print splits = orange, hydro envelope = translucent blue, omitted internals = gray. It prevents exporting the wrong body to Capytaine.

Deriving the five outputs

#JobWhat to export from the masterTypical open tools
1 Froude-scale print, basin / bathtub / lake waves Watertight outer geometry, split into printable chunks, scaled by 1/λ, thickened to printable walls, ballast voids OpenSCAD → STL/3MF → Cura / PrusaSlicer / OrcaSlicer
2 Linear waves, RAOs, added mass, damping Closed surface of the immersed hull (and maybe internals that trap water). Coarser mesh than print. Full scale, meters. STL/mesh → meshio / meshmagick / Gmsh → Capytaine
3 Structure strength (concept) Not the print mesh. Shells (plates) + beams (frames/bracing), or a simplified solid. Full scale. STEP via FreeCAD, or rebuild plates in FreeCAD FEM / CalculiX / Code_Aster
4 Scaled plastic “structure” Same as (1) but with deliberate thickness rules; treat as qualitative only Printer + bathroom-scale loads; do not replace (3)
5 CFD in waves Outer envelope STL, possibly with a larger domain; ignore cabin furniture OpenFOAM (interFoam / waves), DualSPHysics, REEF3D

1) Froude-scale printed models

You are already doing this. Make it more scientific:

2) Capytaine (do this before CFD)

Capytaine is a Python BEM solver (Nemoh lineage). For concept seasteads it is the highest-leverage wave tool: RAOs, added mass, radiation damping, diffraction forces, mean drift (with care). You can sweep hull proportions in a script, which matches a parametric CAD mindset.

Mesh advice:

3) FEA

Early seastead strength questions are almost always: column-to-pontoon joints, deck truss under self-weight + payload, splitting forces in waves (squeezing/prying of multi-hulls), and punching from slamming. A tetrahedral soup of the 3D-print STL will not answer those well.

Better idealizations, in order of usefulness at concept stage:

  1. Beam model (columns, braces) + plate/shell decks and pontoon sides.
  2. Coarse shell model of the aluminum skin with simple rigid or beam frames.
  3. Local solid models of one joint, loads taken from (1) or from Capytaine.

Load path: hydrostatics + inertia from RAOs (inertia relief or quasi-static “frozen” wave) is enough before the NA. You are looking for order-of-magnitude stress and whether a 12 mm plate is fantasy.

5) CFD

Park it until Capytaine plus a printed model have ranked the hulls. Nonlinear waves, viscous drag, vortex shedding off columns, moonpools, and slamming are CFD problems; linear seakeeping of a large displacement seastead is not. CFD in waves is expensive and easy to mis-set (damping, beach, mesh at the free surface).

Plastic 1:50 vs full-scale aluminum

Short version: a 1:50 FDM model can teach you hydrodynamics and arrangement. It cannot certify that aluminum is strong enough. It can, with eyes open, give a rough stiffness vibe, and it will mislead you on failure.

Two different scalings

What you want to matchLawImplication at λ = 50, model in water
Waves, inertia, gravity (float, RAOs, green water qualitatively) Froude Correct for basin tests if mass, CG, and gyration radii are scaled. This is output (1).
Elastic deformation under those hydro loads (hydroelasticity) Froude + Cauchy (E scaled) Need E_model / E_full ≈ (ρ_m/ρ_f) / λ. In water, ≈ 1/50.
Yield / fracture / buckling collapse Strength + geometric + residual stress similitude FDM plastic does not match. Stop.

The modulus coincidence (why people get tempted)

Aluminum E ≈ 70 GPa. PLA/PETG ≈ 2–3 GPa. Ratio ≈ 1/23 to 1/35. Cauchy+Froude wanted ≈ 1/50. So a geometrically scaled solid plastic model is in the same decade of stiffness as aluminum in waves — closer than intuition suggests — but:

Rules that make plastic still helpful

  1. Use prints for Froude hydro and for human factors / assembly. That is already high value.
  2. Do not scale structure and hydro with the same part if you care about stress. Hydro model: correct exterior and mass. Structural coupon: larger scale (1:5–1:10) joints, or FEA.
  3. If you want a stiffness look-see, print solid or high-infill, geometric thickness, and treat deflections as ± factor of two. Compare which concept is stiffer, not “peak stress is 82 MPa.”
  4. Match dimensionless stiffness if you go further: (E I) / (ρ g L5) for beams, or (E t3) / (ρ g L4) for plates. You may have to distort thickness (thicker or thinner than geometric scale) to put plastic in the right ballpark. Distorted models need a written rule or they are toys.
  5. Never use infill percentage as a stand-in for plate slenderness.
  6. Joints: print them at a scale where bolts are real bolts, or drop the idea and FEA the joint.

Practical recommendation

Drop output (4) as a strength argument. Keep prints for waves and fit. Put “is aluminum thick enough?” on FEA with loads from Capytaine, then let the naval architect clean it up. If you want a physical structural sanity check, print or machine a single joint at 1:5, not a whole seastead at 1:50.

Open-source FEA and CFD that work with what OpenSCAD generates

OpenSCAD’s native children are STL/OFF/AMF and CSG. STL is a surface skin. FEA and good CFD want more.

Geometry bridges

  • FreeCAD — import SCAD or STL; rebuild or convert toward STEP; FEM workbench.
  • Gmsh — mesh from STL or STEP; control sizes; export for CalculiX / Code_Aster / OpenFOAM.
  • meshio — Python Swiss army knife between mesh formats.
  • OpenSCAD → CGAL CSG is not a substitute for a CAE solid. Plan on a rebuild of analysis geometry.

FEA (open)

  • FreeCAD FEM + CalculiX — best “one GUI” path.
  • CalculiX — industrial, shells and solids, input decks you can generate.
  • Code_Aster + Salome-Meca — more powerful, steeper.
  • Elmer, FEniCS — if you like writing PDEs; overkill here.
  • Mystran, OpenRadioss — niche; later.

Hydro / waves (open)

  • Capytaine — linear BEM, first choice.
  • HAMS, NEMOH — other BEM options.
  • meshmagick — hydrostatics, mesh repair.
  • DAVE — scene / hydro visualization in Python.
  • Hydrostatics you can also script: displaced volume, BM, GM from the same mesh.

CFD (open)

  • OpenFOAM + interFoam / wave generation (olaFlow, waves2Foam, or newer wave modules).
  • DualSPHysics — SPH, friendlier for violent free surface, weaker for long seakeeping runs.
  • REEF3D — coastal/ocean CFD, good wave physics.
  • Basilisk — beautiful adaptive two-phase; more research-y.

STL from OpenSCAD → snappyHexMesh (OpenFOAM) is a standard path for an outer hull. It is not a good path for FEA plates.

Recommended software stacks

All open source. Ranked for your constraints: AI-written code, OpenSCAD comfort, concept stage, no NA yet.

Stack A — Stay on OpenSCAD (lowest friction)

params.scad + modules
    ├─ CLI STLs → slicer → print (Froude)
    ├─ hydro_hull.stl → mesh repair → Capytaine → RAOs / animation
    ├─ rebuild shells in FreeCAD FEM → CalculiX
    └─ (later) hull.stl → OpenFOAM snappyHexMesh

Best if designs stay CSG-simple. AI keeps editing .scad. You accept that FEA geometry is a simplified cousin, still driven by the same parameters.

Stack B — Python CAD as master (best if you are willing to switch)

params.yaml
  CadQuery 2  or  build123d   →  STEP + STL
    ├─ print STLs
    ├─ Capytaine
    ├─ Gmsh → CalculiX
    └─ OpenFOAM

Why it is better long-term: real solids and STEP, fillets that are not lies, the same language as Capytaine (Python), tests, git diffs that are readable, AI is at least as good at Python as at SCAD. SolidPython is a halfway house (Python that emits OpenSCAD) if you want a gentle move.

Stack C — FreeCAD as hub

Spreadsheet workbench for parameters, Part or PartDesign (or import SCAD), FEM, Mesh, TechDraw for assembly sheets. Steeper interactive GUI, weaker for “AI writes the whole vessel,” stronger for STEP and FEA. Good as the downstream hub even if SCAD remains upstream.

Is there a better set that does all four off one base model?

There is no open-source “seastead suite” that honestly does print + BEM + FEA + CFD from one button. Commercial naval tools (Rhino + Orca3D, Maxsurf, NAPA, ANSYS Aqwa, WAMIT, Star-CCM+) still do not really do FDM split parts for you.

The winning pattern in open source is:

parametric solid (SCAD or CadQuery) → many exporters → specialist solvers

with a strict rule that parameters never fork. If you want one GUI over that, FreeCAD is the closest. If you want one language over that, Python (CadQuery + Capytaine + PyVista + meshio + subprocess to CalculiX/OpenFOAM) is the closest.

Blender is tempting for wave visuals and even geometry nodes, but it is a poor structural source of truth. Use it for pictures, not for plate thickness.

What is good enough before a naval architect

You said you will hire an NA before anything full scale. Use that. Your job is to kill bad configurations cheaply and walk in with a concept that already has:

That is a strong NA handoff. It is not class approval, and it should not try to be.

Other tools worth knowing

A practical next-step recipe

  1. Freeze a coordinate system, units (meters), and params.scad.
  2. Refactor existing AI SCAD into modules + assembly + hydro_envelope + printable parts as above. Add explode and a part table.
  3. Write scripts/export.sh so a clean checkout can regenerate every STL.
  4. Build hydrostatics + Capytaine in a Python notebook that reads the hydro STL and params.json. Sweep two variables (column spacing, draft) before you sculpt superstructure.
  5. Print one λ = 50 (or larger if the printer allows — bigger is better for Froude in messy small waves) hull, ballast to WL, put an IMU on it.
  6. In FreeCAD FEM, make a beam/shell cartoon of the same parameters; apply a few static load cases (still water, one sagging wave, one splitting load). Decide if aluminum plate is even in the conversation.
  7. Only then consider OpenFOAM for a problem Capytaine cannot touch (a moonpool, a breaking-wave slam, viscous yaw damping).
  8. Walk into the NA with the param list, RAO plots, a video of the model, and the FEA cartoon — plus the list of ignored physics.

Bottom line

One parametric source of truth: yes. OpenSCAD as that source: yes for this phase. One mesh for every physics: no. Plastic 1:50 as aluminum: no, except qualitative stiffness and hydro. Best open companions: Capytaine, FreeCAD/CalculiX, Gmsh, OpenFOAM later. Best upgrade path if SCAD gets cramped: CadQuery/build123d with the same parameter file.

```