Advanced probabilistic fatigue and crack growth simulation for aerospace aluminum structures under orbital loading conditions.
This tool performs damage-tolerant fatigue life prediction for satellite structural components (primarily 7075-T73 aluminum) using modern fracture mechanics methods, Monte Carlo uncertainty quantification, and realistic mission load histories.
- Walker mean stress correction + Paris law crack growth
- Wheeler retardation model for load sequence / overload effects
- Findley critical plane approach for multiaxial fatigue
- Neuber’s rule (vectorized) for elastic-plastic stress concentration correction
- Newman crack closure function for effective ΔK calculation
- Rainflow cycle counting (via
fatpack) - Monte Carlo simulation with material, geometry, and load scatter
- Realistic orbital load generation:
- Sinusoidal thermal/orbital cycling
- Launch & reentry random vibration
- Gaussian pulse events (e.g. thruster firings)
- Eclipse thermal stress amplification
- Temperature & environmental knockdown factors
- B-basis / A-basis life allowables + failure probability (P_f)
- Comprehensive visualization (crack growth, stress history, rainflow, life distribution, sensitivity)
- Certification-style text report + JSON export
- Python 3.8+
- Core dependencies:
pip install numpy scipy matplotlib fatpack
git clone https://github.com/yourusername/satellite-fatigue-analysis.git
cd satellite-fatigue-analysis
pip install -r requirements.txt # if you create one(Recommended: use a virtual environment)
from fatigue_analyzer import FatigueAnalyzer, MaterialProperties, \
GeometryProperties, AnalysisSettings, LoadProfile
from results_visualizer import ResultsVisualizer
# Use defaults or customize
material = MaterialProperties()
geometry = GeometryProperties()
settings = AnalysisSettings(num_realizations=500) # smaller for testing
load_profile = LoadProfile()
analyzer = FatigueAnalyzer(material, geometry, settings, load_profile)
# Run Monte Carlo
results = analyzer.run_monte_carlo(num_points=500_000, verbose_freq=50)
# Visualize & report (last realization)
if results['last_history'] is not None:
visualizer = ResultsVisualizer()
visualizer.plot_crack_growth_history(results['last_history'])
visualizer.plot_life_distribution(results['orbits']['finite'])
visualizer.generate_report(results, material, geometry, settings)fatigue_report.txt– human-readable certification-style summaryresults.json– all numerical results- Plots in
/mnt/user-data/outputs/(or customize path):- crack_growth.png
- stress_history.png
- rainflow_analysis.png
- life_distribution.png
- sensitivity_analysis.png (if enabled)
| Aspect | Choice | Rationale |
|---|---|---|
| Mean stress correction | Walker (γ = 0.5) | Better behavior in compression than SWT |
| Crack closure | Newman polynomial | Widely accepted in aerospace |
| Retardation | Wheeler (φ = 2.5) | Simple yet captures sequence effects |
| Multiaxial criterion | Findley critical plane | Good correlation for shear-sensitive materials |
| Uncertainty | Lognormal sampling via COVs | Matches MMPDS / typical scatter |
| Life basis | 10th & 1st percentile (B & A) | Aerospace certification standard |
- Assumes 2D edge crack geometry (constant Y factor)
- No mixed-mode (II/III) or 3D crack shape evolution
- Simplified temperature derating (lookup table)
- Single-material hard-coded (7075-T73)
- Computationally heavy for >2000 realizations with 1M time points
- No built-in parallelization
- Add
argparseCLI interface for main parameters - Implement basic multiprocessing / joblib for Monte Carlo realizations
- Allow loading material data from JSON/YAML instead of hard-coding
- Add progress bar (tqdm) during Monte Carlo loop
- Save/load simulation settings as config file
- Support additional materials (2024-T3, Ti-6Al-4V, etc.)
- Add NASGRO / Forman–Newman–de Jong crack growth equation option
- Include variable geometry factor Y(a/t) or lookup table
- Better thermal profile (coupled with orbit attitude)
- Add residual stress redistribution model
- Export results to HDF5 for large campaigns
- Integrate with FEA stress importers (e.g. Nastran .op2 via pyNastran)
- Bayesian calibration of COVs from coupon/test data
- Global sensitivity analysis (Sobol indices)
- Surrogate modeling (Gaussian Process) to accelerate Monte Carlo
- GUI dashboard (Streamlit / Dash) for parameter sweeping & visualization
Contributions welcome — especially validation against published test data or real satellite failure cases.
MIT (or choose your preferred open-source license)
- Uses
fatpackfor rainflow cycle counting - Material properties based on MMPDS (B-basis values)
- Inspired by NASA / ESA damage tolerance guidelines
Happy analyzing — and may your satellites last many orbits!
### Additional Suggestions for Improvement (Detailed)
Here are more concrete, prioritized recommendations beyond what's already in the README:
1. **Performance (highest priority)**
- Parallelize the `run_monte_carlo` loop using `concurrent.futures.ProcessPoolExecutor` or `joblib.Parallel`.
- Reduce default `num_points` to 200k–300k unless high-frequency content is critical.
- Cache rainflow results per block when loads are stationary.
2. **Usability**
- Create `config.yaml` with all `@dataclass` defaults → load with `dacite` or `pydantic`.
- Add `--quick-test` flag that runs 50 realizations with 50k points.
- Add logging (`logging` module) instead of `print()`.
3. **Robustness & Validation**
- Add unit tests (pytest) for:
- Neuber solver convergence
- Wheeler retardation logic
- Critical crack size formula
- Compare single deterministic run against NASGRO / AFGROW for simple cases.
- Add input validation (e.g. ensure Kic > 0, initial_a < critical_a).
4. **Extensibility**
- Make crack growth law pluggable (abstract base class `CrackGrowthLaw`).
- Allow user-defined temperature vs. time or knockdown functions.
- Support variable Kt(a) for growing cracks at notches.
5. **Documentation**
- Add docstrings with type hints to every public method.
- Create `CONTRIBUTING.md` and basic issue/PR templates.
- Include example Jupyter notebook showing sensitivity + parameter sweep.
6. **Scientific / Certification**
- Document sources of every default value (e.g. MMPDS-01 or specific report).
- Add option to apply composite knockdowns (environment × temperature × surface finish).
- Consider adding Walker table lookup instead of fixed γ.