Your design is a fascinating hybrid: a containerizable, aluminum space-frame trimaran with SWATH-like legs and foil-shaped buoyancy pods. Because it sits between traditional yacht design, offshore platform engineering, and aerospace-style space-frame analysis, no single open-source tool does all of this automatically.
The professional workflow usually couples a **Naval Architecture package** (hydrostatics, stability, panel sizing) with a **Structural FEA package** (truss optimization, buckling, fatigue) and a **Weight Tracking Spreadsheet/Database**.
Free!ship or Delftship Free (model hull/legs) → Export offsets.Nemoh (BEM potential flow) or OpenFOAM (CFD) for slamming/heave plate forces.CalculiX (via PrePoMax or FreeCAD FEM) for truss optimization, buckling, and plate sizing per DNV/ISO rules.Python (pandas) or Excel/LibreOffice Calc linked to FEA material volumes.If the open-source learning curve threatens your timeline, these are standard in small commercial yards/naval architecture firms and cost ~$2k–$10k/yr:
import pandas as pd
# Material Properties
RHO_AL = 0.0975 # lb/in^3 (5083-H116 / 6061-T6)
MARGIN_WELD = 1.10
MARGIN_PAINT = 1.02
MARGIN_CONT = 1.15 # 15% Contingency
# Define Structure as list of dicts
parts = [
{"name": "Leg_Skin_Port", "type": "Shell", "vol_in3": 12000, "loc": "Leg_Port", "z_ft": -5},
{"name": "Leg_Stiffeners_Port", "type": "Beam", "vol_in3": 4500, "loc": "Leg_Port", "z_ft": -5},
{"name": "Leg_Bulkheads_Port", "type": "Shell", "vol_in3": 3000, "loc": "Leg_Port", "z_ft": -2},
{"name": "Triangle_Wall_1", "type": "Truss", "vol_in3": 8000, "loc": "Frame", "z_ft": 2},
{"name": "Triangle_Wall_2", "type": "Truss", "vol_in3": 8000, "loc": "Frame", "z_ft": 2},
{"name": "Triangle_Wall_3", "type": "Truss", "vol_in3": 8000, "loc": "Frame", "z_ft": 2},
{"name": "Mid_Triangle_Beams", "type": "Beam", "vol_in3": 5000, "loc": "Frame", "z_ft": 3.5},
{"name": "Deck_Plating", "type": "Shell", "vol_in3": 15000, "loc": "Deck", "z_ft": 7},
{"name": "Walkway_Grating", "type": "Misc", "weight_lb": 1200, "loc": "Walkway", "z_ft": 8},
{"name": "Batteries_48V_100kWh", "type": "Outfit", "weight_lb": 8500, "loc": "Legs_Low", "z_ft": -6}, # 25% Disp target
{"name": "RIM_Thrusters_x6", "type": "Machinery", "weight_lb": 1800, "loc": "Legs_Mid", "z_ft": -3},
{"name": "Dinghy_RIB_14ft", "type": "Outfit", "weight_lb": 600, "loc": "Aft_Deck", "z_ft": 1},
{"name": "Mooring_Gear_x3", "type": "Outfit", "weight_lb": 900, "loc": "Corners", "z_ft": 0},
]
df = pd.DataFrame(parts)
# Calculate weights
def calc_wt(row):
if 'vol_in3' in row and pd.notna(row['vol_in3']):
return row['vol_in3'] * RHO_AL * MARGIN_WELD * MARGIN_PAINT * MARGIN_CONT
return row['weight_lb'] * MARGIN_CONT # Outfit gets contingency only
df['weight_lb'] = df.apply(calc_wt, axis=1)
# Center of Gravity Calculation (simplified: assumes X/Y centered, only Z matters for stability)
total_wt = df['weight_lb'].sum()
vcg = (df['weight_lb'] * df['z_ft']).sum() / total_wt
print(f"{'Component':<25} {'Weight (lb)':>12} {'Z (ft)':>8}")
for _, r in df.iterrows():
print(f"{r['name']:<25} {r['weight_lb']:>12.0f} {r['z_ft']:>8.1f}")
print("-" * 48)
print(f"{'TOTAL LIGHTSHIP':<25} {total_wt:>12.0f} {vcg:>8.2f}")
print(f"\nTarget Max Displacement: 27,500 lb")
print(f"Margin to Target: {27500 - total_wt:,.0f} lb")