# NavalToolbox High-performance naval architecture library for Python, powered by Rust. [![PyPI version](https://badge.fury.io/py/navaltoolbox.svg)](https://pypi.org/project/navaltoolbox/) [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) ## Overview NavalToolbox provides fast and accurate naval architecture calculations through a Python API, with a high-performance Rust backend that handles the heavy computational work. ## Features - ⚓ **Hull Geometry**: Load and manipulate ship hulls from STL/VTK files - 🚢 **Multi-hull Support**: Catamarans, trimarans, and arbitrary configurations - 📊 **Hydrostatics**: Volume, COB, Waterplane ($A_{wp}$, LCF, $BM_t$, $BM_l$), Free Surface Correction ($GM_{dry}/GM_{wet}$) - ⚖️ **Stability Analysis**: GZ curve calculation with automatic trim optimization - 🌊 **Downflooding Detection**: Automatic detection of submerged openings - 🛢️ **Tank Management**: Fill levels, free surface effects, sounding tables - 💨 **Wind Heeling**: Silhouette-based wind calculations (DXF/VTK support) - ⚡ **High Performance**: Rust backend with Python convenience ## Installation ```bash pip install navaltoolbox ``` **Requirements:** - Python 3.9 or higher - No additional dependencies required (all native code included in wheels) ## Quick Start ### Loading a Hull ```python from navaltoolbox import Hull # Load hull from STL file hull = Hull("ship.stl") # Get hull dimensions bounds = hull.get_bounds() loa = bounds[1] - bounds[0] # Length overall boa = bounds[3] - bounds[2] # Beam overall print(f"LOA: {loa:.2f}m, BOA: {boa:.2f}m") print(f"Triangles: {hull.num_triangles()}") ``` ### Hydrostatics Calculation ```python from navaltoolbox import Hull, Vessel, HydrostaticsCalculator # Create vessel hull = Hull("ship.stl") vessel = Vessel(hull) # Calculate hydrostatics at a given draft calc = HydrostaticsCalculator(vessel, water_density=1025.0) # Option 1: At draft with VCG (computes stability) state = calc.calculate_at_draft(draft=5.0, vcg=7.0) print(f"Volume: {state.volume:.1f} m³") print(f"Displacement: {state.displacement:.0f} kg") print(f"COB: ({state.cob[0]:.2f}, {state.cob[1]:.2f}, {state.cob[2]:.2f})") print(f"Waterplane Area: {state.waterplane_area:.1f} m²") print(f"LCF: {state.lcf:.2f} m") print(f"GMT (wet): {state.gmt:.3f} m") print(f"GMT (dry): {state.gmt_dry:.3f} m") # Option 2: Find draft for displacement state_disp = calc.calculate_at_displacement(512500.0) print(f"Draft for {state_disp.displacement:.0f}kg: {state_disp.draft:.3f} m") ``` ### Stability Analysis (GZ Curve) ```python from navaltoolbox import Hull, Vessel, StabilityCalculator # Create vessel and calculator hull = Hull("ship.stl") vessel = Vessel(hull) calc = StabilityCalculator(vessel, water_density=1025.0) # Calculate GZ curve displacement_mass = 8635000.0 # kg cog = (71.67, 0.0, 7.555) # LCG, TCG, VCG in meters heels = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] curve = calc.calculate_gz_curve(displacement_mass, cog, heels) # Display results print("Heel (°) | GZ (m)") print("-" * 25) for heel, gz in zip(curve.heels(), curve.values()): print(f"{heel:7.1f} | {gz:7.3f}") # Get max GZ gz_values = curve.values() max_gz = max(gz_values) max_idx = gz_values.index(max_gz) max_heel = heels[max_idx] print(f"\nMax GZ: {max_gz:.3f}m at {max_heel}°") ``` ### Tank Management ```python from navaltoolbox import Tank, Vessel, Hull # Create a vessel hull = Hull("ship.stl") vessel = Vessel(hull) # Add a box-shaped tank tank = Tank.from_box( name="Fuel Tank 1", x_min=40.0, x_max=50.0, y_min=-5.0, y_max=5.0, z_min=0.0, z_max=3.0, fluid_density=850.0 # diesel fuel ) vessel.add_tank(tank) # Set fill level tank.fill_percent = 75.0 # Get tank properties print(f"Tank: {tank.name}") print(f"Total volume: {tank.total_volume:.1f} m³") print(f"Fill volume: {tank.fill_volume:.1f} m³") print(f"Fluid mass: {tank.fluid_mass:.0f} kg") print(f"Center of gravity: {tank.center_of_gravity}") print(f"Free surface moment (transverse): {tank.free_surface_moment_t:.2f} m⁴") ``` ### Multi-hull Vessels ```python from navaltoolbox import Hull, Vessel # Load individual hulls port_hull = Hull("port_hull.stl") starboard_hull = Hull("starboard_hull.stl") # Create catamaran catamaran = Vessel(port_hull) catamaran.add_hull(starboard_hull, offset=(0.0, 8.0, 0.0)) # 8m beam between hulls # Calculate hydrostatics calc = HydrostaticsCalculator(catamaran, water_density=1025.0) state = calc.calculate_at_draft(1.5) print(f"Catamaran displacement: {state.displacement:.0f} kg") print(f"Waterplane area: {state.waterplane_area:.1f} m²") ``` ### Downflooding Detection ```python from navaltoolbox import Hull, Vessel, DownfloodingOpening, StabilityCalculator # Create vessel hull = Hull("ship.stl") vessel = Vessel(hull) # Add downflooding opening (e.g., air pipe, ventilator) opening = DownfloodingOpening.from_point( name="Vent pipe", x=75.0, y=9.8, z=12.5, opening_type="vent" ) vessel.add_downflooding_opening(opening) # Calculate GZ curve with downflooding detection calc = StabilityCalculator(vessel, water_density=1025.0) heels = list(range(0, 95, 5)) curve = calc.calculate_gz_curve(8635000.0, (71.67, 0.0, 7.555), heels) # Check for downflooding for point in curve.points(): if point.is_flooding: print(f"⚠️ Downflooding at {point.heel}° - {', '.join(point.flooded_openings)}") ``` ## Documentation For more detailed documentation, examples, and API reference, visit: - **GitHub Repository**: [NavalToolbox/navaltoolbox-lib](https://github.com/NavalToolbox/navaltoolbox-lib) - **Issue Tracker**: [GitHub Issues](https://github.com/NavalToolbox/navaltoolbox-lib/issues) ## Performance NavalToolbox is built with performance in mind: - Written in **Rust** for maximum speed and memory safety - Efficient mesh operations using `parry3d` - Parallel processing where applicable - Zero-copy data transfer between Python and Rust Example benchmark (DTMB 5415 hull, 3436 triangles): - Load STL: ~10ms - Hydrostatics calculation: ~50ms - GZ curve (13 points): ~650ms ## Use Cases NavalToolbox is suitable for: - 🎓 **Naval architecture education**: Teaching hydrostatics and stability - 🔬 **Research**: Rapid prototyping of new methods and algorithms - 🏭 **Engineering**: Production stability calculations and analysis - 🤖 **Optimization**: Integration with optimization frameworks - 📊 **Batch processing**: Analyzing multiple design variants ## Requirements and Compatibility - **Python**: 3.9, 3.10, 3.11, 3.12, 3.13 - **Operating Systems**: - macOS (Intel and Apple Silicon) - Linux (x86_64, aarch64) - Windows (x86_64) - **File Formats**: - Hull geometry: STL (binary and ASCII), VTK - Silhouettes: DXF, VTK ## Contributing Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests on GitHub. ## License This project is licensed under the **GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later)**. This means: - ✅ Free to use, modify, and distribute - ✅ Can be used in commercial projects - ⚠️ Source code must be made available under AGPL - ⚠️ Network use is considered distribution (AGPL provision) See the [LICENSE](https://github.com/NavalToolbox/navaltoolbox-lib/blob/main/LICENSE) file for details. ## Citation If you use NavalToolbox in your research, please cite: ```bibtex @software{navaltoolbox2026, author = {Anceau, Antoine}, title = {NavalToolbox: High-performance naval architecture library}, year = {2026}, url = {https://github.com/NavalToolbox/navaltoolbox-lib} } ``` ## Author **Antoine ANCEAU** - GitHub: [@antoineanceau](https://github.com/antoineanceau) - Website: [antoine.anceau.fr](https://antoine.anceau.fr) ## Support - 📖 **Documentation**: [GitHub Pages](https://navaltoolbox.github.io/navaltoolbox-lib) - 🐛 **Bug Reports**: [Open an issue](https://github.com/NavalToolbox/navaltoolbox-lib/issues) - 💬 **Discussions**: [GitHub Discussions](https://github.com/NavalToolbox/navaltoolbox-lib/discussions) - 📧 **Email**: For private inquiries --- **Note**: This package uses a Rust backend for high performance. Pre-built wheels are provided for common platforms. If a wheel is not available for your platform, the package will attempt to build from source (requires Rust toolchain).