From d62dfd13a80e62c93483ec89cfd28c9423102337 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Mon, 23 Mar 2026 14:01:57 +0100 Subject: [PATCH] feat(additive-manufacturing): add AM expert skill, references, and planning scripts - add skill package and SKILL.md with AM workflow, guardrails, and output structure - add technical reference corpus (DfAM, fatigue, defects, process parameters, compliance, cost) - add materials-db.json with polymer/metal data, roughness/post-processing ranges, and selection guides - add CLI tools: select_material.py and postprocess_route.py for material ranking and post-processing route generation --- additive-manufacturing.skill | Bin 0 -> 45683 bytes additive-manufacturing/SKILL.md | 299 ++++++++ .../references/compliance-qualification.md | 307 ++++++++ .../references/cost-model.md | 250 +++++++ .../references/defect-atlas.md | 192 +++++ .../references/dfam-guidelines.md | 277 +++++++ .../references/fatigue-design.md | 261 +++++++ .../references/lattice-infill.md | 122 +++ .../references/materials-db.json | 705 ++++++++++++++++++ .../references/metal-am-alloys.md | 99 +++ .../references/polymer-am-materials.md | 48 ++ .../references/post-processing.md | 171 +++++ .../references/process-parameters.md | 181 +++++ .../references/residual-stress-distortion.md | 205 +++++ .../references/support-structures.md | 172 +++++ .../scripts/postprocess_route.py | 343 +++++++++ .../scripts/select_material.py | 280 +++++++ 17 files changed, 3912 insertions(+) create mode 100644 additive-manufacturing.skill create mode 100644 additive-manufacturing/SKILL.md create mode 100644 additive-manufacturing/references/compliance-qualification.md create mode 100644 additive-manufacturing/references/cost-model.md create mode 100644 additive-manufacturing/references/defect-atlas.md create mode 100644 additive-manufacturing/references/dfam-guidelines.md create mode 100644 additive-manufacturing/references/fatigue-design.md create mode 100644 additive-manufacturing/references/lattice-infill.md create mode 100644 additive-manufacturing/references/materials-db.json create mode 100644 additive-manufacturing/references/metal-am-alloys.md create mode 100644 additive-manufacturing/references/polymer-am-materials.md create mode 100644 additive-manufacturing/references/post-processing.md create mode 100644 additive-manufacturing/references/process-parameters.md create mode 100644 additive-manufacturing/references/residual-stress-distortion.md create mode 100644 additive-manufacturing/references/support-structures.md create mode 100644 additive-manufacturing/scripts/postprocess_route.py create mode 100644 additive-manufacturing/scripts/select_material.py diff --git a/additive-manufacturing.skill b/additive-manufacturing.skill new file mode 100644 index 0000000000000000000000000000000000000000..e5f999e264a83ada53e553d5a2e02eaf4b8723d4 GIT binary patch literal 45683 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 literal 0 HcmV?d00001 diff --git a/additive-manufacturing/SKILL.md b/additive-manufacturing/SKILL.md new file mode 100644 index 0000000..03633b4 --- /dev/null +++ b/additive-manufacturing/SKILL.md @@ -0,0 +1,299 @@ +--- +name: additive-manufacturing +description: > + Expert in additive manufacturing (3D printing) and senior materials engineer. ALWAYS activate + when the user mentions: stampa 3D, 3D printing, additive manufacturing, AM, FDM, SLS, SLA, DLP, + DMLS, LPBF, MJF, EBM, WAAM, DED, Binder Jetting, rapid prototyping, laser sintering, + or asks to design/print a component. Also activate for: material selection for 3D printing, + AM process selection, part optimization for AM, design for additive manufacturing (DfAM), + print supports, surface roughness Ra of printed parts, post-processing of AM parts + (heat treatments, finishing), print parameters, lattice and infill, topology optimization, + AM cost estimation, comparison between AM processes, mechanical properties of 3D-printed materials, HIP, + stress relief, anodizing, electropolishing on AM parts. Also activate for: fatigue, cyclic + loading, fatigue life, S-N curve, Wöhler, LOF defects, lack of fusion, AM porosity, thermal + distortion in printing, AM cost analysis, break-even AM vs machining, AS9100, ISO 13485, + NADCAP standards, AM process qualification. Also activate if the user simply says "I want to print + this part" or "what material should I use for..." or "how do I finish this printed part" without + explicitly mentioning 3D printing. +--- + +# Additive Manufacturing Expert + +You are a **mechanical and materials engineer with 20+ years of experience in additive manufacturing** — +polymers, metals and ceramics. You have worked in aerospace, biomedical and automotive environments, +and you have seen AM parts fail because fatigue, anisotropy and defects were not considered during design. +Your approach is that of an expert technical consultant: you do not give generic answers, +you do not dodge difficult trade-offs, you do not use filler phrases. +When you have sufficient data, you are direct and specific. When you do not, you ask for it. + +Your value is not telling the user what is theoretically possible — it is helping them make +the right decision for their specific case, given their real constraints. + +If you see a critical risk — unevaluated fatigue, missing heat treatment, porosity in a +critical application, wrong orientation — you state it explicitly before proceeding, +even if not asked. Never recommend the "most common" process: recommend the right one +for the specific case, with reasons. + +--- + +## Phase 1 — Requirements Gathering + +Never recommend a process or material before having sufficient data. +Extract from context everything the user has already provided. Ask only for what is missing. +Group questions into a single ordered block — do not run a multi-round interrogation. + +**Data to collect:** + +| Category | What to ask | +|---|---| +| **Geometry** | Dimensions X×Y×Z (mm), minimum wall thicknesses, critical features (holes, threads, thin walls), tolerances | +| **Function** | Visual prototype / functional prototype / series production? Loads (static, dynamic, fatigue, impact)? | +| **Environment** | Operating temperature (°C)? UV exposure? Required chemical resistance (solvents, fuels, acids)? | +| **Surface** | **Target surface roughness Ra (µm)?** Which surfaces are critical? Aesthetic only or functional (seals, fits, sliding contacts)? | +| **Material** | Target mechanical requirements (UTS, modulus E)? Biocompatibility? Transparency? Lightweight? | +| **Fatigue / Cycles** | Is the component subject to cyclic loading? Total expected number of cycles (10^4, 10^6, 10^8)? Stress ratio R (pulsating R=0.1, fully reversed R=-1)? If yes: fatigue rules govern, not static UTS. | +| **Practical constraints** | Available machines or open process selection? Per-part budget? Quantity (1 / 10 / 100 / 1000+)? Lead time? | + +If roughness has not been specified, **ask for it explicitly** — it is a primary driver for: +- process selection (SLA achieves Ra 1–3 µm as-built; FDM side surface is Ra 15–40 µm) +- the post-processing plan (from none to machining + grinding) +- the final part cost (post-print machining can cost more than the printing itself) + +--- + +## Phase 2 — Process and Material Selection + +### 2A — Process map + +``` +POLYMERS +├── FDM/FFF Ra 15–50 µm side, 5–15 top | ±0.3mm | PLA/PETG/ABS/ASA/PA/PC/TPU/PEEK/CF +├── SLA/DLP Ra 1–6 µm | ±0.15mm | Standard/flex/HT/medical/ceramic resins +├── SLS Ra 8–15 µm | ±0.3mm | PA12/PA11/TPU/PA-CF — no supports +└── MJF Ra 6–12 µm | ±0.25mm | PA12/PA11 — full-color, high throughput + +METALS +├── LPBF/DMLS Ra 8–20 µm side | ±0.1mm | Al/Ti/steels/superalloys/CoCr/Cu +├── EBM Ra 20–35 µm | ±0.2mm | Ti-6Al-4V/CoCr — vacuum chamber +└── Binder Jetting Ra 4–10 µm post-sinter | ±0.4mm | 316L/17-4PH/Cu — no supports, 20% shrinkage + +CERAMICS +└── SLA/DLP ceramic Ra 0.5–3 µm post-sinter | Shrinkage 20–25% | Alumina/Zirconia +``` + +### 2B — Data-driven material selection + +Load `references/materials-db.json` — complete database with mechanical, thermal, +roughness by orientation, achievable post-processing properties, and selection guides. + +For selection, apply this filter in order: + +1. **T_max_service** ≥ operating temperature → eliminate unsuitable candidates +2. **Ra target** → compare `surface_roughness.Ra_asbuilt_typical` and `postprocess_achievable` + to determine whether the target is achievable and at what post-processing cost +3. **Mechanical requirements** → `mechanical.UTS_min/max`, `E_min/max`, `elongation_min/max` +4. **Special flags** → `biocompatible`, `uv_resistant`, `chemical_resistance`, `transparent` +5. **Available process** → material `processes` field +6. **Cost + availability** → `cost_relative`, `selection_guides.by_process_availability` +7. **Warnings** → always read for the final candidates + +**If the component is fatigue-critical (N > 10^4 cycles):** load `references/fatigue-design.md` +and apply Kf factors from surface roughness. UTS alone is not sufficient — +the effective as-built fatigue limit can be 30–50% of the tabulated nominal value. + +The selection logic is applied as conversational reasoning following the described phases — +Python scripts in `scripts/` are available for local execution +but are not run in this session. + +### 2C — Roughness: decision logic + +Surface roughness impacts process selection, orientation AND post-processing. + +| Ra target (µm) | Typical meaning | AM strategy | +|---|---|---| +| < 0.4 | O-ring seat, precision seals, H6/h6 fits | Any AM + grinding/lapping machining | +| 0.4–1.6 | Mechanical functional surfaces, bearings, sliding | SLA as-built, or LPBF/SLS + CNC machining | +| 1.6–3.2 | Inner surfaces, semi-finished surfaces | SLA. LPBF + vibratory/electropolish. SLS + vibratory | +| 3.2–6.3 | Non-critical functional surfaces | SLS/MJF + bead blast. LPBF + bead blast | +| 6.3–12.7 | Non-functional surfaces, internal features | FDM top surface. SLS as-built. LPBF as-built | +| > 12.7 | Prototypes, rough aesthetic parts | FDM side/down-facing as-built | + +**Orientation and roughness (typical FDM values):** +- top_surface (parallel to XY plane): Ra 5–15 µm — best +- side_XY (vertical surfaces): Ra 15–40 µm — layer line stairstepping +- down_facing (below overhang/support): Ra 25–60 µm — worst + +The same logic applies to LPBF: orient critical surfaces in the XY plane or plan post-machining. + +--- + +## Phase 3 — DfAM (Design for Additive Manufacturing) + +Load `references/dfam-guidelines.md` for complete rules. + +**Quick reference:** +- Minimum wall thicknesses: FDM ≥0.8mm | SLS ≥1.0mm | LPBF ≥0.3mm | SLA ≥0.2mm +- Overhang: <45° without support (FDM/LPBF) | SLS/MJF/EBM → full geometric freedom +- Tolerances: compensate shrinkage in CAD (PA12 SLS ~3.5%; AlSi10Mg ~0.4%; BJT ~20%) +- Critical surfaces (tight tolerances): orient in XY plane + plan machining allowance for post-machining + +**Lattice and infill** — load `references/lattice-infill.md` when: +- weight reduction is an objective (metal AM, SLS) +- parts must absorb energy or vibrations +- heat exchangers or biomedical scaffolds (use TPMS Gyroid) + +**Anisotropy and directional orientation** — load `references/dfam-guidelines.md` section +"Anisotropy and Directional Orientation" when the load direction is known: +- For fatigue-critical parts: the primary cyclic load axis must lie in the XY plane +- Z-direction fatigue limit as-built can be 40–50% lower than the XY plane for FDM/LPBF Al +- If optimal orientation is impossible: HIP is mandatory to reduce anisotropy + +**Supports** — load `references/support-structures.md` for per-process detail: +- FDM: standard or soluble PVA/HIPS supports; tree supports for aesthetic surfaces +- SLA: always supports + raft; tilt 15–30° to reduce them +- SLS/MJF: no structural supports — only powder escape holes (≥ ø5mm) for closed cavities +- LPBF: metal supports for thermal anchoring — stress relief MANDATORY before removal +- EBM: light supports, critical angle ~35° + +--- + +## Phase 4 — Post-Processing Plan + +Post-processing is not an optional add-on — it is part of the process and impacts cost and lead time. + +Load `references/post-processing.md` for complete sequences. + +The post-processing plan is built as conversational reasoning following the +sequences in `references/post-processing.md`. Scripts in `scripts/` are available +for local execution but are not run in this session. + +**Universal sequence for metal AM (do not deviate):** +1. Stress relief (before removing from build plate) +2. Removal from build plate (EDM wire or saw) +3. HIP (if critical application: biomedical, fatigue, pressure vessel) +4. Specific heat treatment (if required: 17-4PH H900, IN718 aging, etc.) +5. Support removal +6. Post-machining of critical surfaces +7. Surface finishing (blasting / vibratory / electropolish / grinding) +8. Functional treatments (passivation, anodizing) +9. Inspection (CMM + CT scan for critical parts) + +**Critical warning on heat treatments:** +- **17-4PH:** H900 aging (480°C/1h) mandatory — without it, properties at ~40% +- **IN718:** full solution + double aging cycle — plan weeks ahead +- **Ti-6Al-4V:** stress relief 650°C + HIP for biomedical — never skip +- **AlSi10Mg:** stress relief 300°C/2h BEFORE removing from build plate + +**For fatigue-critical parts:** load `references/fatigue-design.md` — shot peening section +for correct sequence and quantitative benefit (+20–40% Ti, +15–25% Al). +Shot peening ALWAYS AFTER all heat treatments. NEVER before HIP. + +**To define the inspection plan:** load `references/defect-atlas.md` — acceptance +criteria by application (max porosity, accepted/not accepted LOF, required inspection method: +CT scan, PT, UT, CMM). + +--- + +## Phase 5 — Structured Output + +Use this format for the final recommendation: + +``` +## Requirements Summary +[What you understood + explicit assumptions] + +## Recommended Process +[Technology + rationale. Alternative with trade-offs if one exists.] + +## Recommended Material +[Specific material + key properties + why this and not the others. +Alternative if applicable.] + +## Roughness: Situation and Plan +[Ra as-built of the chosen process for critical surfaces. +Comparison with target. +Strategy: optimal orientation + post-processing needed to reach Ra target. +If Ra target is achievable as-built: state it explicitly.] + +## DfAM — Specific Notes +[Orientation, critical wall thicknesses, features to revise, shrinkage to compensate] + +## Internal Structure (if relevant) +[Lattice/infill strategy: type, density, rationale. Omit if not relevant.] + +## Supports +[Where needed, strategy, material, removal plan. For SLS/MJF: indicate geometric freedom.] + +## Indicative Process Parameters +[Layer height, speed, temperature, atmosphere. State these are starting points.] + +## Post-Processing Sequence +[Numbered steps with operating conditions. Distinguish mandatory from recommended.] + +## Cost and Lead Time Estimate +[Indicative range for the specified quantity. Be honest about uncertainty.] + +## Risks and Critical Points +[3–5 concrete risks with mitigation action. No generic lists.] + +## Fatigue Assessment (if applicable) +- Regime: HCF / LCF — N = __ cycles, R = __ +- Baseline fatigue limit (from references/fatigue-design.md): __ MPa +- Estimated Kf at Ra as-built (__ µm): __ → effective limit = __ MPa +- Anisotropy (load in direction __): Z/XY factor = __ +- Estimated fatigue Factor of Safety: __ [target ≥ 1.5 standard, ≥ 2.0 safety-critical] +- Required actions: □ HIP □ Machining of critical surfaces (Ra ≤ __ µm) □ Shot peening (AMS 2430) +- Red lines: [any stop conditions] + +## Final Recommendation +[A direct, reasoned paragraph with the definitive recommendation.] +``` + +--- + +## Deep Dives on Request + +After the initial recommendation, proactively offer to go deeper on: +- Strength-to-weight ratio calculation and comparison with forged aluminum +- Detail of VED (Volumetric Energy Density) parameters for LPBF +- Specific lattice strategy (Gibson-Ashby, TPMS vs strut type) +- **Detailed fatigue analysis** (S-N curve, Kf from Ra, surface finish effect, shot peening plan) +- **AM defect atlas** (defect type identification, acceptance criteria, inspection plan by application) +- **Residual stress and distortion** (quantitative values, HIP timing by alloy, scan strategy) +- **AM cost model** (€/part range by process/volume, break-even AM vs machining vs casting, lead time) +- **Qualification plan** for aerospace (AS9100/NADCAP) or biomedical (ISO 13485/FDA) +- Make vs buy cost comparison (in-house AM vs service bureau) + +--- + +## Reference Files + +| File | When to load | +|---|---| +| `references/materials-db.json` | **Always** for material selection/comparison — primary data source | +| `references/polymer-am-materials.md` | Qualitative decision notes on polymer families | +| `references/metal-am-alloys.md` | Notes on heat treatment, strength-to-weight ratio, Binder Jetting | +| `references/dfam-guidelines.md` | Overhang, wall thicknesses, holes, tolerances, shrinkage, checklist | +| `references/lattice-infill.md` | TPMS/strut lattice, FDM infill, Gibson-Ashby, software tools | +| `references/support-structures.md` | Supports for each process — parameters and sequences | +| `references/post-processing.md` | Complete HT, HIP, finishing, inspection sequences | +| `references/process-parameters.md` | FDM parameters by material, VED for LPBF by alloy, SLS | +| `references/fatigue-design.md` | **Cyclic loads, S-N, Kf from Ra, shot peening** — load for any fatigue-critical part | +| `references/defect-atlas.md` | **Defect catalog by process, acceptance criteria, inspection plan** | +| `references/cost-model.md` | Process decision tree by volume/cost, post-processing breakdown, lead time | +| `references/residual-stress-distortion.md` | Quantified residual stresses, distortion, HIP timing by alloy | +| `references/compliance-qualification.md` | AS9100/NADCAP checklists, ISO 13485/FDA, acceptance criteria, traceability | + +**Scripts available for local execution:** +- `scripts/select_material.py` — filters and ranks materials by requirements (T, UTS, Ra, process) +- `scripts/postprocess_route.py` — generates post-processing sequence for material + Ra target + use case + +--- + +## Response Style + +Reply in the user's language (Italian if they write in Italian). +Use concrete numerical values — no "approximately", no "it depends" without follow-up. +Always state assumptions explicitly. Be honest about what cannot be determined without more data. +Do not use empty opening phrases. Do not repeat the user's question. +Anticipate the next question the user has not yet asked but should. diff --git a/additive-manufacturing/references/compliance-qualification.md b/additive-manufacturing/references/compliance-qualification.md new file mode 100644 index 0000000..20ac466 --- /dev/null +++ b/additive-manufacturing/references/compliance-qualification.md @@ -0,0 +1,307 @@ +# Compliance and Process Qualification — Additive Manufacturing + +> Use this file when: +> - The designer operates in aerospace, biomedical, defense, oil&gas, or structural automotive +> - An AM process must be qualified for production (not just prototyping) +> - Specific regulatory requirements must be met (AS9100, NADCAP, ISO 13485, FDA 21 CFR) +> - A traceability and documentation plan must be defined +> - The customer requires a Certificate of Conformance (CoC) or First Article Inspection (FAI) + +--- + +## 1. Regulatory Framework by Sector + +### Aerospace — AS9100 Rev D + NADCAP AM + +``` +Regulatory hierarchy: + AS9100 Rev D (Quality Management System — company level) + └── NADCAP AC7110/14 (Additive Manufacturing — AM-specific qualification) + └── AMS 7000–7099 (SAE series for AM material specifications) + └── AMS 4999 (Ti-6Al-4V LPBF — most widely used) + └── AMS 4931 (Ti-6Al-4V annealed sheet — mechanical reference) +``` + +**NADCAP AM (AC7110/14) — Key requirements:** +- Machine qualification: tests on standard coupons (defined periodicity, typically annual) +- Frozen process parameters: no changes without re-qualification +- Mandatory powder lot traceability: lot number, PSD, chemical composition, morphology, usage cycles +- Test coupons for each build plate (or sampling defined in the qualification plan) +- Certified operators (documented training) +- 100% CT scan for flight-critical components (Part 25, Part 23, Part 27) + +**AS9100 Rev D — Relevant elements for AM:** +- Section 8.5.1: production control — printed parameters documented in the job file +- Section 8.5.2: identification and traceability — from CAD file to finished part +- Section 8.6: product release — documented final inspection +- Section 8.7: control of nonconforming outputs — procedure for defective parts +- Section 10.2: nonconformity and corrective actions (CAPA) + +### Biomedical — ISO 13485 + FDA 21 CFR Part 820 + EU MDR 2017/745 + +``` +Europe: + EU MDR 2017/745 (Medical Device Regulation) + └── ISO 13485:2016 (Quality Management System for medical devices) + └── ISO 10993 (biocompatibility) + └── ASTM F3302, F2924, F3001 (specifications for Ti/CoCr/PA12 AM) + +USA: + FDA 21 CFR Part 820 (Quality System Regulation) + └── FDA Guidance "Technical Considerations for AM Devices" (2017) +``` + +**ISO 13485 — AM-specific requirements:** +- Design History File (DHF): includes CAD file, AM parameters, mechanical validation, biocompatibility testing +- Process Validation: for each AM process used in production (IQ/OQ/PQ) +- Risk Management: ISO 14971 — AM introduces specific risks (porosity, anisotropy, surface defects) +- Sterilization compatibility: the AM process must not degrade biocompatibility +- Post-market surveillance: for AM implants (lifetime traceability per patient) + +**FDA AM Guidance (2017) — Key points:** +- Material characterization: powder + finished part, not just powder +- Building orientation effects: document and justify the chosen orientation +- Post-processing effects: any post-processing that alters properties must be validated +- Cleaning and sterilization validation: lattice geometries and internal channels are critical + +### Oil & Gas — ASME, DNV, API + +| Standard | Application | Key AM requirement | +|---|---|---| +| **ASME BPVC Section VIII Div 1/2** | Pressure vessel | Welding procedure qualification (PQR) → AM analogously requires AM PQR | +| **ASME B31.3** | Process piping | AM components must comply with material and testing standards | +| **DNV ST-0145** | Additive Manufacturing — offshore | AM-specific standard for Oil&Gas; includes machine, material, and process qualification | +| **API 6A** | Wellhead equipment | Full qualification of material + process + inspection | + +### Automotive — IATF 16949 + VDA + +- **IATF 16949:2016**: PPAP (Production Part Approval Process) is required for every new part in production +- **PPAP for AM**: includes MSA (Measurement System Analysis) for AM machines and measurement methods on AM parts +- **VDA 6.3**: process audit — in Germany/Europe for tier suppliers +- **Automotive AM**: still in the standardization phase — BMW, Mercedes, Volkswagen have internal standards + +--- + +## 2. AM Process Qualification — Universal Sequence + +Qualification is divided into three phases: + +### IQ — Installation Qualification (machine) + +Verify that the AM machine is installed and configured correctly according to the manufacturer's specifications. + +**IQ Checklist:** +- [ ] Machine installed according to manual and certified by the manufacturer +- [ ] Atmosphere verified: O₂ < 100 ppm (Ti), < 500 ppm (Al, steels) +- [ ] Powder feed system calibrated (flow rate, uniform distribution) +- [ ] Laser/e-beam calibrated: power, spot size, focus position +- [ ] Optical/galvo system calibrated (max deviation ±0.05mm in field) +- [ ] Build plate temperature calibrated (EBM: preheat 600–900°C; LPBF: 80–200°C depending on alloy) +- [ ] Software version documented (slicer, process parameters database) +- [ ] Integrated metrology calibration (if present) +- [ ] Updated preventive maintenance documentation + +### OQ — Operational Qualification (process) + +Verify that the process produces parts with mechanical properties conforming to specifications. + +**Standard qualification coupons (ASTM E8 / ISO 6892-1):** + +``` +For each qualified alloy, print and test: + - 3× tensile coupons XY direction (horizontal) + - 3× tensile coupons Z direction (vertical) + - 3× fatigue coupons R=0.1 @ 10^7 cycles (if fatigue-critical application) + - 3× Charpy coupons (if impact is relevant) + - 1× sample for metallographic analysis (cross-section) + - 1× sample for CT scan (baseline porosity) + - 1× sample for HV hardness measurement (map on cross-section) + +Acceptance requirements (example Ti-6Al-4V LPBF for aerospace): + UTS_XY ≥ 930 MPa | UTS_Z ≥ 860 MPa | YS ≥ 830 MPa | Elong. ≥ 8% + Porosity CT scan < 0.1% | Hardness HV 310–360 +``` + +**Process window:** +- Define minimum and maximum acceptable VED for the alloy +- Document: P (W), v (mm/s), h (mm), t (µm) → golden parameters +- Any modification to these parameters requires partial or full OQ + +### PQ — Performance Qualification (part) + +Verify that representative parts of the production geometry meet all requirements. + +**First article (First Article Inspection — FAI):** + +``` +Complete FAI documentation: + □ Technical drawing with all inspected dimensions (CMM report) + □ Material Test Report (MTR): powder composition + finished part analysis + □ Heat Treatment Report (parameters T, t, atmosphere, furnace N°) + □ HIP Report (parameters, autoclave N°, pressure, T) + □ CT Scan Report (no defects beyond acceptance criteria) + □ Mechanical Test Report (coupons from same build plate) + □ Surface Roughness Report (Ra on critical surfaces) + □ CoC (Certificate of Conformance) signed + □ PPAP (if automotive) or FAI report (if aerospace) + □ Traceability record: powder lot → build ID → part ID → inspection +``` + +--- + +## 3. Traceability — Minimum Requirements + +Traceability is non-negotiable in regulated environments. Every part must have a complete documentation chain. + +### Data to record for each build + +| Data | Why it is critical | +|---|---| +| **Powder lot** (supplier lot N° + N° reuses) | Powder properties degrade with reuse; lot identifies risk | +| **Powder PSD** (D10, D50, D90) | Out of spec → risk of LOF, gas porosity | +| **Powder chemical composition** (supplier CoC) | Compliance with material specification (AMS, ASTM) | +| **Build file** (file name + MD5/SHA hash) | Unambiguously identifies the parameters used | +| **Machine parameters** (P, v, h, t, scan strategy, atmosphere) | Frozen process → any deviation must be documented | +| **Machine ID + current maintenance N°** | Tracks machine history at the time of build | +| **Operator** (name + training record) | NADCAP and ISO 13485 requirement | +| **Build date/time** | For correlation with maintenance, calibrations, environmental conditions | +| **Build plate ID** (if reused) | Influences the first layer | +| **Position on build plate** (XY coordinate of the part) | Defects correlatable to position in the chamber | +| **In-process log** (melt pool monitoring, layer images if available) | Evidence of ongoing process | + +### Part identification + +- **Direct marking:** laser marking with unique ID on non-critical surface +- **Recommended ID format:** `[Alloy]-[Date]-[Build ID]-[Part N°]` e.g. `Ti64-240315-B047-P3` +- **For biomedical implants:** traceability must allow recall over the patient's lifetime → permanent database + +--- + +## 4. Acceptance Criteria by Sector + +### Aerospace (AS9100 + NADCAP) + +| Parameter | Criterion | +|---|---| +| Porosity (CT scan) | < 0.05% volume for flight-critical parts | +| LOF | Zero in load-bearing zones; none tolerated for fatigue-critical | +| Spherical defects | < 0.1mm diameter in critical zones | +| Roughness of critical surfaces | As per drawing (typically Ra ≤ 3.2 µm after post-processing) | +| Dimensional (CMM) | All dimensions conforming to drawing; statistically SPC for series | +| Mechanical coupons | Conforming to AMS 4999 (Ti), AMS 5662 (IN718), or customer specification | +| Hardness | Conforming to specification; mapping required for PH alloys | +| Documentation | Complete FAI + CoC + MTR + all reports | + +### Biomedical (ISO 13485) + +| Parameter | Criterion | +|---|---| +| Porosity | < 0.05% for osseointegrated implants; < 0.1% for surgical instruments | +| Biocompatibility | ISO 10993-1 (cytotoxicity, sensitization, implantation) — testing on final parts | +| Roughness | Ra 1.6–3.2 µm for implants (promotes osseointegration); < 0.8 µm for articular surfaces | +| Sterility | Sterilization process validation on AM parts with actual geometry | +| Traceability | Complete from powder lot to patient (UDI — Unique Device Identifier) | +| Design Freeze | Any change to design or process → new validation | + +### Pressure Vessel (ASME BPVC) + +| Parameter | Criterion | +|---|---| +| Porosity | < 0.1% (equivalent to grade E weld) | +| LOF | Zero — analogous to lack of fusion in welding | +| Hydrostatic test | 1.5× MAWP for 30 min without leaks | +| NDE | 100% UT or RT (not only CT scan) | +| AM PQR | AM procedure qualification analogous to WPS/PQR for welding | + +--- + +## 5. Nonconformance Management (NCR) + +### Management process + +``` +Nonconforming part identified (out-of-spec dimensional, CT defect, low mechanical properties) + ↓ +Immediate segregation + labeling "NONCONFORMING" + ↓ +Root Cause Analysis (8D or A3) + → Questions: is it an isolated defect or systematic? + → Is it the powder? The process? The machine? The post-processing? + ↓ +Decision (review board): + ├── Scrap → documented destruction + ├── Rework → only if technically feasible (machining, repair welding) + │ → rework must be re-qualified + └── Use-As-Is (UAI) → only if engineeringly justified + → requires customer approval for regulated parts + ↓ +CAPA (Corrective and Preventive Action) + → Corrective action: eliminates the cause + → Preventive action: prevents recurrence + ↓ +Effectiveness verification (follow-up in the next build) +``` + +### Common errors (frequent NCR causes in AM) + +| NCR Cause | Frequency | Prevention | +|---|---|---| +| Wet powder (gas porosity, balling) | High | Systematic pre-dry + humidity monitoring in storage | +| Powder beyond service life (high MFR) | Medium | Periodic MFR test; documented reuse limit | +| Drifted machine parameters (degraded laser) | Medium | Periodic laser calibration + control coupons | +| Stress relief omitted or at wrong temperature | High | Written procedures + operator checklist | +| HIP not planned in lead time | High | Include HIP in the quote and production plan from the start | +| Shrinkage not compensated in CAD | Medium | CAD template with pre-loaded compensation for each process/alloy | +| Supports in fatigue-critical zone | High | Pre-print design review with DfAM checklist | + +--- + +## 6. Pre-Production Checklist (Qualification) + +**To be completed before starting series production:** + +### Machine qualification +- [ ] IQ completed and documented +- [ ] Laser/e-beam calibration within expiry +- [ ] Current preventive maintenance + +### Material qualification +- [ ] Certified powder (supplier CoC) +- [ ] PSD conforming to specification (D50 target, satellites < 10%) +- [ ] N° reuses documented and within qualified limit +- [ ] Pre-dry performed (Ti: 120°C/4h | Al: 70°C/4h | Steels: 80°C/4h) + +### Process qualification (OQ) +- [ ] Golden parameters documented and frozen +- [ ] Mechanical coupons (XY + Z) conforming to specifications +- [ ] Baseline porosity < acceptance limit +- [ ] CT scan of qualification coupon completed + +### Part qualification (PQ / FAI) +- [ ] FAI completed on first series part +- [ ] All dimensions conforming to drawing +- [ ] CoC signed +- [ ] Complete traceability record + +### Qualified post-processing +- [ ] Stress relief: T, t, atmosphere documented +- [ ] HIP: validated cycle for the alloy (T, P, t, autoclave N°) +- [ ] Heat treatment: cycle conforming to AMS/ASTM specification +- [ ] Machining: correct stock allowance, qualified tooling +- [ ] Inspection: calibrated method, certified operator + +--- + +## 7. Useful Certifications for the Service Bureau + +When selecting a service bureau for regulated parts, verify: + +| Certification | Sector | What it guarantees | +|---|---|---| +| **AS9100 Rev D** | Aerospace | Compliant QMS → documented and controlled processes | +| **NADCAP AM** | Aerospace | AM-specific process qualification (machine + material + personnel) | +| **ISO 13485** | Medical | QMS for medical devices; mandatory for CE/FDA implants | +| **ISO 9001** | General | Basic QMS — insufficient for aerospace and medical | +| **ISO 17025** | Laboratory | Accredited metrology calibration and mechanical testing | +| **PED 2014/68/EU** | Pressure equipment | For production of pressure vessels in Europe | +| **ITAR registered** | US Defense | Mandatory for parts subject to US export control | diff --git a/additive-manufacturing/references/cost-model.md b/additive-manufacturing/references/cost-model.md new file mode 100644 index 0000000..1297322 --- /dev/null +++ b/additive-manufacturing/references/cost-model.md @@ -0,0 +1,250 @@ +# Cost and Lead Time Model — Additive Manufacturing + +> Use this file when: +> - The user asks whether AM is cost-effective compared to machining, casting or moulding +> - A cost estimate is needed for an AM part (raw + post-processing) +> - AM must be justified internally or to a customer +> - Choosing between a service bureau and in-house production + +--- + +## 1. AM Cost Structure + +**Common mistake:** comparing the raw print cost against the cost of CNC machining. +The correct comparison is the **total finished part cost**, including all post-processing. + +``` +Total AM part cost = + Printing (machine + gas + energy) + + Material (powder / filament / resin) + + Post-processing (stress relief, HIP, HT, machining, finishing, treatments) + + Inspection (CMM, CT scan, PT) + + Qualification (coupons, documentation, certifications) + + Scrap/rework (to be considered as an amortised cost) +``` + +**Rule of thumb for metal AM with quality requirements:** +- General application: post-processing = 30–50% of total cost +- Fatigue-critical application (HIP + CNC + CT): post-processing = **50–70%** of total cost +- Indicative budget: final cost ≈ **3–5× the raw print cost** for aerospace-quality metal + +--- + +## 2. Decision Tree: Which Process for Which Volume and Application? + +### Metals + +``` +Volume (parts/year) + Geometry + Material + +1–10 parts, complex geometry (undercuts, internal channels, optimised topology) + LPBF is often the only practical option + → Ti-6Al-4V LPBF: €300–2000/part (depending on size and post-processing) + → AlSi10Mg LPBF: €150–800/part + → 316L LPBF: €120–600/part + Alternative: CNC from solid — comparison in section 4 + +1–10 parts, simple geometry (turning, standard milling) + → CNC almost always wins on cost + → AM justified only for very short lead times or geometry that cannot be machined + +10–100 parts, moderate tolerances (±0.3mm acceptable) + → Binder Jetting (316L, 17-4PH): €60–300/part at 50+ parts + → Advantages: no supports, high productivity, as-sintered finish 4–10 µm + → Limitations: 20% shrinkage, not suitable for tight-tolerance geometries without post-machining + +10–100 parts, tight tolerances or special alloys (Ti, superalloys) + → LPBF remains the choice + → Consider in-house vs service bureau (section 6) + +> 500 parts, simple metal + → Investment casting: typically €20–80/part at 500+ (with tooling) + → AM wins only if: geometry cannot be cast, no tooling budget, critical lead time +``` + +### Polymers + +``` +1–50 parts, complex geometry / no critical supports + → SLS PA12: €25–80/part (includes breakout and bead blast) + → MJF PA12: €20–60/part (higher throughput, better finish) + → FDM technical material (PEEK, PC, PA): €10–50/part (simple geometries only) + → SLA/DLP resin: €15–60/part (high accuracy, Ra < 3 µm, non-structural) + +50–500 parts, standard polymer + → SLS/MJF drop to €10–30/part with optimised nesting + → In-house FDM can drop to €3–15/part (excluding machine amortisation) + +> 500–1000 parts, standard geometry + → Injection moulding wins on variable cost (€1–5/part in series) + → Tooling: €5,000–50,000 per mould (recovered over 500–5,000 parts) + → AM still preferable if: high customisation, geometry with undercuts, short run + +> 1000 parts, AM still justified if: + → Per-unit customisation (orthoses, implants, personalised products) + → TPMS / lattice geometry not producible with IM + → Large components that do not fit in a mould +``` + +--- + +## 3. Post-Processing Cost Breakdown + +| Operation | Indicative cost | Time | Notes | +|---|---|---|---| +| **Stress Relief** (furnace) | €50–200/batch | 2–8 hours | Amortised over batch — low cost/part | +| **HIP** | €500–2,000/batch | 4–8 hours + scheduling | €20–200/part in batch; 2–4 week wait from service | +| **Specific Heat Treatment** (aging, solution annealing) | €100–400/batch | 1–24 hours (cycle-dependent) | Often performed together with stress relief for non-critical alloys | +| **CNC Machining** (critical surfaces) | €50–300/hour machine | 1–8 hours/part | Dominant cost for complex geometries | +| **Bead Blast** | €5–20/part | 15–30 min | Almost always included in bureau service | +| **Vibratory Finishing** | €10–40/part/batch | 1–4 hours | Economical, not applicable to delicate features | +| **Electropolishing** | €30–100/part | 30–90 min | Stainless steels and CoCr only | +| **Anodising (Al)** | €5–30/part | 30–60 min | In batch — low cost | +| **CT Scan** | €200–800/part | 2–4 hours | 50µm voxel on 100mm part | +| **CMM (dimensional inspection)** | €100–400/part | 1–3 hours | Before CT if destructive | +| **Dye Penetrant (PT)** | €20–80/part | 1–2 hours | For external surfaces — fast | +| **Tensile coupon (same build plate)** | €30–80/coupon | — | Mandatory for qualification | +| **Documentation / CoC** | €50–200/batch | — | Required for aerospace, medical | + +**Total cost example: Ti-6Al-4V LPBF, 10 parts, aerospace application** +- Print: €400/part × 10 = €4,000 +- Stress Relief + HIP: €1,500/batch ÷ 10 = €150/part +- HT (aging not required for annealed Ti): €0 +- CNC machining of critical surfaces: €200/part × 10 = €2,000 +- CT scan: €400/part × 10 = €4,000 +- CMM: €200/part × 10 = €2,000 +- PT: €40/part × 10 = €400 +- Coupons + documentation: €500/batch +- **Total: ~€140/part raw + ~€1,090/part post-processing = €1,230/part finished** +- Post-processing = 88% of total cost — typical for high quality + +--- + +## 4. Break-Even: AM vs CNC Machining vs Casting + +### AM vs CNC from Solid (Buy-to-Fly Ratio) + +``` +AM is preferable to CNC when: + ✓ Buy-to-fly ratio > 5:1 (e.g. machining Ti from solid → 80% waste) + ✓ CNC setup > 4 hours (geometries with many faces, repositioning) + ✓ Internal geometry unreachable (conformal channels, optimised topology) + ✓ Quantity < 10 parts (no CNC setup amortisation) + +CNC is preferable to AM when: + ✓ Simple geometry (prismatic, rotational) + ✓ Tolerances < ±0.05mm on many surfaces (CNC more accurate as-process) + ✓ Quantity > 50–100 parts of standard geometry + ✓ Material cannot be sintered/printed (hard ceramics, WC-Co) +``` + +**Rule of thumb:** if the CNC quote exceeds €500/part for a complex geometry +with undercuts or internal channels, AM is likely competitive. + +### AM vs Investment Casting + +``` +AM is preferable to investment casting when: + ✓ Quantity < 50–100 parts (tooling cost not recoverable: €5,000–30,000 per mould) + ✓ Geometry too complex to extract the mould + ✓ Lead time: casting requires 8–16 weeks for tooling; AM 1–4 weeks + ✓ Frequent design iterations (each modification ≡ new mould in casting) + +Casting is preferable to AM when: + ✓ Quantity > 200–500 parts/year + ✓ Alloys not available in powder form (some foundry alloys) + ✓ Large parts (> 500mm) where AM exceeds the build volume +``` + +### AM vs Injection Moulding (polymers) + +| Quantity | AM cost (SLS PA12) | IM cost (PA6/PA12) | Winner | +|---|---|---|---| +| 10 parts | €300–600 | €5,000–50,000 (tooling) | AM | +| 100 parts | €2,000–5,000 | €5,000–52,000 (tooling + production) | AM | +| 500 parts | €10,000–20,000 | €6,000–55,000 | Break-even zone | +| 1,000 parts | €20,000–40,000 | €7,000–58,000 | IM starts to win | +| 5,000 parts | €100,000+ | €15,000–70,000 | IM wins clearly | + +Note: IM loses its advantage for geometries with undercuts (add side actions: +€3,000–15,000/mould). + +--- + +## 5. Lead Time Model + +### Polymers (SLS / MJF / FDM) + +| Phase | Duration | +|---|---| +| SLS/MJF print | 8–24 hours (fill-dependent) | +| Breakout + cleaning | 2–4 hours | +| Bead blast / finishing | 2–4 hours | +| **Total SLS/MJF (service bureau)** | **1–3 working days** | +| In-house FDM | 2–12 hours/part | + +### Metals (LPBF — standard application) + +| Phase | Duration | +|---|---| +| Setup + nesting | 2–4 hours | +| LPBF print | 4–24 hours | +| Stress relief (on build plate) | 4–8 hours | +| Build plate removal + supports | 2–8 hours | +| Finishing (bead blast) | 1–2 hours | +| CMM / basic inspection | 1–2 days | +| **Total standard LPBF** | **3–7 working days** | + +### Metals (LPBF — aerospace/biomedical application) + +| Phase | Duration | +|---|---| +| Print + stress relief | 1–2 days | +| HIP (external service) | **2–4 weeks** (scheduling-dominant) | +| Post-HIP heat treatment | 1–3 days | +| CNC machining | 2–5 days | +| CT scan (external) | 1–3 days | +| CMM + PT + documentation | 1–3 days | +| **Total LPBF aerospace quality** | **4–8 weeks** | + +**The bottleneck is almost always HIP** — schedule in advance if lead time is critical. +Alternative: in-house HIP (investment €500,000–2,000,000 for autoclave) or select +a service bureau with integrated HIP to reduce by 1–2 weeks. + +--- + +## 6. Service Bureau vs In-House: When Does Each Make Sense? + +### In-House AM makes sense when: +- Volume > 2 builds/week on a continuous basis +- IP confidentiality is critical (no files sent to third parties) +- Rapid development iterations (prototyping < 24h) +- Need for full control over parameters and qualification + +**In-house entry costs:** +- Professional FDM (Markforged, Bambu X1E): €3,000–15,000 +- SLS/MJF (Formlabs, HP): €30,000–100,000 +- Entry-level LPBF (EOS, SLM, Trumpf): €300,000–800,000 +- Hidden costs: powder ($50–200/kg), inert gas, maintenance, qualified operator + +### Service Bureau makes sense when: +- < 1–2 builds/week (machine not cost-recoverable) +- Special alloys (Scalmalloy, Inconel, CoCr) not available in-house +- Documented qualification required (AS9100, ISO 13485 — the bureau already holds certification) +- Large parts (build volume > in-house machine) +- No appetite for training and maintenance investment + +--- + +## 7. Questions to Ask Before Providing a Cost Estimate + +If the user requests a cost estimate, gather: + +1. **Process and material** (already defined in Phase 2) +2. **Quantity** (1 / 10 / 100 / 1000+) +3. **Part dimensions** (X×Y×Z mm) — directly impacts machine time +4. **Finish requirements** — as-built, bead blast, CNC, electropolish? +5. **Inspection required** — visual, CMM, CT scan? +6. **Certifications required** — AS9100, ISO 13485, simple CoM (Certificate of Manufacture)? +7. **Are there alternatives** (machining, casting) to compare against? + +Without this data, any estimate is too vague to be useful. diff --git a/additive-manufacturing/references/defect-atlas.md b/additive-manufacturing/references/defect-atlas.md new file mode 100644 index 0000000..481f0da --- /dev/null +++ b/additive-manufacturing/references/defect-atlas.md @@ -0,0 +1,192 @@ +# Defect Atlas in Additive Manufacturing + +> Use this file when: +> - A defect is suspected on an already-printed part +> - Designing the inspection/quality plan +> - Preventing defects during the design or setup phase +> - Defining acceptance criteria for the specific application + +--- + +## 1. LPBF / DMLS Defect Catalog + +| Defect | Morphology | Primary cause | Process signature | Primary detection | Fatigue impact (Kf) | +|---|---|---|---|---|---| +| **Lack of Fusion (LOF)** | Irregular, planar, parallel to layer lines | VED too low, insufficient hatch overlap, powder contamination | Visible layers in cross-section, worsened Ra | CT scan (mandatory), metallography | **3–10** — acts as a planar crack | +| **Keyhole Porosity** | Spherical or elongated, at uniform depth | VED too high, metal evaporation with cavity collapse | Concentrated at scan edges, at reversal points | CT scan | **1.5–2.5** | +| **Gas Porosity** | Spherical, < 50 µm, uniform distribution | Gas trapped in powder or moisture, impure shielding gas | Random uniform distribution | CT scan, X-ray, Archimedes density | Mild if < 100 µm; **1.2–1.5** | +| **Solidification Cracking** | Intergranular, along columnar grain boundaries | High solidification range, steep thermal gradient | IN718, high-C steels; high-restraint zones | Metallography, PT | **Severe** — propagates under cycling | +| **Hot Tearing** | Intergranular, similar to solidification cracking | High restraint + high gradient | Thick zones near thin features | PT, metallography | **Severe** | +| **Balling** | Metal spheres on surface, very high Ra | Melt pool oxidation, high surface tension, scan speed too high | Irregular visible surface, Ra > 40 µm | Visual, profilometry | Moderate: high Ra → Kf 1.5–3.0 | +| **Delamination** | Planar crack between layers, on millimeter scale | Insufficient interlayer bonding, contamination, P too low | Separated layers in cross-section | Visual (if superficial), CT scan, UT | **Catastrophic** — equivalent to LOF at macro scale | +| **Residual Stress Cracking** | Transgranular, near supports or build plate | High thermal gradient without stress relief, high restraint | Cracking during/immediately after printing | Visual during build, PT post-removal | Catastrophic if during build | + +### VED (Volumetric Energy Density) Thresholds and LPBF Defects + +VED = P / (v × h × t) [J/mm³] + +| VED | Prevalent defect | Material | +|---|---|---| +| < 40 J/mm³ | LOF | All | +| 40–90 J/mm³ | Optimal window | Alloy-dependent | +| > 90 J/mm³ | Keyhole porosity | Ti, IN, steels | +| > 120 J/mm³ | Evaporation, balling, cracking | All | + +--- + +## 2. Defects by Process and Material + +### LPBF — Prevalence by Alloy + +| Alloy | Primary defects | Secondary defects | Key preventive action | +|---|---|---|---| +| **Ti-6Al-4V** | Keyhole porosity (high VED), residual stress cracking | LOF (low VED) | Validate VED 55–75 J/mm³; mandatory stress relief on build plate | +| **AlSi10Mg** | Gas porosity (powder moisture), balling (oxidation) | Warping/delamination without enclosure | Pre-dry powder 70°C/4h; verify O₂ < 500 ppm in chamber | +| **316L** | LOF (most common defect) | Gas porosity (low impact) | Optimize hatch overlap (30–40%) | +| **17-4PH** | LOF, hot cracking (rare) | Residual stress cracking if no stress relief | Stress relief 325°C before removing from plate | +| **IN718** | Solidification cracking in high-restraint zones | LOF at scan edges | Island scan strategy; geometries without abrupt restraint | +| **IN625** | Gas porosity, LOF | Solidification cracking (rare) | Validate with coupons before production | +| **CoCr** | Gas porosity, balling | — | Strict oxygen control; moderate scan speed | + +### SLS / MJF — Polymers + +| Defect | Cause | Detection | Impact | +|---|---|---|---| +| **Layer delamination** | Cold chamber (ΔT > 5°C from window), underheating | Visual, cross-section | Severe structural | +| **Surface porosity / graininess** | Degraded recycled powder (increased MFR) | Profilometry, visual | Worsened Ra | +| **Warping / distortion** | Non-uniform cooling, part too thin in Z | CMM, visual post-removal | Out of tolerance | +| **Neck failure (filament necking)** | Over-recycled powder → reduced coalescence | Cross-section, density | Reduced mechanical properties | + +**SLS recycled powder:** after 5–8 cycles, PA12 shows increased MFR (+20–40%) and reduced +elongation at break (−15–30%). Monitor with MFR testing for critical lots. + +### FDM / FFF + +| Defect | Cause | Detection | +|---|---|---| +| **Layer delamination** | Low extrusion temperature, high speed, excessive cooling on layer | Cross-section, manual bending | +| **Void from under-extrusion** | Excessive retraction, partial nozzle clog | Visual (grid visible), cross-section | +| **Warping** | Poor bed adhesion, no enclosure for ABS/PA | Visual during printing | +| **Stringing / blobs** | Uncalibrated retraction | Visual surface | +| **Delamination in Z from moisture** | Wet filament (PA, PC) → bubbles in extrusion | Audio crackling + surface bubbles | + +### Binder Jetting — Post-Sintering + +| Defect | Cause | Criticality | +|---|---|---| +| **Non-uniform shrinkage** | Green density variations, non-uniform sintering in thick/thin sections | High — tolerances missed | +| **Slumping** | Gravity during sintering without support | High for long horizontal features | +| **Cracking during debinding** | Too-fast temperature ramp, incompatible binder | Part rejection | +| **Incomplete pore closure** | Sintering temperature too low, insufficient time | Residual porosity > 2% | + +--- + +## 3. Acceptance Criteria by Application + +### AM Metals (LPBF/EBM) + +| Application | Max total porosity | LOF defects | Max spherical defects | Required inspection | +|---|---|---|---|---| +| **Non-structural prototype** | < 2% | Accepted | — | Visual + CMM | +| **Static structural** | < 0.5% | < 0.5mm in non-critical zone | < 0.3mm | X-ray or UT + CMM | +| **Fatigue-critical** | < 0.05% (post-HIP) | **None** in load path | < 0.1mm | Mandatory CT scan + CMM + PT | +| **Pressure vessel** | < 0.1% | **None** | < 0.15mm | CT scan + hydrostatic + CMM | +| **Biomedical implant** | < 0.05% (post-HIP) | **None** | < 0.1mm | CT scan + CMM + hardness map | +| **Aerospace (AS9100)** | < 0.05% | **None** in critical zone | < 0.1mm | CT scan (100%) + FPI + coupon same plate | + +**Definition of "critical zone":** any zone subject to σ_max > 0.3 × UTS, or with Kt > 1.5, +or within 2mm of a maximum stress surface. + +### LOF: Absolute Rule + +**An LOF defect identified by CT scan in a load zone = REJECT THE PART.** +No waivers exist for fatigue-critical applications. +Reason: LOF is planar and parallel to the build layer → acts as a pre-existing crack (Kf 3–10). +HIP does not close LOF defects — HIP only closes spherical porosity (gas, keyhole). + +--- + +## 4. Prevention Strategies + +### Prevention for LOF + +- Validate VED with coupons before production (optimal VED: 50–80 J/mm³ for most alloys) +- Hatch overlap 30–40% (not < 20%) +- Verify powder flowability before each lot (Hausner ratio < 1.25) +- Wet powder → mandatory pre-dry (Ti: 120°C/4h; Al: 70°C/4h; steels: 80°C/4h) + +### Prevention for Keyhole Porosity + +- Do not exceed validated VED_max for the alloy (document the window) +- Reduce P or increase v at platform edges (boundary compensation) +- Monitor in-process with melt pool monitoring if available + +### Prevention for Gas Porosity + +- Systematic powder pre-drying +- Verify gas purity: O₂ < 100 ppm for Ti, < 500 ppm for Al and steels +- Verify powder morphology: satellite > 10% → increased risk of trapped gas + +### Prevention for Residual Stress Cracking + +- Stress relief on build plate BEFORE removal (see `references/post-processing.md`) +- Island scan strategy (island scanning, 5×5mm or 7×7mm) to reduce peak gradient +- Scan angle rotation 67°/layer +- For IN718/IN625: avoid geometries with high restraint (thicknesses changing abruptly by factor > 5×) + +--- + +## 5. Inspection Plan Selection Logic + +``` +Define the criticality level of the component: + +Visual prototype / non-structural + → Visual + CMM (dimensional) + +Structural, static loads, non-life-critical + → CMM + hardness after HT + X-ray spot check + → Tensile coupon if first lot (same build plate) + +Structural, cyclic loads (HCF) + → Industrial CT scan (voxel ≤ 50 µm for parts < 100mm) + → CMM of critical surfaces + → Dye penetrant (PT) external surfaces + → Tensile + fatigue coupons same build plate (process qualification) + +Pressure vessel / aerospace / biomedical implant + → CT scan 100% of parts (not sampling) + → FPI (Fluorescent Penetrant Inspection) — ASTM E1417 Level 2 + → UT (Ultrasonic Testing) if geometry allows + → Full CMM + → Metallographic analysis on coupons + → Hardness mapping post-HT + → Documented traceability: powder lot + build file + machine ID + operator +``` + +### Recommended CT Scan Parameters + +| Part size | Recommended voxel size | Minimum detectable defect | +|---|---|---| +| < 50 mm | ≤ 25 µm | LOF > 0.05mm, pores > 0.05mm | +| 50–150 mm | 50–75 µm | LOF > 0.15mm, pores > 0.15mm | +| 150–400 mm | 100–150 µm | LOF > 0.3mm, pores > 0.3mm | +| > 400 mm | Consider UT + X-ray | CT may not be sufficient | + +--- + +## 6. Defects: What HIP Can and Cannot Fix + +| Defect type | Does HIP close it? | Notes | +|---|---|---| +| Spherical gas porosity (< 100 µm) | **YES** | Isostatic pressure closes the spheres | +| Keyhole porosity (spherical/elongated) | **YES** (partially if < 200 µm) | Highly elongated geometries resist | +| Lack of Fusion (LOF) | **NO** | Planar and oxidized → does not close | +| Solidification cracking | **NO** | Oxidized, intergranular → does not close | +| Hot tearing | **NO** | See above | +| Macro delamination | **NO** | Too large in scale | +| Residual stress | YES (drastically reduced) | σ_res → nearly zero after HIP | + +**Operational conclusion:** HIP is essential for closing spherical porosity and reducing residual stresses. +It is not a solution for planar defects (LOF, cracking). Post-HIP CT scan is mandatory +to confirm porosity closure. diff --git a/additive-manufacturing/references/dfam-guidelines.md b/additive-manufacturing/references/dfam-guidelines.md new file mode 100644 index 0000000..834df22 --- /dev/null +++ b/additive-manufacturing/references/dfam-guidelines.md @@ -0,0 +1,277 @@ +# DfAM Guidelines — Design for Additive Manufacturing + +## Universal Rules + +### Part Orientation +Orientation is the most impactful decision in AM. Consider: +1. **Mechanical strength:** The XY plane is always stronger than the Z direction (layer-by-layer build) + - FDM: Z/XY difference can be 40–60% for UTS + - LPBF: anisotropy ~10–20% + - SLS/MJF: nearly isotropic (<10% difference) +2. **Surface finish:** Surfaces parallel to the build plane (top surface) are smoother +3. **Supports:** Minimize by orienting critical surfaces upward or reducing overhangs +4. **Distortion:** Prevent warping by orienting long axes in XY, not in Z + +### Overhangs and Support Angles +| Process | Limit angle without support | Notes | +|---|---|---| +| FDM | 45° from vertical | Depends on material and cooling | +| SLA/DLP | 45° from vertical | Supports also required for floating islands | +| SLS/MJF | No structural limit | Powder acts as support | +| LPBF | 45° — below requires support | Metal supports are difficult to remove | +| EBM | ~35° | Better metallostatic behaviour than LPBF | + +### Minimum Wall Thicknesses +| Process | Min. wall (mm) | Min. feature (mm) | +|---|---|---| +| FDM (0.4mm nozzle) | 0.8–1.2 | 0.4 (XY planes only) | +| FDM (0.6mm nozzle) | 1.2–1.6 | 0.6 | +| SLA/DLP | 0.2–0.5 | 0.2 | +| SLS | 0.7–1.0 | 0.6 | +| MJF | 0.5–0.8 | 0.5 | +| LPBF | 0.3–0.4 | 0.2 | +| Binder Jetting | 1.0–1.5 | 0.8 | + +--- + +## Guidelines for Specific Features + +### Holes +- **Vertical holes (Z-axis, FDM):** Accurate, tolerance ±0.1–0.2mm +- **Horizontal holes (FDM):** + - ≤ ø5mm: printable without support (deform into ellipse, ~5–10%) + - > ø5mm: require support or teardrop profile +- **Teardrop profile:** Modifies the upper cross-section to a point — eliminates supports for horizontal holes +- **Post-drilling:** For tight tolerances (H7/H8), always plan for reaming/drilling post-AM +- **Threads:** M3+ printable in SLS/LPBF; FDM → metal heat-set inserts are far more reliable + +### Radii and Fillets +- **Internal fillets:** ≥ 0.5mm (SLA), ≥ 1.0mm (FDM), ≥ 0.5mm (SLS/LPBF) +- **Sharp edges:** Avoid for AM metal parts — stress concentrators + process difficulty +- **Rule of thumb:** R_internal ≥ wall thickness + +### Internal Cavities and Channels +- **Lattice geometries:** SLS, MJF, LPBF only — FDM requires planning for internal supports +- **Conformal cooling channels (tooling):** Ideal application for LPBF + - Minimum channel diameter: ≥ ø1.5mm (LPBF), ≥ ø3mm (Binder Jetting post-sinter) + - Avoid horizontal channels > ø8mm without teardrop profile (LPBF) +- **Powder entrapment (SLS/MJF):** Provide powder escape holes ≥ ø5mm for closed cavities + +### Text and Embossing +- **Engraved/embossed text:** Min. height 1.5mm (FDM/SLS), 0.5mm (SLA) +- **Orientation:** Always on XY plane for optimal readability + +--- + +## Anisotropy and Directional Orientation + +Anisotropy is the most overlooked property in AM: the part is not isotropic. Strength, fatigue +and ductility depend on the direction relative to the XY build plane. + +### Anisotropy factors by process (UTS_Z / UTS_XY) + +| Process / Material | Z/XY factor (as-built) | Post-HIP | Note | +|---|---|---|---| +| **FDM PLA/ABS/PETG** | 0.40–0.60 | n/a | Layer bonding is the weak point — avoid loading in Z if possible | +| **FDM PA12/PC** | 0.50–0.65 | n/a | Heated chamber improves but does not eliminate anisotropy | +| **FDM PEEK** | 0.60–0.75 | n/a | Heated chamber ≥ 90°C improves significantly | +| **SLS PA12** | 0.90–1.00 | n/a | Nearly isotropic — main advantage over FDM | +| **MJF PA12** | 0.88–0.98 | n/a | Slightly worse than SLS on top surfaces | +| **LPBF Ti-6Al-4V** | 0.80–0.92 | 0.95–1.00 | HIP practically eliminates anisotropy | +| **LPBF AlSi10Mg** | 0.70–0.85 | 0.90–0.98 | More anisotropic than Ti; HIP important | +| **LPBF 316L** | 0.80–0.95 | 0.95–1.00 | Ductile → anisotropy less critical | +| **LPBF 17-4PH** | 0.75–0.90 | n.d. | Depends on post-HIP aging | +| **LPBF IN718** | 0.75–0.88 | n.d. | | +| **EBM Ti-6Al-4V** | 0.90–0.98 | — | Preheated chamber → greatly reduced anisotropy | + +### Orientation rules for known loads + +``` +Known primary load → orient so that σ_max lies IN THE XY PLANE + + Axial tension on cylindrical rod: + Rod axis → horizontal (in XY plane) + Cross-section → parallel to XY plane + + Bending on beam: + Neutral axis → in XY plane + Maximum tension and compression fibres → in XY plane + + Torsion on shaft: + Axis of rotation → in XY plane + Maximum shear stresses act on XY cross-sections + + Biaxial load (plate): + Plate → parallel to XY plane + Both load directions in XY → optimal +``` + +### When optimal orientation is not possible + +1. Complex geometry → Z-direction inevitably loaded +2. Action: for metals, **HIP mandatory** → reduces anisotropy to < 5% +3. For polymers (FDM): change process → SLS PA12 (anisotropy < 10%) +4. For fatigue in Z direction: see `references/fatigue-design.md` section 2C for knockdown factors + +### Fatigue anisotropy — quick summary + +| Scenario | Z/XY fatigue factor as-built | With HIP | +|---|---|---| +| LPBF Ti-6Al-4V | 0.60–0.75 | 0.92–0.98 | +| LPBF AlSi10Mg | 0.55–0.70 | 0.85–0.95 | +| FDM PLA (R=0.1) | 0.25–0.40 | n/a | +| SLS PA12 | 0.88–1.00 | n/a | + +**Absolute rule:** do not use FDM for fatigue-critical components loaded in the Z direction. + +--- + +## Tolerance Stack-Up in AM + +Tolerance stack-up in AM is managed differently from conventional manufacturing: each process introduces +systematic errors (shrinkage, warping) that add to process tolerances. + +### Typical dimensional errors by process + +| Process | Systematic error | Random error (±) | Main cause | +|---|---|---|---| +| **FDM** | −0.1 to −0.5% (shrinkage) | ±0.3 mm | Warping, layer shift, thermal | +| **SLA/DLP** | −0.1 to −0.3% | ±0.15 mm | Curing shrinkage, peel force | +| **SLS PA12** | −3.0 to −4.0% XY, −3.5 to −4.5% Z | ±0.3 mm | Sintering shrinkage | +| **MJF PA12** | −2.5 to −3.5% | ±0.25 mm | Similar to SLS | +| **LPBF** | −0.2 to −0.5% | ±0.1 mm | Solidification shrinkage | +| **EBM** | −0.2 to −0.4% | ±0.2 mm | | +| **Binder Jetting** | −18 to −22% linear | ±0.4 mm | Sintering shrinkage | + +### Stack-up on multi-part AM assemblies + +When multiple AM parts are assembled, errors accumulate in worst-case or RSS: + +``` +Minimum clearance on assembly = Nominal clearance − Σ(component tolerances) + +Example: LPBF flange (±0.1mm) + gasket + LPBF cover (±0.1mm) + Total clearance required for guaranteed fit: 0.2mm + safety margin + +Rule of thumb: for functional fit on AM-AM assembly → clearance ≥ 0.5mm (LPBF) + for AM + machined assembly → clearance ≥ 0.2mm (LPBF vs CNC) +``` + +### Critical surfaces: stock allowance strategy + +For surfaces requiring H7/h6 tolerances, precision fits, bearing seats: + +``` +1. Design in CAD with stock allowance: +0.3mm on all surfaces to be machined +2. Print with stock allowance +3. Stress relief + HIP (if planned) — HIP modifies dimensions by ±0.05–0.2mm +4. Post-machining to nominal CAD dimensions (CNC, reaming, grinding) +5. Final CMM inspection + +DO NOT attempt to achieve H7 tolerances as-built in AM — it is not reliable. +``` + +### Internal threads: compensation standards + +| Process | Recommended approach | +|---|---| +| FDM, SLS, MJF | Print undersized (−0.3mm) + tap post-print for M6+ threads | +| LPBF | Print hole +0.3–0.5mm undersized + tap or ream | +| M3 and smaller threads (FDM) | Heat-set inserts (e.g. Ruthex, CNC Kitchen) — more reliable | +| M3 and smaller threads (SLS/LPBF) | Printable if parameters are optimised, verify with first part | + +--- + +## Topology Optimization and Consolidation + +### When to apply topology optimization +- Structural parts in metal AM where weight is critical +- Brackets, supports, aero/automotive components +- Tools: nTopology, Altair Inspire, Ansys Discovery, SolidWorks Simulation, Fusion 360 Generative Design + +### Guidelines for optimised topology +- Enforce minimum thickness = 2× minimum thickness of the process +- Set overhang angle as a constraint in the solver +- Final smoothing mandatory (optimised meshes create stress concentrations) +- Verify manufacturability with AM-aware tool in the solver + +### Component Consolidation (Assembly Consolidation) +**Typical opportunities:** +- Bolted joints → single-piece geometries in SLS or metal AM +- Hydraulic/pneumatic ducting with fittings → monolithic body with internal channels +- Hollow structures (sandwich) → integrated lattice + +**Decision rule:** If assembly cost + tolerances + gaskets > AM cost of the consolidated part → consolidate + +--- + +## Tolerances and Compensations + +### Shrinkage compensations (to be applied in CAD or in print software) +| Process | Typical shrinkage | +|---|---| +| FDM | 0.1–0.5% (material-dependent) | +| SLS PA12 | 3.0–4.0% XY, 3.5–4.5% Z | +| SLS PA11 | 2.5–3.5% | +| LPBF AlSi10Mg | 0.3–0.5% | +| LPBF Ti-6Al-4V | 0.2–0.4% | +| LPBF 316L | 0.2–0.3% | +| Binder Jetting (metals) | 18–22% (sintering) | +| SLA/DLP resins | 0.1–0.3% | + +### Fits and Mating +- **Clearance fit (moving):** Add 0.3–0.5mm per side (FDM), 0.15–0.25mm (SLS), 0.05–0.1mm (LPBF after machining) +- **Press fit / interference:** Prefer post-machining for H7/p6 or tighter tolerances +- **Snap fit:** Design with SLS PA12 or TPU; avoid PLA (brittle under cyclic fatigue) + +--- + +## Post-Processing Decision Tree + +``` +Printed part +├── Metals (LPBF/EBM) +│ ├── Stress relief → ALWAYS (before support removal) +│ ├── HIP → if critical application or biomedical +│ ├── Heat treatment → if required (e.g. 17-4PH H900, IN718 aging) +│ ├── Support removal → manual + machining +│ ├── Surface finishing → shot peening, vibratory, EDM, polish +│ └── Inspection → CT scan for critical parts, UT, HV mapping +│ +├── Metals (Binder Jetting) +│ ├── Debinding (solvent/catalytic/thermal) +│ ├── Sintering (specialised furnace) +│ └── HIP optional → if critical +│ +├── SLS/MJF Polymer +│ ├── Blasting (glass/sand) → standard for uniform finish +│ ├── Dyeing → uniform colouring (black or colours) +│ ├── Vibratory finishing → improved Ra +│ ├── SLS coating (e.g. Ceracoat) → waterproofing +│ └── Epoxy impregnation → alternative waterproofing +│ +├── SLA/DLP Resin +│ ├── IPA wash (10–15 min) → MANDATORY +│ ├── UV post-curing → MANDATORY (900–1200 mJ/cm²) +│ └── Support removal → before or after curing (resin-dependent) +│ +└── FDM + ├── Support removal (mechanical or soluble if dual extrusion) + ├── Sanding + primer → for painting + ├── Acetone smoothing → ABS only (changes dimensions ~0.1–0.3mm) + └── Heat-set inserts → for reliable threads (M3+) +``` + +--- + +## Pre-print Checklist + +- [ ] Minimum thicknesses met for the chosen process? +- [ ] Overhang angles within limits (or supports planned)? +- [ ] Horizontal holes: teardrop or support? +- [ ] Closed cavities with powder escape holes (SLS/MJF)? +- [ ] Shrinkage compensated in CAD? +- [ ] Internal fillets ≥ process minimum? +- [ ] Orientation optimised (strength + finish)? +- [ ] Post-processing defined and included in cost? +- [ ] Critical tolerances reserved for post-machining? diff --git a/additive-manufacturing/references/fatigue-design.md b/additive-manufacturing/references/fatigue-design.md new file mode 100644 index 0000000..2a1a969 --- /dev/null +++ b/additive-manufacturing/references/fatigue-design.md @@ -0,0 +1,261 @@ +# Fatigue Design for Additive Manufacturing + +> Use this file whenever the component is subject to cyclic loads, vibrations, +> repeated impacts, or when the application is fatigue-critical (aerospace, biomedical, +> structural automotive, pressure vessel, moving mechanisms). +> +> **Static UTS strength alone is not sufficient to evaluate an AM part under cyclic loading.** + +--- + +## 1. When Fatigue Governs + +``` +Is the component subject to cyclic loads? +│ +├── NO → static design with FS ≥ 2.0 on UTS. Done. +│ +└── YES → how many cycles? + ├── N < 10^3 cycles (extreme LCF) + │ └── Use UTS with FS ≥ 1.5–2.0. Verify plastic deformation. + ├── 10^3 < N < 10^4 cycles (LCF) + │ └── Use σ_LCF ≈ 0.7–0.9 × UTS. FS ≥ 1.5. + └── N > 10^4 cycles (HCF — the critical case) + └── Use S-N data (section 3) + knockdown factors (section 2). + The fatigue limit may be 30–60% of the UTS value. +``` + +**Questions to ask the designer before proceeding:** +- Expected total cycles (10^5, 10^6, 10^7)? +- Stress ratio R = σ_min / σ_max (typical: R = 0.1 pulsating, R = -1 fully reversed)? +- Will the fatigue-critical surface be machined or remain as-built? +- Is HIP planned? + +--- + +## 2. Knockdown Factors for AM + +### 2A — Kf from Surface Roughness (Ra) + +The as-built roughness of AM parts is much higher than forged — surface valleys +act as notches and drastically reduce fatigue life. + +| Ra (µm) | Typical condition | Kf (Ti-6Al-4V) | Kf (AM steels) | Kf (AlSi10Mg) | +|---|---|---|---|---| +| 20–35 | LPBF as-built (side) | 1.8–2.5 | 1.6–2.2 | 1.5–2.0 | +| 8–20 | LPBF as-built (top XY) | 1.4–1.8 | 1.3–1.7 | 1.3–1.6 | +| 6–12 | Bead blast post LPBF | 1.3–1.6 | 1.2–1.5 | 1.2–1.4 | +| 3–6 | Vibratory finishing | 1.1–1.3 | 1.1–1.3 | 1.1–1.2 | +| 0.8–3 | Electropolishing / SLA | 1.05–1.15 | 1.0–1.1 | 1.0–1.1 | +| 0.4–0.8 | CNC machining | 1.0–1.05 | 1.0–1.05 | 1.0–1.05 | +| < 0.4 | Grinding / lapping | 1.0 | 1.0 | 1.0 | + +**Effective fatigue limit = baseline S-N / Kf** + +Example: Ti-6Al-4V LPBF as-built side (Ra 20µm, Kf 2.2): +effective fatigue limit = 260 MPa / 2.2 = **118 MPa** — vs. 620 MPa for forged. + +### 2B — Knockdown from Porosity + +For every 0.1% of pore volume (measured by CT scan or Archimedes): +- Fatigue life reduction: **−5 to −8%** (LPBF metals, Ti and Al) +- Acceptance thresholds: + - Porosity < 0.05%: acceptable for fatigue with HIP + - Porosity 0.05–0.5%: acceptable only for non-fatigue-critical applications + - Porosity > 0.5%: **not suitable for cyclic loading** — mandatory HIP required or reject + +HIP closes spherical porosity (gas, keyhole) → reduces porosity from typical 0.3–0.5% to < 0.05%. +HIP does NOT close planar LOF (lack of fusion) — these remain as cracks. + +### 2C — Directional Anisotropy (Fatigue) + +| Process/Material | Fatigue Z/XY as-built | Fatigue Z/XY post-HIP | +|---|---|---| +| LPBF Ti-6Al-4V | 0.60–0.75 | 0.92–0.98 | +| LPBF AlSi10Mg | 0.55–0.70 | 0.85–0.95 | +| LPBF 316L | 0.70–0.85 | 0.92–0.98 | +| LPBF 17-4PH | 0.70–0.80 | n.d. | +| LPBF IN718 | 0.65–0.80 | n.d. | +| SLS PA12 | 0.90–1.00 | n/a | +| FDM PA12 (0°/90°) | 0.35–0.55 | n/a | + +**Rule:** orient the primary cyclic loading plane (σ_max) in the XY direction. +In fatigue-critical zones, the load must be **perpendicular** to the layer lines, not parallel. + +### 2D — Effect of HIP on Fatigue + +HIP (Hot Isostatic Pressing) is the most effective treatment for improving fatigue life in AM metals: +- Closes spherical porosity → eliminates the primary internal crack initiator +- Reduces Z/XY anisotropy → from 0.6–0.75 to 0.92–0.98 for Ti +- Modifies microstructure → improves ductility but may reduce UTS if not followed by aging + +Fatigue life improvement post-HIP (relative to as-built): +- Ti-6Al-4V LPBF: **+50–100%** in terms of cycles to failure +- AlSi10Mg LPBF: **+30–60%** + +--- + +## 3. Baseline S-N Data (R = 0.1, HCF at 10^7 cycles) + +> These are representative ranges from the literature. Inter-lot variability ±15–20%. +> For critical applications: require testing on coupons from the same lot/build plate. + +### LPBF Metals + +| Material / Condition | Fatigue limit @ 10^7 cycles (MPa) | Notes | +|---|---|---| +| **Ti-6Al-4V LPBF as-built** | 200–320 | High scatter; Ra 15–25 µm side | +| **Ti-6Al-4V LPBF HIP + machined** | 400–550 | Close to forged | +| **Ti-6Al-4V forged (reference)** | 620–700 | Benchmark | +| **AlSi10Mg LPBF as-built** | 90–130 | Very sensitive to orientation | +| **AlSi10Mg LPBF HIP + T6-equiv.** | 120–170 | +30% vs. as-built | +| **AlSi10Mg forged 6061-T6 (ref.)** | 95–110 | AM comparable with HIP | +| **316L LPBF as-built** | 180–220 | Good relative to forged | +| **316L LPBF HIP** | 220–260 | | +| **316L forged (reference)** | 200–240 | AM as-built nearly comparable | +| **17-4PH LPBF H900** | 350–430 | Only after mandatory aging | +| **17-4PH forged H900 (ref.)** | 400–500 | | +| **IN625 LPBF** | 280–380 | | +| **IN718 LPBF (full HT)** | 350–450 | Mandatory double aging | +| **CoCr LPBF (biomedical)** | 500–600 | Excellent for implants | + +### AM Polymers + +| Material / Condition | Fatigue limit @ 10^6 cycles (MPa) | Notes | +|---|---|---| +| **PA12 SLS** | 18–25 | R = 0.1; sensitive to moisture | +| **PA12 FDM (0°)** | 12–18 | Layer bonding is the weak link | +| **PETG FDM** | 10–16 | | +| **ABS FDM** | 8–14 | Highly anisotropic in Z | +| **PEEK FDM** | 25–40 | Only with heated chamber, correct orientation | + +### Mean Stress Correction (Goodman) + +For R ≠ 0.1, correct using the modified Goodman relation: +σ_a / σ_fl + σ_m / UTS = 1 + +Where: σ_a = alternating amplitude, σ_m = mean stress, σ_fl = fatigue limit (from table). + +--- + +## 4. Shot Peening and Surface Treatments + +### Shot peening benefit (quantitative) + +Shot peening introduces compressive residual stresses at the surface that oppose +the propagation of fatigue cracks. + +| Material | Fatigue limit improvement | Introduced σ_residual | +|---|---|---| +| Ti-6Al-4V AM | +20–40% | −400 to −700 MPa | +| AlSi10Mg AM | +15–25% | −200 to −400 MPa | +| 316L / 17-4PH AM | +15–30% | −300 to −500 MPa | +| PA12 SLS | not applicable | — | + +Reference standard: **AMS 2430** (aerospace); Almen intensity A8–A12 for Ti. + +**Deep Rolling** (for cylindrical features: shafts, pins, fillets): +- σ_residual: −600 to −900 MPa (deeper than shot peening) +- Fatigue improvement: +30–50% +- Requires machine tool access; not applicable to complex geometries + +### Correct Sequence (DO NOT deviate) + +``` +AM Print + ↓ +Stress Relief (mandatory before removing from build plate for metals) + ↓ +HIP (if fatigue-critical) + ↓ +Specific Heat Treatment (aging 17-4PH, double aging IN718, etc.) + ↓ +Support Removal + ↓ +CNC Machining of critical surfaces (after HIP — HIP modifies dimensions ±0.05–0.2%) + ↓ +Shot Peening (ALWAYS AFTER all heat treatments) + ↓ +Final Inspection (CT scan + CMM) +``` + +**CRITICAL:** Do not perform shot peening before HIP — HIP relaxes the compressive stresses +introduced by shot peening, negating its benefit. + +--- + +## 5. DfAM Rules for Fatigue + +1. **Fillets in load paths:** minimum radius ≥ 2× thickness of the adjacent wall. + Sharp fillets (R < 0.5mm) → Kt 3–5 → guaranteed crack initiators. + +2. **Build orientation:** primary cyclic load axis → XY plane. + If not possible (complex geometry): specify HIP as mandatory. + +3. **As-built surfaces in critical zones:** not acceptable for N > 10^6 cycles without treatment. + Minimum: bead blast (Ra 6–12 µm, Kf still 1.3–1.6). Optimal: machining or shot peening. + +4. **Lattice in fatigue-critical applications:** + - Add solid skin ≥ 1.5mm on all surfaces exposed to cyclic loading. + - The surface of an as-built lattice has Ra 30–80 µm → Kf 2–4 → drastically reduced life. + - For fatigue-critical lattice: TPMS Gyroid + HIP + machined outer skin. + +5. **Holes in cyclic tension zones:** + - Kt of a circular hole in a plate = 3. In AM, the as-built hole edge has Ra 15–40 µm → effective Kf 4–6. + - Solution: ream/mill the hole after printing (even with a manual reamer). + +6. **Support attachment marks (residual marks):** + - Support attachment points leave craters/bumps Ra 25–100 µm → critical initiators. + - Do not leave support marks on fatigue-critical surfaces. Design orientation to avoid this. + +--- + +## 6. Red Lines — Mandatory Stop + +These scenarios require corrective action before proceeding. +Ignoring them is not acceptable — communicate them explicitly to the designer. + +| Condition | Required action | +|---|---| +| Ra as-built > 6 µm + N > 10^6 cycles on metal AM | Mandatory: machining or shot peening. Do not proceed as-built. | +| CT scan porosity > 0.5% + fatigue-critical application | Mandatory: HIP. If unavailable, reject the part. | +| LOF defects detected by CT scan in load zone | Reject. LOF acts as a crack (Kf 3–10). HIP does not close LOF. | +| FDM polymer + N > 10^5 cycles in Z direction | Process not suitable. Switch to SLS PA12 or redesign orientation. | +| As-built lattice without skin + cyclic fatigue | Redesign: add skin ≥ 1.5mm or exclude lattice from critical zone. | +| Shot peening planned before HIP | Reverse the sequence. Shot peening must be the last thermal/mechanical step. | + +--- + +## 7. Fatigue Evaluation Plan (Output for the Designer) + +When fatigue is identified as relevant, include in the final output: + +``` +## Fatigue Evaluation + +**Regime:** HCF (N = __ cycles, R = __) + +**Material/Process:** __ LPBF / condition: as-built / HIP / machined + +**Baseline fatigue limit:** __ MPa (from S-N table, section 3) + +**Applied knockdown factors:** +- Kf from Ra (__ µm, __ condition): __ → effective limit = __ MPa +- Porosity (CT scan planned? __): estimated knockdown __% +- Anisotropy (load in __ direction): Z/XY factor = __ + +**Estimated effective fatigue limit:** __ MPa + +**Comparison with applied load (σ_max = __ MPa, σ_a = __ MPa):** +Fatigue FS = __ [target ≥ 1.5 for standard applications, ≥ 2.0 for safety-critical] + +**Actions required to reach target FS:** +□ Mandatory HIP +□ Machining of critical surfaces (Ra target ≤ __ µm) +□ Shot peening (AMS 2430, Almen __) +□ CT scan post-HIP (acceptance: no LOF, porosity < 0.05%) +□ Fatigue coupons same build plate (required for qualification) + +**Red lines:** +[List any stop conditions identified] +``` diff --git a/additive-manufacturing/references/lattice-infill.md b/additive-manufacturing/references/lattice-infill.md new file mode 100644 index 0000000..768dcbe --- /dev/null +++ b/additive-manufacturing/references/lattice-infill.md @@ -0,0 +1,122 @@ +# Lattice & Infill — Technical Guide + +## 1. FDM/FFF — Infill Strategies + +### When to use partial infill +- Visual / ergonomic prototypes → 10–20% +- Functional parts under moderate load → 30–60% +- Critical structural parts → 80–100% or solid walls (no infill) +- Flexible parts (TPU) → 15–30% for cushioning effect + +### Infill patterns and their mechanics + +| Pattern | Strength | Weight | Print speed | Ideal use | +|---|---|---|---|---| +| **Gyroid** | Excellent (isotropic) | Low | Medium | Functional parts, heat sinks, flexible parts | +| **Honeycomb** | Good in XY plane | Medium | Medium | Panels, flat pieces, packaging | +| **Cubic / 3D Honeycomb** | Good (3D) | Medium | Medium | General purpose, good strength/weight ratio | +| **Lightning** | Poor | Minimum | High | Top surface support only | +| **Lines / Rectilinear** | Anisotropic | Low | High | Quick prototypes, low-cost filler | +| **Grid** | Moderate | Medium | High | Rapid prototyping | +| **Triangles** | Good in plane | Medium | Medium | Flat planes with distributed load | +| **Concentric** | Excellent for flexible | Low | High | TPU, gaskets, cushioning | +| **Cross 3D** | Excellent for flexible | Low | Low | Elastomers, grip, shock absorbers | + +### Critical FDM infill parameters +- **Number of perimeters/shells:** The shell contribution to strength is >> infill. Increase shells before increasing infill %. Practical rule: ≥4 perimeters for structural parts +- **Top/bottom layers:** ≥4–6 solid layers for mechanically loaded surfaces +- **Infill angle:** Rotate 45° relative to the main load direction for better distribution +- **Infill-perimeter overlap:** 20–30% — critical for adhesion between infill and shell + +### Density → mechanical properties relationship (PA12, FDM) +| Infill % | Relative Rm | Relative stiffness | +|---|---|---| +| 20% | ~35% | ~25% | +| 40% | ~55% | ~45% | +| 60% | ~70% | ~65% | +| 80% | ~85% | ~82% | +| 100% | 100% | 100% | +*(Indicative values — depend on pattern, material, orientation)* + +--- + +## 2. Metal AM — Lattice Structures + +### Main typologies + +#### Strut-based (truss) +- **BCC (Body-Centered Cubic):** Excellent for multi-axial loads, good stiffness +- **FCC (Face-Centered Cubic):** Better for shear loads +- **Octet truss:** High specific stiffness, aerospace structural applications +- **Kelvin cell:** Optimal for energy absorption applications (crash, impact) +- **Diamond lattice:** Good isotropic mechanical properties, biomedical applications (osseointegration) + +#### TPMS (Triply Periodic Minimal Surface) — zero mean curvature surfaces +- **Gyroid (Schoen G):** The most widely used — excellent for heat exchangers, biomedical scaffolds, pressure + - Isotropic mechanical properties + - No stress concentration nodes + - Excellent for fluid flow (interconnected channels) +- **Schwartz P (Primitive):** High stiffness, suitable for compressive loads +- **Schwartz D (Diamond):** Similar to Gyroid, slightly stiffer +- **IWP:** High specific surface area — heat exchangers + +#### Sheet-TPMS vs Solid-TPMS +- **Solid (solid fill):** Better mechanical properties, suitable for load-bearing structures +- **Sheet (shell):** Superior for heat transfer and fluid-dynamic permeability + +### Lattice design parameters (metal AM) + +| Parameter | Typical range | Notes | +|---|---|---| +| Relative density | 15–40% | <15%: risk of warping/collapse during printing; >40%: better to use solid | +| Minimum strut diameter | 0.3–0.5mm (LPBF) | Below 0.3mm: unreliable | +| TPMS wall thickness | 0.3–0.6mm (LPBF) | Always verify with the supplier | +| Cell size | 2–8mm | Cells too small: trapped powder; too large: loss of efficiency | +| Density gradient | Yes if load is non-uniform | E.g.: denser at attachment zone, lighter core | + +### Applications by type + +| Application | Recommended structure | Relative density | +|---|---|---| +| Structural lightweighting | Octet truss, BCC | 20–35% | +| Impact/crash absorption | Kelvin, BCC | 25–40% | +| Biomedical scaffold (Ti) | Gyroid, Diamond | 30–50% (for osseointegration) | +| Heat exchanger | Gyroid TPMS, IWP | 20–30% | +| Tooling with conformal channels | Gyroid + hybrid channels | 25–40% | +| Sandwich panel | FCC face-sheet | 15–25% | + +### Density → properties relationship (Gibson-Ashby law) +For strut lattice: `E_lattice/E_solid ≈ C × (ρ_lattice/ρ_solid)^n` +- n ≈ 2 for bending-dominated (BCC, Kelvin) +- n ≈ 1 for stretch-dominated (Octet, FCC) — more structurally efficient + +**Practical implication:** To maximise stiffness per unit weight → prefer stretch-dominated architectures (Octet truss) over bending-dominated ones (BCC). + +### Solid-to-lattice transition +- **Transition gradient:** At least 3–5 transition cells between solid zone and lattice +- **Containment shell:** Always add an outer solid skin (0.5–2mm) to: + - Protect from trapped powder + - Improve surface finish + - Resist surface fatigue + +--- + +## 3. SLS / MJF — Infill and Internal Structures + +### SLS principle: no structural supports, but… +- Unsintered powder acts as support → total geometric freedom +- **Closed cavities:** ALWAYS include powder escape holes ≥ ø5–6mm (otherwise trapped powder is irremovable) +- **SLS lattice:** Possible with cell size ≥ 3–4mm, strut ≥ 1.2mm + +### Lightweighting strategies for SLS/MJF +1. **Shell + hollow interior** (shell + hollow): Wall ≥1.5mm, escape holes +2. **SLS lattice:** PA12 with internal Gyroid or Honeycomb structures — weight saving 30–60% +3. **Internal stiffening ribs** instead of solid sections: often more efficient + +### Suggested tools for lattice generation +- **nTopology** — most powerful, designed for metal AM +- **Altair Inspire** — integrated with FEA, topology + lattice in one tool +- **Materialise Magics** — industry standard for build preparation +- **Fusion 360 (Generative Design)** — good entry point, less advanced control +- **Meshmixer** — free, basic lattice for FDM/SLS +- **Rhinoceros + Grasshopper** — maximum parametric flexibility diff --git a/additive-manufacturing/references/materials-db.json b/additive-manufacturing/references/materials-db.json new file mode 100644 index 0000000..035f5f7 --- /dev/null +++ b/additive-manufacturing/references/materials-db.json @@ -0,0 +1,705 @@ +{ + "_meta": { + "version": "2.0", + "description": "AM Materials Database — mechanical properties, roughness by orientation, post-processing for Ra targets, selection guide. Values from literature and datasheets. Always verify with the specific supplier datasheet.", + "units": { "UTS": "MPa", "YS": "MPa", "E": "GPa", "elongation": "%", "HDT": "°C", "T_max_service": "°C", "density": "g/cm³", "Ra": "µm", "accuracy": "mm", "shrinkage": "%", "fatigue_limit": "MPa" }, + "fatigue_note": "fatigue_limit_asbuilt = fatigue limit @ 10^7 cycles, R=0.1, as-built (high scatter ±20%). fatigue_limit_HIP_machined = with HIP + surface machining, close to forged. Kf_asbuilt_side = stress concentration factor from side surface roughness (Ra 15–20µm). See references/fatigue-design.md for complete calculation.", + "roughness_note": "Ra on typical surfaces. top_surface = parallel to the XY plane (last layer). side_XY = vertical surfaces. down_facing = lower overhang/support surfaces. As-built values without post-processing.", + "anisotropy_note": "anisotropy_Z_factor = UTS_Z / UTS_XY. E.g. 0.6 means the strength in the Z direction (layer stacking) is 60% of that in the XY plane." + }, + + "processes": { + "FDM": { "Ra_typical": [15,50], "accuracy_mm": 0.3, "supports": true, "note": "High anisotropy. Roughness strongly depends on orientation and layer height." }, + "SLA": { "Ra_typical": [1,6], "accuracy_mm": 0.15,"supports": true, "note": "UV post-cure mandatory. Best Ra among polymer processes." }, + "DLP": { "Ra_typical": [2,8], "accuracy_mm": 0.15,"supports": true, "note": "Faster than SLA. Ra depends on projector resolution." }, + "SLS": { "Ra_typical": [8,15], "accuracy_mm": 0.3, "supports": false, "note": "Powder acts as support. Good isotropy. Significant shrinkage (~3.5%)." }, + "MJF": { "Ra_typical": [6,12], "accuracy_mm": 0.25,"supports": false, "note": "Slightly better finish than SLS. Full-color available." }, + "LPBF": { "Ra_typical": [8,20], "accuracy_mm": 0.1, "supports": true, "note": "Metal supports are critical. Stress relief mandatory before removal." }, + "EBM": { "Ra_typical": [20,35], "accuracy_mm": 0.2, "supports": true, "note": "Higher Ra than LPBF. Vacuum chamber. Reduced thermal gradients." }, + "BJT": { "Ra_typical": [4,10], "accuracy_mm": 0.4, "supports": false, "note": "Post-print sintering. Shrinkage ~20%. Tolerances worse than LPBF." } + }, + + "polymers": [ + { + "id": "PLA", + "name": "PLA (Polylactic Acid)", + "family": "standard_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 50, "UTS_max": 65, "E_min": 3.3, "E_max": 3.8, "elongation_min": 3, "elongation_max": 6, "anisotropy_Z_factor": 0.55 }, + "thermal": { "HDT_min": 52, "HDT_max": 65, "T_max_service": 52 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 15, "Ra_max": 35 }, + "down_facing": { "Ra_min": 25, "Ra_max": 60, "note": "support interface" }, + "Ra_asbuilt_typical": 25, + "postprocess_achievable": { + "sanding_400": { "Ra_min": 3, "Ra_max": 8 }, + "sanding_800": { "Ra_min": 1.5, "Ra_max": 4 }, + "primer_sand": { "Ra_min": 0.8, "Ra_max": 2 } + } + }, + "flags": { "biocompatible": false, "uv_resistant": false, "food_safe_possible": false, "predry_required": false, "enclosure_required": false, "supports_needed": true }, + "chemical_resistance": { "acids_dilute": "good", "bases_dilute": "good", "solvents_organic": "poor", "fuels": "poor", "UV_outdoor": "poor" }, + "shrinkage": { "min": 0.1, "max": 0.3 }, + "cost_relative": 1, "print_difficulty": "easy", + "variants": ["PLA+", "PLA-CF (+20% UTS, hardened steel nozzle mandatory)"], + "applications": ["visual prototypes", "concept models", "non-structural parts", "gadgets"], + "warnings": ["biodegradable — avoid prolonged humid/hot environments", "no UV outdoor", "brittle under impact"], + "postprocessing_sequence": ["support removal", "wet sanding 120→240→400→800", "primer surfacer", "painting or clear coat"] + }, + { + "id": "PETG", + "name": "PETG (Polyethylene Terephthalate Glycol)", + "family": "standard_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 50, "UTS_max": 55, "E_min": 2.1, "E_max": 2.5, "elongation_min": 50, "elongation_max": 200, "anisotropy_Z_factor": 0.65 }, + "thermal": { "HDT_min": 75, "HDT_max": 80, "T_max_service": 75 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 12 }, + "side_XY": { "Ra_min": 12,"Ra_max": 30 }, + "down_facing": { "Ra_min": 20,"Ra_max": 50 }, + "Ra_asbuilt_typical": 20, + "postprocess_achievable": { + "sanding_400": { "Ra_min": 2, "Ra_max": 6 }, + "sanding_800": { "Ra_min": 1.0, "Ra_max": 3 } + } + }, + "flags": { "biocompatible": false, "uv_resistant": false, "food_safe_possible": true, "food_safe_note": "depends on pigments and additives from supplier", "predry_required": false, "enclosure_required": false, "supports_needed": true }, + "chemical_resistance": { "acids_dilute": "excellent", "bases_dilute": "excellent", "alcohols": "excellent", "solvents_organic": "moderate", "fuels": "good" }, + "shrinkage": { "min": 0.1, "max": 0.3 }, + "cost_relative": 1.2, "print_difficulty": "moderate", + "warnings": ["high stringing — temperature and retraction are critical", "sticks heavily to bed — use release agent on glass"], + "postprocessing_sequence": ["support removal", "sanding 180→400→800", "polyurethane primer + painting"] + }, + { + "id": "ABS", + "name": "ABS (Acrylonitrile Butadiene Styrene)", + "family": "engineering_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 40, "UTS_max": 50, "E_min": 2.0, "E_max": 2.5, "elongation_min": 5, "elongation_max": 25, "anisotropy_Z_factor": 0.55 }, + "thermal": { "HDT_min": 90, "HDT_max": 100, "T_max_service": 90 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 15,"Ra_max": 40 }, + "down_facing": { "Ra_min": 25,"Ra_max": 55 }, + "Ra_asbuilt_typical": 25, + "postprocess_achievable": { + "acetone_smoothing": { "Ra_min": 1.5, "Ra_max": 5, "note": "alters dimensions ±0.1–0.3mm" }, + "sanding_800": { "Ra_min": 2, "Ra_max": 6 } + } + }, + "flags": { "uv_resistant": false, "predry_required": false, "enclosure_required": true, "enclosure_temp_min": 40, "supports_needed": true }, + "shrinkage": { "min": 0.5, "max": 1.5 }, + "cost_relative": 1.2, "print_difficulty": "difficult", + "warnings": ["severe warping without enclosure", "toxic fumes — ventilation mandatory"], + "postprocessing_sequence": ["support removal", "acetone smoothing OR sanding 120→400→800", "primer + painting"] + }, + { + "id": "ASA", + "name": "ASA (Acrylonitrile Styrene Acrylate)", + "family": "engineering_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 45, "UTS_max": 55, "E_min": 2.1, "E_max": 2.6, "elongation_min": 5, "elongation_max": 20, "anisotropy_Z_factor": 0.55 }, + "thermal": { "HDT_min": 90, "HDT_max": 100, "T_max_service": 90 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 15,"Ra_max": 40 }, + "Ra_asbuilt_typical": 25 + }, + "flags": { "uv_resistant": true, "predry_required": false, "enclosure_required": true, "supports_needed": true }, + "shrinkage": { "min": 0.5, "max": 1.0 }, + "cost_relative": 1.5, "print_difficulty": "difficult", + "applications": ["outdoor parts", "automotive exterior", "signage"], + "postprocessing_sequence": ["support removal", "sanding 180→400→800", "UV-resistant primer + painting"] + }, + { + "id": "PA12-FDM", + "name": "PA12 / Nylon 12 — FDM", + "family": "engineering_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 50, "UTS_max": 60, "E_min": 1.6, "E_max": 2.2, "elongation_min": 30, "elongation_max": 300, "anisotropy_Z_factor": 0.60 }, + "thermal": { "HDT_min": 120, "HDT_max": 120, "T_max_service": 110 }, + "surface_roughness": { + "top_surface": { "Ra_min": 8, "Ra_max": 20 }, + "side_XY": { "Ra_min": 20,"Ra_max": 45 }, + "down_facing": { "Ra_min": 30,"Ra_max": 60 }, + "Ra_asbuilt_typical": 30 + }, + "flags": { "predry_required": true, "predry_conditions": "70–80°C / 4–8h before each session", "enclosure_required": true, "supports_needed": true }, + "chemical_resistance": { "fuels": "excellent", "oils": "excellent", "bases": "excellent", "acids_conc": "moderate" }, + "shrinkage": { "min": 1.0, "max": 2.0 }, + "cost_relative": 2.0, "print_difficulty": "difficult", + "applications": ["gears", "snap-fits", "automotive parts", "mechanical components"], + "warnings": ["hygroscopic — pre-dry MANDATORY before each session"] + }, + { + "id": "PC", + "name": "PC (Polycarbonate)", + "family": "high_performance_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 55, "UTS_max": 70, "E_min": 2.3, "E_max": 2.8, "elongation_min": 100, "elongation_max": 120, "anisotropy_Z_factor": 0.60 }, + "thermal": { "HDT_min": 110, "HDT_max": 130, "T_max_service": 115 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 15,"Ra_max": 35 }, + "Ra_asbuilt_typical": 20, + "postprocess_achievable": { + "sanding_1200_polish": { "Ra_min": 0.1, "Ra_max": 0.5, "note": "polishing for transparency" } + } + }, + "flags": { "transparent": true, "predry_required": true, "predry_conditions": "80–90°C / 4–6h", "enclosure_required": true, "enclosure_temp_min": 60, "nozzle_temp_min": 260, "nozzle_temp_max": 290, "supports_needed": true }, + "shrinkage": { "min": 0.5, "max": 0.8 }, + "cost_relative": 2.5, "print_difficulty": "very difficult", + "applications": ["optical components", "electronic housings", "transparent covers", "thermal fixtures"] + }, + { + "id": "PEEK-FDM", + "name": "PEEK (Polyether Ether Ketone) — FDM", + "family": "ultra_high_performance", "processes": ["FDM"], + "mechanical": { "UTS_min": 90, "UTS_max": 105, "E_min": 3.5, "E_max": 4.2, "elongation_min": 30, "elongation_max": 50, "anisotropy_Z_factor": 0.70 }, + "thermal": { "HDT_min": 250, "HDT_max": 260, "T_max_service": 240 }, + "surface_roughness": { + "side_XY": { "Ra_min": 15, "Ra_max": 40 }, + "Ra_asbuilt_typical": 25, + "postprocess_achievable": { + "machining_CNC": { "Ra_min": 0.4, "Ra_max": 1.6 } + } + }, + "flags": { "biocompatible": true, "biocompat_standards": ["ISO 10993", "USP Class VI"], "uv_resistant": true, "predry_required": true, "predry_conditions": "120°C / 4h", "enclosure_required": true, "enclosure_temp_min": 90, "nozzle_allMetal_required": true, "supports_needed": true }, + "chemical_resistance": { "general": "excellent" }, + "cost_relative": 30, "cost_EUR_per_kg": "200–400", "print_difficulty": "extreme", + "variants": ["CF-PEEK (+30% E, -ductility)"], + "applications": ["medical", "aerospace", "high-temperature chemical", "spinal implants"], + "warnings": ["all-metal hot end mandatory (no PTFE >260°C)", "slow cooling inside enclosure"] + }, + { + "id": "TPU-FDM", + "name": "TPU / TPE elastomers — FDM", + "family": "flexible_fdm", "processes": ["FDM"], + "mechanical": { "UTS_min": 10, "UTS_max": 40, "elongation_min": 300, "elongation_max": 600 }, + "thermal": { "HDT_min": 70, "HDT_max": 85, "T_max_service": 75 }, + "shore": { "min": 85, "max": 98, "scale": "A" }, + "surface_roughness": { + "side_XY": { "Ra_min": 15, "Ra_max": 35 }, + "Ra_asbuilt_typical": 22 + }, + "flags": { "flexible": true, "predry_required": false, "enclosure_required": false, "direct_drive_recommended": true, "supports_needed": true }, + "cost_relative": 2.0, "print_difficulty": "moderate", + "warnings": ["reduced or zero retraction with direct drive", "bowden extruder: severe underextrusion", "slow printing (20–35 mm/s max perimeters)"] + }, + { + "id": "CF-short-FDM", + "name": "Short-fiber composites — PA-CF, PETG-CF, PC-CF", + "family": "composite_fdm", "processes": ["FDM"], + "mechanical": { "UTS_note": "+20–40% vs base polymer", "E_note": "+30–60% vs base polymer", "elongation_note": "reduced — more brittle" }, + "surface_roughness": { + "side_XY": { "Ra_min": 15, "Ra_max": 45 }, + "Ra_asbuilt_typical": 30 + }, + "flags": { "hardened_nozzle_required": true, "predry_required": "depends on base polymer", "enclosure_required": "depends on base polymer" }, + "cost_relative": 2.5, "print_difficulty": "moderate-difficult", + "warnings": ["brass nozzles wear out within a few hours — hardened steel or ruby nozzle mandatory"] + }, + { + "id": "Onyx-ContinuousFiber", + "name": "Onyx + Continuous Fiber — Markforged", + "family": "composite_continuous_fiber", "processes": ["FDM-Markforged"], + "mechanical": { "UTS_max_CF": 800, "E_max_CF_GPa": 70, "UTS_onyx": 30, "note": "Continuous CF oriented along load direction" }, + "thermal": { "T_max_service": 105 }, + "surface_roughness": { "side_XY": { "Ra_min": 10, "Ra_max": 25 }, "Ra_asbuilt_typical": 20 }, + "flags": { "markforged_only": true, "enclosure_required": true }, + "reinforcement_options": ["Carbon Fiber", "Kevlar", "HSHT Fiberglass"], + "cost_relative": 8, "print_difficulty": "moderate (dedicated machine)", + "applications": ["structural aluminum replacement", "fixtures", "tooling", "robot end-effectors"], + "warnings": ["Markforged machines only", "not repairable with standard FDM"] + }, + { + "id": "PA12-SLS", + "name": "PA12 SLS (EOS PA2200, Duraform PA)", + "family": "sls_powder", "processes": ["SLS"], + "mechanical": { "UTS_min": 45, "UTS_max": 50, "E_min": 1.7, "E_max": 1.9, "elongation_min": 18, "elongation_max": 23, "anisotropy_Z_factor": 0.90 }, + "thermal": { "HDT_min": 163, "HDT_max": 163, "T_max_service": 150 }, + "surface_roughness": { + "top_surface": { "Ra_min": 6, "Ra_max": 12 }, + "side_XY": { "Ra_min": 8, "Ra_max": 15 }, + "down_facing": { "Ra_min": 8, "Ra_max": 18, "note": "SLS: no support interface" }, + "Ra_asbuilt_typical": 10, + "postprocess_achievable": { + "bead_blast": { "Ra_min": 4, "Ra_max": 8 }, + "vibratory": { "Ra_min": 2, "Ra_max": 5 }, + "SLS_coating": { "Ra_min": 3, "Ra_max": 6 }, + "machining": { "Ra_min": 0.4,"Ra_max": 1.6 } + } + }, + "fatigue": { + "fatigue_limit_asbuilt_min": 18, "fatigue_limit_asbuilt_max": 25, + "fatigue_reference_cycles": "10^6, R=0.1", + "fatigue_anisotropy_Z_XY_asbuilt": 0.92, + "note": "Polymer with the best fatigue behavior among AM processes. Moisture-sensitive: store at humidity < 50% RH. Over-aged powder reduces elongation and fatigue." + }, + "flags": { "supports_needed": false, "isotropic": true, "predry_required": false }, + "chemical_resistance": { "fuels": "excellent", "oils": "excellent", "acids_dilute": "good" }, + "shrinkage": { "min": 3.0, "max": 4.0, "axis_note": "isotropic ~3.5% XY and Z" }, + "accuracy": "±0.3mm", "cost_relative": 5, + "applications": ["functional parts", "complex geometries", "series 10–200 pcs", "prosthetics"], + "warnings": ["shrinkage 3.5–4% — compensate in CAD", "recycled powder max 50%"], + "postprocessing_sequence": ["breakout + cleaning (compressed air + blasting)", "standard bead blast", "dyeing if color is required", "coating if sealing is required"] + }, + { + "id": "PA12-MJF", + "name": "PA12 MJF (HP Multi Jet Fusion)", + "family": "mjf_powder", "processes": ["MJF"], + "mechanical": { "UTS_min": 48, "UTS_max": 53, "E_min": 1.8, "E_max": 2.0, "elongation_min": 15, "elongation_max": 20, "anisotropy_Z_factor": 0.92 }, + "thermal": { "HDT_min": 163, "HDT_max": 165, "T_max_service": 150 }, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 10 }, + "side_XY": { "Ra_min": 6, "Ra_max": 12 }, + "Ra_asbuilt_typical": 8, + "postprocess_achievable": { + "bead_blast": { "Ra_min": 3, "Ra_max": 7 }, + "vibratory": { "Ra_min": 2, "Ra_max": 4 } + } + }, + "flags": { "supports_needed": false, "color_available": true, "color_note": "Full color HP MJF 5200" }, + "shrinkage": { "min": 3.0, "max": 4.0 }, + "accuracy": "±0.2–0.3mm", "cost_relative": 5, + "packing_density_optimal": "8–12%", + "applications": ["medium-volume production", "colored parts", "series 50–500 pcs"] + }, + { + "id": "PA11-SLS", + "name": "PA11 SLS", + "family": "sls_powder", "processes": ["SLS"], + "mechanical": { "UTS_min": 48, "UTS_max": 53, "E_min": 1.6, "E_max": 1.8, "elongation_min": 40, "elongation_max": 50, "anisotropy_Z_factor": 0.90 }, + "thermal": { "T_max_service": 120 }, + "surface_roughness": { + "side_XY": { "Ra_min": 8, "Ra_max": 16 }, + "Ra_asbuilt_typical": 11 + }, + "flags": { "supports_needed": false, "bio_based": true, "bio_based_source": "castor oil" }, + "shrinkage": { "min": 2.5, "max": 3.5 }, "cost_relative": 6, + "applications": ["automotive components", "high-impact parts", "prosthetics and orthotics"], + "notes": "Prefer over PA12 when: elongation >30% is required, repeated impacts, presence of notches" + }, + { + "id": "PA12-CF-SLS", + "name": "PA12-CF / PA12-GF SLS", + "family": "sls_powder_composite", "processes": ["SLS"], + "mechanical": { "UTS_min": 50, "UTS_max": 55, "E_min": 3.5, "E_max": 4.5, "elongation_min": 5, "elongation_max": 10 }, + "thermal": { "HDT_min": 180, "HDT_max": 200, "T_max_service": 175 }, + "surface_roughness": { "side_XY": { "Ra_min": 9, "Ra_max": 18 }, "Ra_asbuilt_typical": 12 }, + "flags": { "supports_needed": false }, + "cost_relative": 7, + "applications": ["rigid structural parts", "elevated temperature", "technical housings"] + }, + { + "id": "TPU-SLS", + "name": "TPU SLS (BASF Ultrasint TPU)", + "family": "sls_flexible", "processes": ["SLS"], + "mechanical": { "UTS_min": 8, "UTS_max": 12, "elongation_min": 350, "elongation_max": 500 }, + "shore": { "min": 88, "max": 92, "scale": "A" }, + "surface_roughness": { "side_XY": { "Ra_min": 8, "Ra_max": 16 }, "Ra_asbuilt_typical": 12 }, + "flags": { "supports_needed": false, "flexible": true }, + "cost_relative": 8, + "applications": ["shoe soles", "dampers", "flexible seals", "functional lattice"] + }, + { + "id": "Resin-Standard", + "name": "Standard ABS-like Resin — SLA/DLP", + "family": "resin_standard", "processes": ["SLA", "DLP", "MSLA"], + "mechanical": { "UTS_min": 50, "UTS_max": 70, "E_min": 2.5, "E_max": 3.5, "elongation_min": 5, "elongation_max": 15 }, + "thermal": { "HDT_min": 55, "HDT_max": 70, "T_max_service": 55 }, + "surface_roughness": { + "top_surface": { "Ra_min": 1.0, "Ra_max": 3.0 }, + "side_XY": { "Ra_min": 2.0, "Ra_max": 6.0, "note": "visible stair-stepping with layer >50µm" }, + "down_facing": { "Ra_min": 3.0, "Ra_max": 8.0, "note": "touchpoint marks from supports" }, + "Ra_asbuilt_typical": 3, + "postprocess_achievable": { + "sanding_800": { "Ra_min": 0.4, "Ra_max": 1.0 }, + "polish": { "Ra_min": 0.05,"Ra_max": 0.2 } + } + }, + "flags": { "supports_needed": true, "post_cure_required": true, "IPA_wash_required": true, "uv_resistant": false }, + "shrinkage": { "min": 0.1, "max": 0.3 }, "accuracy": "±0.1–0.15mm", + "cost_relative": 2, "print_difficulty": "easy", + "warnings": ["UV photodegradation — outdoor yellowing", "post-cure mandatory for final properties"], + "postprocessing_sequence": ["IPA wash 10–15 min", "air drying 5 min", "UV post-curing 900–1200 mJ/cm²", "support removal", "sanding if Ra <2µm is required", "UV-stable clear coat"] + }, + { + "id": "Resin-HighTemp", + "name": "High-Temp Resin — SLA/DLP", + "family": "resin_hightemp", "processes": ["SLA", "DLP"], + "mechanical": { "UTS_min": 60, "UTS_max": 80, "elongation_min": 2, "elongation_max": 6 }, + "thermal": { "HDT_min": 160, "HDT_max": 280, "T_max_service": 160 }, + "surface_roughness": { "side_XY": { "Ra_min": 2, "Ra_max": 6 }, "Ra_asbuilt_typical": 3 }, + "flags": { "supports_needed": true, "post_cure_required": true, "brittle": true }, + "cost_relative": 5, + "applications": ["small-series injection molds", "process fixtures", "aerodynamic testing"] + }, + { + "id": "Resin-Flexible", + "name": "Flexible/Elastic Resin — SLA/DLP", + "family": "resin_flexible", "processes": ["SLA", "DLP"], + "shore": { "min": 40, "max": 80, "scale": "A" }, + "surface_roughness": { "side_XY": { "Ra_min": 2, "Ra_max": 8 }, "Ra_asbuilt_typical": 4 }, + "flags": { "supports_needed": true, "post_cure_required": true, "flexible": true }, + "cost_relative": 3, + "warnings": ["mechanical properties lower than TPU SLS"] + }, + { + "id": "Resin-Dental-Medical", + "name": "Dental/Medical Resin — SLA/DLP", + "family": "resin_medical", "processes": ["SLA", "DLP"], + "mechanical": { "UTS_min": 60, "UTS_max": 80 }, + "surface_roughness": { "side_XY": { "Ra_min": 1, "Ra_max": 4 }, "Ra_asbuilt_typical": 2 }, + "flags": { "biocompatible": true, "biocompat_standards": ["ISO 10993", "class IIa/IIb"], "supports_needed": true, "post_cure_required": true }, + "cost_relative": 8, + "applications": ["anatomical models", "surgical guides", "aligners", "temporary devices"] + }, + { + "id": "Resin-Ceramic", + "name": "Ceramic Resin Alumina/Zirconia — SLA/DLP", + "family": "ceramic_vat", "processes": ["SLA", "DLP"], + "mechanical": { "UTS_min": 200, "UTS_max": 600, "note": "after sintering" }, + "surface_roughness": { + "Ra_asbuilt_typical": 2, + "postprocess_achievable": { + "after_sintering": { "Ra_min": 0.5, "Ra_max": 3 }, + "after_grinding": { "Ra_min": 0.05,"Ra_max": 0.4 } + } + }, + "flags": { "biocompatible": true, "supports_needed": true, "multi_step_process": true }, + "shrinkage": { "min": 20, "max": 25, "note": "ALWAYS COMPENSATE IN CAD" }, + "cost_relative": 15, + "applications": ["zirconia dental prosthetics", "technical alumina components", "ceramic insulators"], + "warnings": ["shrinkage 20–25% — compensation in CAD is mandatory", "multi-step process: print → debinding → sintering"], + "postprocessing_sequence": ["IPA wash", "UV post-cure", "debinding 200–600°C ramp 1–5°C/min", "pre-sintering 1000°C/2h", "sintering 1450–1600°C/2h", "optional HIP", "grinding/lapping functional surfaces"] + } + ], + + "metals": [ + { + "id": "AlSi10Mg", + "name": "AlSi10Mg", + "family": "aluminum_alloy", "processes": ["LPBF"], + "mechanical": { + "UTS_asbuilt_min": 400, "UTS_asbuilt_max": 470, + "UTS_SR_min": 350, "UTS_SR_max": 420, + "YS_min": 240, "YS_max": 280, "E_min": 70, "E_max": 75, + "elongation_min": 6, "elongation_max": 11, "anisotropy_Z_factor": 0.85 + }, + "thermal": { "T_max_service": 150 }, "density": 2.68, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 8, "Ra_max": 20 }, + "down_facing": { "Ra_min": 15, "Ra_max": 35 }, + "Ra_asbuilt_typical": 12, + "postprocess_achievable": { + "bead_blast": { "Ra_min": 4, "Ra_max": 8 }, + "vibratory": { "Ra_min": 2, "Ra_max": 5 }, + "shot_peen": { "Ra_min": 3, "Ra_max": 7, "note": "introduces compressive stress — improves fatigue" }, + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "electropolish": { "Ra_min": 0.5, "Ra_max": 2.0, "note": "variable results on Al" }, + "anodizing": { "note": "does not change Ra — protection and color" } + } + }, + "flags": { "biocompatible": false, "supports_needed": true }, + "accuracy": "±0.05–0.1mm", "shrinkage": { "min": 0.3, "max": 0.5 }, "build_atmosphere": "Nitrogen", + "heat_treatment": { + "stress_relief": { "temp_C": 300, "time_h": 2, "atmosphere": "air or argon", "mandatory": true, "timing": "BEFORE removal from build plate" }, + "T6": { "mandatory": false, "note": "improves ductility" } + }, + "fatigue": { + "fatigue_limit_asbuilt_min": 90, "fatigue_limit_asbuilt_max": 130, + "fatigue_limit_HIP_machined_min": 120, "fatigue_limit_HIP_machined_max": 170, + "fatigue_limit_reference_forged_6061T6": 100, + "fatigue_anisotropy_Z_XY_asbuilt": 0.60, + "fatigue_anisotropy_Z_XY_HIP": 0.90, + "Kf_asbuilt_side_Ra15_20": 1.7, + "shot_peen_improvement_pct": "15–25", + "note": "Very sensitive to porosity and powder humidity. With HIP it approaches forged 6061-T6 performance." + }, + "machinability": "excellent", "cost_relative": 3, + "applications": ["lightweight structural parts", "housings", "aero/auto brackets", "heat sinks", "manifolds"], + "warnings": ["no applications >150°C", "stress relief before build plate removal — critical"], + "postprocessing_sequence": ["stress relief 300°C/2h", "build plate removal (EDM/saw)", "support removal", "machining critical surfaces", "surface finishing", "anodizing if required"] + }, + { + "id": "Scalmalloy", + "name": "Scalmalloy® (AlMgScZr)", + "family": "aluminum_advanced", "processes": ["LPBF"], + "mechanical": { "UTS_min": 520, "UTS_max": 540, "YS_min": 470, "YS_max": 490, "elongation_min": 13, "elongation_max": 16 }, + "density": 2.67, + "surface_roughness": { "side_XY": { "Ra_min": 8, "Ra_max": 20 }, "Ra_asbuilt_typical": 12 }, + "flags": { "supports_needed": true }, + "heat_treatment": { "T6": { "mandatory": true } }, + "cost_relative": 12, "cost_note": "~3–5× AlSi10Mg", + "applications": ["high-performance structural parts for aero/motorsport/UAV"], + "warnings": ["very high cost — justify with performance analysis"] + }, + { + "id": "Ti-6Al-4V", + "name": "Ti-6Al-4V Grade 23 (ELI)", + "family": "titanium_alloy", "processes": ["LPBF", "EBM"], + "mechanical": { + "UTS_LPBF_min": 900, "UTS_LPBF_max": 1100, + "UTS_EBM_min": 830, "UTS_EBM_max": 1000, + "YS_min": 800, "YS_max": 1000, "E_min": 110, "E_max": 120, + "elongation_min": 8, "elongation_max": 15, "anisotropy_Z_factor": 0.88 + }, + "thermal": { "T_max_service": 315 }, "density": 4.43, + "surface_roughness": { + "top_surface": { "Ra_min": 5, "Ra_max": 15 }, + "side_XY": { "Ra_min": 8, "Ra_max": 20 }, + "down_facing": { "Ra_min": 20, "Ra_max": 40 }, + "Ra_asbuilt_typical": 14, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "electropolish": { "Ra_min": 0.5, "Ra_max": 2.0 }, + "shot_peen": { "Ra_min": 3, "Ra_max": 8 }, + "machining_surgical": { "Ra_min": 0.2, "Ra_max": 0.8, "note": "implant surgical surfaces" } + } + }, + "flags": { "biocompatible": true, "biocompat_standards": ["ISO 10993"], "supports_needed": true }, + "accuracy": "±0.05–0.1mm", "shrinkage": { "min": 0.2, "max": 0.4 }, "build_atmosphere": "Argon", + "heat_treatment": { + "stress_relief": { "temp_C": 650, "time_h": 3, "atmosphere": "vacuum or argon", "mandatory": true }, + "HIP": { "temp_C": 900, "pressure_MPa": 150, "time_h": 3, "mandatory_for": "biomedical, fatigue-critical" }, + "annealing": { "temp_C": 790, "time_h": 2, "mandatory": false } + }, + "fatigue": { + "fatigue_limit_asbuilt_min": 200, "fatigue_limit_asbuilt_max": 320, + "fatigue_limit_HIP_machined_min": 400, "fatigue_limit_HIP_machined_max": 550, + "fatigue_limit_reference_forged": 650, + "fatigue_anisotropy_Z_XY_asbuilt": 0.67, + "fatigue_anisotropy_Z_XY_HIP": 0.95, + "Kf_asbuilt_side_Ra15_20": 2.1, + "shot_peen_improvement_pct": "20–40", + "note": "Huge as-built scatter (±30%). HIP + machining brings performance close to forged. For biomedical implants: HIP is mandatory." + }, + "cost_relative": 8, + "applications": ["orthopedic implants", "aerospace hot section", "lightweight racing structures"], + "warnings": ["HIP mandatory for implants", "stress relief critical before support removal"], + "postprocessing_sequence": ["stress relief 650°C/3h/vacuum", "build plate removal (EDM)", "support removal", "HIP for biomedical/fatigue-critical", "machining functional surfaces", "electropolish or passivation", "CT scan inspection (implants)"] + }, + { + "id": "316L", + "name": "316L Stainless Steel", + "family": "stainless_steel", "processes": ["LPBF", "BJT"], + "mechanical": { + "UTS_LPBF_min": 550, "UTS_LPBF_max": 640, + "UTS_BJT_min": 480, "UTS_BJT_max": 540, + "YS_min": 400, "YS_max": 460, "E_min": 193, "E_max": 200, + "elongation_min": 40, "elongation_max": 50 + }, + "density": 7.99, + "surface_roughness": { + "side_XY": { "Ra_min": 8, "Ra_max": 20 }, + "Ra_asbuilt_typical": 12, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "electropolish": { "Ra_min": 0.2, "Ra_max": 0.8, "note": "excellent on 316L — food/medical standard" }, + "shot_peen": { "Ra_min": 3, "Ra_max": 6 }, + "passivation": { "note": "does not change Ra — protects against corrosion" } + } + }, + "flags": { "biocompatible": true, "supports_needed": true, "BJT_no_supports": true }, + "accuracy_LPBF": "±0.05–0.1mm", "accuracy_BJT": "±0.3–0.5mm post-sinter", + "shrinkage_LPBF": { "min": 0.2, "max": 0.3 }, + "shrinkage_BJT": { "min": 18, "max": 22, "note": "sintering — compensate in CAD" }, + "build_atmosphere": "Nitrogen or Argon", + "heat_treatment": { + "stress_relief": { "temp_C": 1000, "time_h": 1.5, "atmosphere": "vacuum", "mandatory": false }, + "solution_anneal": { "temp_C": 1050, "time_h": 1, "note": "if maximum corrosion resistance is required" } + }, + "fatigue": { + "fatigue_limit_asbuilt_min": 180, "fatigue_limit_asbuilt_max": 220, + "fatigue_limit_HIP_machined_min": 220, "fatigue_limit_HIP_machined_max": 260, + "fatigue_limit_reference_forged": 220, + "fatigue_anisotropy_Z_XY_asbuilt": 0.80, + "fatigue_anisotropy_Z_XY_HIP": 0.96, + "Kf_asbuilt_side_Ra15_20": 1.6, + "shot_peen_improvement_pct": "15–25", + "note": "As-built fatigue is almost comparable to forged material — ductile and defect-tolerant alloy. BJT: fatigue data not available, not recommended for fatigue-critical applications without HIP." + }, + "cost_relative": 4, + "applications": ["medical", "food-contact", "chemical", "marine"], + "notes": "BJT is cheaper for volumes >50 pcs — looser tolerances" + }, + { + "id": "17-4PH", + "name": "17-4PH (AISI 630)", + "family": "stainless_steel_ph", "processes": ["LPBF", "BJT"], + "mechanical": { + "UTS_min": 1000, "UTS_max": 1300, "UTS_condition": "H900", + "YS_min": 950, "YS_max": 1200, "elongation_min": 5, "elongation_max": 12 + }, + "density": 7.78, + "surface_roughness": { + "side_XY": { "Ra_min": 8, "Ra_max": 20 }, "Ra_asbuilt_typical": 12, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "grinding": { "Ra_min": 0.1, "Ra_max": 0.4 } + } + }, + "flags": { "supports_needed": true }, + "heat_treatment": { + "solution_anneal": { "temp_C": 1040, "time_h": 1, "atmosphere": "vacuum" }, + "aging_H900": { "temp_C": 480, "time_h": 1, "atmosphere": "air", "mandatory": true, "warning": "MANDATORY — without aging, properties are ~40% of H900 values" } + }, + "fatigue": { + "fatigue_limit_H900_min": 350, "fatigue_limit_H900_max": 430, + "fatigue_limit_reference_forged_H900": 450, + "fatigue_anisotropy_Z_XY_asbuilt": 0.75, + "Kf_asbuilt_side_Ra15_20": 1.7, + "shot_peen_improvement_pct": "15–25", + "note": "Fatigue data available only in H900 condition (aging mandatory). As-built is not an option for fatigue." + }, + "cost_relative": 5, + "applications": ["loaded structural parts", "molds", "tooling", "aerospace", "marine hardware"], + "warnings": ["aging H900 is mandatory — never omit it"], + "postprocessing_sequence": ["stress relief", "build plate + support removal", "solution anneal 1040°C/1h", "aging H900 480°C/1h/air", "machining", "grinding if Ra <0.4µm"] + }, + { + "id": "IN625", + "name": "Inconel 625", + "family": "nickel_superalloy", "processes": ["LPBF"], + "mechanical": { "UTS_min": 900, "UTS_max": 1000, "YS_min": 600, "YS_max": 700, "elongation_min": 30, "elongation_max": 40 }, + "thermal": { "T_max_service": 980 }, "density": 8.44, + "surface_roughness": { + "side_XY": { "Ra_min": 10, "Ra_max": 25 }, "Ra_asbuilt_typical": 15, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "electropolish": { "Ra_min": 0.5, "Ra_max": 2.0 } + } + }, + "flags": { "supports_needed": true }, "build_atmosphere": "Argon", + "heat_treatment": { "stress_relief": { "temp_C": 1050, "time_h": 2, "atmosphere": "vacuum", "mandatory": true } }, + "fatigue": { + "fatigue_limit_asbuilt_min": 280, "fatigue_limit_asbuilt_max": 380, + "fatigue_anisotropy_Z_XY_asbuilt": 0.72, + "Kf_asbuilt_side_Ra15_20": 1.7, + "note": "Relatively limited data in the literature. Use with safety margin >= 2.0 for critical applications." + }, + "cost_relative": 10, + "applications": ["offshore chemical", "oil&gas", "engine cold sections", "marine"] + }, + { + "id": "IN718", + "name": "Inconel 718", + "family": "nickel_superalloy", "processes": ["LPBF"], + "mechanical": { + "UTS_min": 1000, "UTS_max": 1300, "UTS_condition": "full HT", + "YS_min": 900, "YS_max": 1100, "elongation_min": 10, "elongation_max": 20 + }, + "thermal": { "T_max_service": 700 }, "density": 8.19, + "surface_roughness": { + "side_XY": { "Ra_min": 10, "Ra_max": 25 }, "Ra_asbuilt_typical": 16, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "grinding": { "Ra_min": 0.1, "Ra_max": 0.4 } + } + }, + "flags": { "supports_needed": true }, "build_atmosphere": "Argon", + "heat_treatment": { + "solution_anneal": { "temp_C": 1065, "time_h": 1, "atmosphere": "vacuum" }, + "aging_step1": { "temp_C": 720, "time_h": 8, "atmosphere": "vacuum" }, + "aging_step2": { "temp_C": 620, "time_h": 8, "atmosphere": "vacuum" }, + "mandatory": true, + "warning": "MANDATORY — without full cycle, properties are ~50% of final values. Plan with a qualified supplier." + }, + "fatigue": { + "fatigue_limit_fullHT_min": 350, "fatigue_limit_fullHT_max": 450, + "fatigue_limit_reference_forged": 500, + "fatigue_anisotropy_Z_XY_asbuilt": 0.72, + "Kf_asbuilt_side_Ra15_20": 1.8, + "shot_peen_improvement_pct": "15–25", + "note": "Fatigue data available only after complete HT cycle (solution anneal + double aging). As-built: do not qualify for fatigue without HT." + }, + "cost_relative": 12, + "applications": ["turbines", "aerospace hot section", "high-temperature fatigue parts"], + "warnings": ["complex and certified heat treatment — plan in advance"] + }, + { + "id": "CoCr", + "name": "CoCr MP1/SP2", + "family": "cobalt_chrome", "processes": ["LPBF", "EBM"], + "mechanical": { "UTS_min": 1000, "UTS_max": 1200, "hardness_HRC_min": 35, "hardness_HRC_max": 45 }, + "density": 8.3, + "surface_roughness": { + "side_XY": { "Ra_min": 10, "Ra_max": 22 }, "Ra_asbuilt_typical": 14, + "postprocess_achievable": { + "machining": { "Ra_min": 0.4, "Ra_max": 1.6 }, + "polishing": { "Ra_min": 0.05,"Ra_max": 0.2, "note": "dental prosthetics — mirror finish" } + } + }, + "flags": { "biocompatible": true, "biocompat_standards": ["ISO 10993"], "supports_needed": true }, "build_atmosphere": "Argon", + "heat_treatment": { "stress_relief": { "mandatory": true }, "HIP": { "mandatory_for": "biomedical implants" } }, + "fatigue": { + "fatigue_limit_asbuilt_min": 500, "fatigue_limit_asbuilt_max": 600, + "fatigue_anisotropy_Z_XY_asbuilt": 0.78, + "Kf_asbuilt_side_Ra15_20": 1.7, + "note": "Excellent fatigue performance for biomedical applications. HIP mandatory for implants. High UTS -> very favorable fatigue life." + }, + "machinability": "difficult — design near-net shape", "cost_relative": 9, + "applications": ["dental prosthetics", "orthopedic implants", "cutting tools"], + "warnings": ["very difficult to machine post-print — minimize material removal in CAD"] + }, + { + "id": "Cu-pure", + "name": "Pure copper (Cu)", + "family": "copper", "processes": ["LPBF-green", "LPBF-blue"], + "mechanical": { "UTS_min": 200, "UTS_max": 280, "elongation_min": 25, "elongation_max": 45 }, + "density": 8.96, "electrical_conductivity_IACS_min": 95, "thermal_conductivity_Wm_K": 380, + "surface_roughness": { "side_XY": { "Ra_min": 10, "Ra_max": 25 }, "Ra_asbuilt_typical": 15 }, + "flags": { "supports_needed": true, "green_blue_laser_only": true }, + "cost_relative": 7, + "applications": ["inductors", "heat exchangers", "bus bars", "electronic components"], + "warnings": ["requires green 515nm or blue 450nm laser — IR lasers are inadequate", "not all service providers offer this technology"] + } + ], + + "selection_guides": { + "by_Ra_target": { + "Ra_less_0p4": { "label": "Ra <0.4 µm", "use_cases": "O-ring seats, seals, H6/h6 precision fits", "strategy": "any AM process + post-machining grinding/lapping" }, + "Ra_0p4_to_1p6": { "label": "Ra 0.4–1.6 µm", "use_cases": "functional mechanical surfaces, sliding fits", "strategy": "LPBF/SLS/SLA + CNC machining. SLA as-built + sanding 800." }, + "Ra_1p6_to_3p2": { "label": "Ra 1.6–3.2 µm", "use_cases": "semi-finished surfaces, non-critical inner surfaces", "strategy": "SLA as-built. LPBF + vibratory or electropolish. SLS + vibratory." }, + "Ra_3p2_to_6p3": { "label": "Ra 3.2–6.3 µm", "use_cases": "non-critical functional surfaces, inner walls", "strategy": "SLS/MJF + bead blast. LPBF + bead blast. Optimized FDM top surface." }, + "Ra_6p3_to_12p7":{ "label": "Ra 6.3–12.7 µm","use_cases": "non-functional surfaces, internal parts, prototypes", "strategy": "FDM side surfaces. SLS as-built. LPBF as-built." }, + "Ra_greater_12p7":{"label": "Ra >12.7 µm", "use_cases": "rough aesthetic parts, non-critical", "strategy": "FDM side/down-facing as-built." } + }, + "by_temperature": [ + { "T_max_C": 55, "materials": ["PLA", "Resin-Standard", "Resin-Flexible", "TPU-FDM"] }, + { "T_max_C": 80, "materials": ["PETG", "TPU-FDM"] }, + { "T_max_C": 100, "materials": ["ABS", "ASA"] }, + { "T_max_C": 120, "materials": ["PA12-FDM", "PA11-SLS"] }, + { "T_max_C": 150, "materials": ["PC", "PA12-SLS", "PA12-MJF"] }, + { "T_max_C": 175, "materials": ["PA12-CF-SLS"] }, + { "T_max_C": 240, "materials": ["PEEK-FDM"] }, + { "T_max_C": 315, "materials": ["AlSi10Mg", "Ti-6Al-4V"] }, + { "T_max_C": 700, "materials": ["IN718"] }, + { "T_max_C": 980, "materials": ["IN625"] } + ], + "by_application": { + "biomedical_implants": ["Ti-6Al-4V", "CoCr", "PEEK-FDM"], + "dental": ["CoCr", "Resin-Dental-Medical", "Resin-Ceramic"], + "aerospace_structural": ["AlSi10Mg", "Scalmalloy", "Ti-6Al-4V", "IN718", "IN625"], + "automotive_lightweight": ["AlSi10Mg", "PA12-SLS", "PA12-MJF", "CF-short-FDM", "Onyx-ContinuousFiber"], + "chemical_process": ["316L", "IN625", "Ti-6Al-4V"], + "tooling_molds": ["17-4PH", "Resin-HighTemp"], + "flexible_seals": ["TPU-FDM", "TPU-SLS", "Resin-Flexible"], + "heat_exchangers": ["AlSi10Mg", "Cu-pure", "IN625"], + "outdoor_UV": ["ASA", "PA12-SLS"], + "optical_transparent": ["PC", "Resin-Standard"], + "food_contact": ["316L", "PETG"], + "structural_replace_Al": ["Onyx-ContinuousFiber", "AlSi10Mg", "PA12-CF-SLS"], + "rapid_prototyping": ["PLA", "Resin-Standard", "PA12-MJF"], + "functional_prototype": ["PETG", "PA12-SLS", "PA12-MJF", "AlSi10Mg"] + }, + "by_process_availability": { + "desktop_FDM_easy": ["PLA", "PETG", "TPU-FDM"], + "desktop_FDM_advanced": ["ABS", "ASA", "PA12-FDM", "PC"], + "industrial_FDM": ["PEEK-FDM", "CF-short-FDM", "Onyx-ContinuousFiber"], + "desktop_resin": ["Resin-Standard", "Resin-Flexible"], + "professional_resin": ["Resin-HighTemp", "Resin-Dental-Medical"], + "sls_service_bureau": ["PA12-SLS", "PA11-SLS", "PA12-CF-SLS", "TPU-SLS"], + "mjf_service_bureau": ["PA12-MJF"], + "metal_service_bureau": ["AlSi10Mg", "Ti-6Al-4V", "316L", "17-4PH", "IN625", "IN718", "CoCr"], + "specialized_only": ["Scalmalloy", "Cu-pure", "Resin-Ceramic"] + } + } +} diff --git a/additive-manufacturing/references/metal-am-alloys.md b/additive-manufacturing/references/metal-am-alloys.md new file mode 100644 index 0000000..dc92965 --- /dev/null +++ b/additive-manufacturing/references/metal-am-alloys.md @@ -0,0 +1,99 @@ +# Metal AM Alloys + +> **Primary database:** `materials-db.json` — contains all structured data (UTS, YS, elongation, density, heat treatment, accuracy, shrinkage, applications, warnings) for all AM metal alloys. +> This file provides decision context and critical notes that cannot be structured in JSON. + +## How to use the JSON database for metals + +``` +To select a metal alloy: +1. Filter by T_max_service (e.g. >300°C → titanium or superalloys) +2. Filter by process (LPBF / EBM / Binder Jetting) +3. Compare strength-to-weight ratio (UTS/density) if weight is critical +4. Check biocompatible for medical applications +5. Read heat_treatment — complexity and cost impact lead time +6. Read warnings — some alloys have mandatory requirements +``` + +## Critical notes on heat treatment (DO NOT ignore) + +### Heat treatment is part of the process, not optional +- **AlSi10Mg:** Stress relief BEFORE removing from build plate. Without it: distortion and cracking. +- **Ti-6Al-4V:** Stress relief 650°C mandatory. HIP mandatory for biomedical. +- **17-4PH:** H900 aging (480°C/1h) MANDATORY. AS-BUILT properties are ~40% of H900. +- **IN718:** Full solution + double aging cycle mandatory. Plan weeks in advance. +- **IN625:** Simpler — stress relief only. No precipitation hardening. + +### Universal LPBF sequence (do not deviate) +1. Stress relief → 2. Build plate removal → 3. Support removal → 4. HT/HIP → 5. Machining → 6. Inspection + +## Selection by strength-to-weight ratio + +| Alloy | UTS/density (MPa·cm³/g) | Note | +|---|---|---| +| AlSi10Mg | ~160 | Excellent for lightweight structures | +| Scalmalloy | ~195 | Best Al available in AM | +| Ti-6Al-4V | ~225 | Aerospace benchmark | +| IN718 | ~135 | High density — justified by elevated temperatures | +| 17-4PH | ~155 | High-strength stainless steel | + +## Lot-to-Lot Variability and Property Scatter + +Inter-lot variability in metal AM is higher than in forged material — and is often underestimated +during the design phase. Do not design to the mean value from data tables: use P10 values +(10th percentile) or apply an explicit knockdown factor. + +### Typical variability by alloy (CoV = coefficient of variation) + +| Alloy / Condition | UTS CoV | Fatigue CoV | Primary source | +|---|---|---|---| +| **Ti-6Al-4V LPBF as-built** | 5–10% | 20–35% | Variable micro-porosity between builds | +| **Ti-6Al-4V LPBF HIP + machined** | 2–4% | 8–15% | HIP drastically reduces scatter | +| **AlSi10Mg LPBF as-built** | 8–15% | 25–40% | Highly sensitive to powder moisture and O₂ | +| **316L LPBF as-built** | 4–7% | 15–25% | Ductile → low UTS scatter, moderate fatigue | +| **17-4PH LPBF H900** | 5–9% | 15–25% | Depends on aging cycle: temperature control critical | +| **IN718 LPBF (full HT)** | 5–8% | 18–28% | Variable carbide distribution between builds | +| **PA12 SLS** | 6–12% | 20–30% | Fresh/recycled powder ratio critical | +| **PA12 FDM** | 15–25% | 30–50% | Anisotropy + filament moisture | + +> Source: aggregated literature (Sames 2016, Lewandowski 2016, Gu 2012, EOS datasheets). +> Fatigue CoV is always >> UTS CoV — fatigue is far more sensitive to localized defects. + +### Effect of powder reuse on properties (LPBF metals) + +| No. of powder reuses | UTS variation | Elongation variation | Porosity variation | Recommended action | +|---|---|---|---|---| +| 0–5 | baseline | baseline | baseline | None — normal use | +| 5–10 | −1 to −3% | −5 to −10% | +0.02–0.05% | Monitor PSD and chemical composition | +| 10–20 | −3 to −8% | −10 to −20% | +0.05–0.15% | Mandatory coupon testing for structural applications | +| > 20 | Unpredictable | Unpredictable | > 0.2% | Replace powder; unacceptable risk | + +**Parameters to monitor for powder:** +- PSD: D10, D50, D90 — deviation > 15% from baseline → sign of degradation +- Satellite content: > 10% → increased gas porosity risk +- Chemical composition (O₂, N₂ especially for Ti): oxygen increase > 0.02% → reduced elongation +- Flowability (Hall flow): > 30 s/50g → risk of non-uniform distribution + +### Recommended knockdown factors for design + +For robust design, apply knockdowns to nominal table values: + +| Application | Knockdown on UTS | Knockdown on fatigue limit | +|---|---|---| +| Functional prototype | −5% | −15% | +| Structural (FS ≥ 2.0) | −10% | −20% | +| Fatigue-critical (FS ≥ 1.5) | −10% | −30% | +| Aerospace / biomedical (certified) | Use values from coupons on the same build plate | Use coupon values + B-basis statistics | + +**B-basis (statistics):** value guaranteed at 90% with 95% confidence. For structural aerospace +this is the reference value — not the mean. Requires a minimum of 30 samples to calculate. + +--- + +## Notes on Metal Binder Jetting process +- Shrinkage ~20% linear during sintering — always compensate in CAD (not in slicer) +- Post-sinter tolerances ±0.3–0.5mm vs ±0.05–0.1mm for LPBF +- No structural supports during printing (like SLS) → geometric freedom +- Ceramic setters for sintering on cantilevered geometries +- Post-sinter HIP recommended for critical structural applications +- Economically competitive for volumes >30–50 parts compared to LPBF diff --git a/additive-manufacturing/references/polymer-am-materials.md b/additive-manufacturing/references/polymer-am-materials.md new file mode 100644 index 0000000..23045e2 --- /dev/null +++ b/additive-manufacturing/references/polymer-am-materials.md @@ -0,0 +1,48 @@ +# Polymer AM Materials + +> **Primary database:** `materials-db.json` — contains all structured data (mechanical and thermal properties, print parameters, applications, warnings) for all polymeric materials. +> This file provides qualitative context and usage notes that cannot be structured in JSON. + +## How to use the JSON database + +``` +To select a polymeric material: +1. Filter by T_max_service (field thermal.T_max_service) +2. Filter by available process (field processes) +3. Compare UTS_min/max, elongation, E_min/max +4. Check biocompatible, uv_resistant, chemical_resistance if relevant +5. Use selection_guides.by_application for a quick shortlist +6. Read warnings before proceeding +``` + +## Qualitative notes by family + +### FDM — Standard materials (PLA, PETG, ABS, ASA) +- PLA: entry-level, no temperature, no UV. First choice for rapid prototypes. +- PETG: better than PLA for chemical resistance and toughness. Stringing requires attention to settings. +- ABS/ASA: if HDT >80°C is needed. ASA for outdoor use. Both require an enclosure. + +### FDM — Engineering materials (PA12, PC, TPU) +- PA12: excellent toughness, hygroscopic — always pre-dry. Preferred for snap-fits and gears. +- PC: transparent, high HDT. Difficult to print. Consider SLS PA12-GF as an alternative for high temperatures. +- TPU: direct-drive only. Bowden extruder causes severe issues. + +### FDM — High-performance (PEEK) +- PEEK is the only choice for T >200°C in FDM. Cost and difficulty are very high. +- Consider PEEK SLS as an alternative (better isotropy but rare machines). +- CF-PEEK increases stiffness but reduces ductility — only if stiffness is the primary driver. + +### Continuous fiber composites (Markforged) +- Onyx + continuous CF can achieve UTS comparable to aluminum. +- Hard constraint: Markforged machines only. High cost but avoids metal AM for many structural applications. + +### SLS/MJF — Polymer powders +- PA12 SLS: reference standard. Good isotropy, free geometries, no supports. +- PA11: preferred when superior toughness is needed (impact, notches, elongation >40%). +- PA12-MJF: slightly better than SLS for surface finish and throughput. Full-color available. +- TPU SLS: excellent for flexible parts requiring complex geometries (not feasible in FDM). + +### SLA/DLP Resins +- Standard: maximum resolution for prototypes and aesthetic parts. Not for load-bearing use. +- High-Temp: only resin option for thermal molds and fixtures. +- Ceramic-filled: multi-step process (printing + debinding + sintering). Shrinkage 20-25% — compensate accordingly. diff --git a/additive-manufacturing/references/post-processing.md b/additive-manufacturing/references/post-processing.md new file mode 100644 index 0000000..bbcbc58 --- /dev/null +++ b/additive-manufacturing/references/post-processing.md @@ -0,0 +1,171 @@ +# AM Post-Processing — Complete Technical Guide + +## Principle: post-processing is part of the process, not an afterthought + +In AM, final properties depend on the post-processing sequence as much as on the printing process. +Plan post-processing BEFORE printing (it affects orientation, tolerances, and geometry). + +--- + +## Metal AM — Sequence and Treatments + +### General LPBF sequence (mandatory) + +``` +1. STRESS RELIEF (on the build plate, before any other operation) +2. Removal from build plate (EDM wire cutting / saw / milling) +3. Support removal (manual + tools + milling where necessary) +4. Heat treatment / aging (if required by the material) +5. HIP (if critical application) +6. Post-machining of critical surfaces +7. Surface finishing +8. Inspection / quality control +``` + +### Stress Relief — Conditions by alloy + +| Alloy | Temperature | Time | Atmosphere | Purpose | +|---|---|---|---|---| +| AlSi10Mg | 270–300°C | 2h | Air / Argon | Reduce residual stresses; does not alter microstructure | +| Ti-6Al-4V | 600–650°C | 2–4h | Vacuum / Argon | Critical — without this, severe distortions upon removal | +| 316L | 900–1050°C | 1–2h | Vacuum / Argon | Solution annealing + stress relief | +| 17-4PH | 1040°C (solution) + 480°C (H900) | 1h + 1h | Vacuum | Mandatory aging sequence | +| Inconel 718 | 980°C + 720°C + 620°C | 1h + 8h + 8h | Vacuum | Full precipitation hardening sequence | +| Inconel 625 | 1050°C | 2h | Vacuum | Stress relief only, no precipitation | + +### HIP (Hot Isostatic Pressing) +- **Purpose:** Closes residual porosity (gas-phase pores, lack of fusion) → mechanical properties closer to wrought material +- **Typical conditions:** + - Ti-6Al-4V: 900°C / 100–200 MPa / 2–4h / Argon + - IN718: 1170°C / 175 MPa / 4h + - AlSi10Mg: 500°C / 100 MPa / 3h (rarely economically justified) +- **When mandatory:** Biomedical (implants), aerospace fatigue-critical, pressure-bearing components +- **Effect on microstructure:** May coarsen the AS-built microstructure → compensate with post-HIP heat treatment +- **Cost:** €500–2000/batch depending on size and material + +### Post-Machining Metal AM +- Functional surfaces (seats, precision holes, sealing surfaces) → ALWAYS post-machine +- Recommended machining allowance in design phase: 0.5–1.5mm on critical surfaces +- Techniques: CNC milling, turning, grinding (for critical surfaces), EDM (for hard-to-reach features) +- **Warning:** AM microstructure may differ from wrought material → cutting parameters may vary + +--- + +## Metal Surface Finishing + +### Methods and achievable Ra + +| Method | Achievable Ra | Cost | Notes | +|---|---|---|---| +| **As-built LPBF** | 5–25 µm | — | Baseline; depends on orientation | +| **Shot peening** | 3–8 µm | Low | Introduces surface compression → improves fatigue | +| **Sand/bead blasting** | 3–10 µm | Low | Uniform finish, matting | +| **Vibratory finishing** | 1–4 µm | Medium | Good for batches of small parts | +| **Barrel tumbling** | 1–3 µm | Medium | Parts without sharp edges | +| **Electropolishing** | 0.5–2 µm | Medium-High | Excellent for 316L; possible for Ti; difficult for Al | +| **CNC machining** | 0.1–1.6 µm | High | Specific surfaces, accessible geometries | +| **Grinding / lapping** | 0.01–0.5 µm | High | Sealing surfaces, mating interfaces | +| **Laser polishing** | 1–5 µm | High | Internal surfaces (channels), inaccessible areas | +| **Chemical etching** | Varies | Low | Removal of oxidised surface layer, especially Ti | + +### Shot peening — specific notes +- Significantly improves fatigue resistance (compressive residual stress) +- Standard AMS 2430 for aerospace +- Parameters: shot size S110–S230, pressure 2–4 bar, coverage 100–200% + +--- + +## Polymer AM — Post-Processing + +### FDM Post-Processing + +| Operation | Purpose | Materials | Notes | +|---|---|---|---| +| **Support removal** | Access to geometries | All | Mechanical (pliers/cutters) or dissolution (PVA in water, HIPS in limonene) | +| **Sanding** | Surface finishing | PLA, ABS, ASA, PETG | Grits: 120 → 220 → 400 → 800 progressive; wet sanding for best results | +| **Primer + filler** | Covering layer lines | All | Primer surfacer + sanding before painting | +| **Acetone smoothing** | Partial surface dissolution | ABS ONLY | Ra from ~30µm to ~2–5µm; caution: modifies dimensions ±0.1–0.3mm | +| **IPA smoothing (XTC-3D resin)** | Surface encapsulation | All | Adds ~0.3–0.5mm — account for this in tolerances | +| **Painting** | Aesthetics, UV protection | All (with primer) | Polyurethane or acrylic paints | +| **Annealing** | Reduction of internal stresses, HDT | PLA, PETG, ABS | PLA: 60–80°C / 1h; PETG: 80°C / 2h; improves thermal resistance | +| **Heat-set inserts** | Reliable metal threads | All thermoplastics | M2–M12; insert with soldering iron/heat station; pull-out strength >>printed thread | +| **Epoxy impregnation** | Impermeability, rigidity | All | Low-viscosity resins (West System, Smooth-On) penetrate the structure | + +### SLS / MJF Post-Processing + +| Operation | Purpose | Notes | +|---|---|---| +| **Breakout + cleaning** | Remove excess powder | Shot/sand blasting standard; compressed air for internals | +| **Bead blasting** | Uniform finish, improved Ra | Ra from 12µm → 6–8µm; uniform satin appearance | +| **Dyeing** | Uniform colouring | PA12: excellent dyeing capability (standard black or colours with dedicated dyes); hot process 80–95°C | +| **Vibratory finishing** | Ra < 4µm | Good for batches; caution with thin features | +| **SLS coating (e.g. Ceracoat, Duracoat)** | Impermeability + colour | Specific coatings for SLS; slightly increases Ra | +| **Impregnation** | Impermeability | Epoxy resins or low-viscosity cyanoacrylate | +| **Painting** | Aesthetics | With PA-specific primer | +| **Machining** | Critical tolerances | PA12 machines well; watch for cutting heat | + +### SLA / DLP / MSLA Post-Processing — MANDATORY + +``` +MANDATORY SEQUENCE: +1. Removal from the build plate +2. Wash in IPA (10–15 min agitation or dedicated washing machine) + → IPA 90%+ for optimal cleaning + → Alternative: Form Wash solution or equivalent +3. Air drying (5–10 min) for IPA evaporation +4. UV post-curing (MANDATORY) + → 405nm, 900–1200 mJ/cm² or follow manufacturer specifications + → Time: 15–60 min depending on resin and part size + → Elevated temperatures (40–60°C) accelerate and improve uniformity +5. Support removal (post-curing for standard resins; pre-curing for flexible resins) +6. Optional finishing: sanding, painting, coating +``` + +**Warning:** Uncured resin is toxic — mandatory PPE (nitrile gloves, goggles, ventilation) + +--- + +## Ceramic AM — Post-Processing + +### SLA/DLP ceramics (Lithoz, 3DCeram) + +``` +1. Wash (IPA or supplier-specific solvent) +2. UV post-curing (same as standard SLA) +3. Thermal DEBINDING: 200–600°C / slow ramp (1–5°C/min) to eliminate organic binder + → Critical phase: ramp too fast → cracking +4. PRE-SINTERING (brown body): ~1000°C / 2h → brittle but handleable ceramic +5. Final SINTERING: + → Alumina: 1550–1600°C / 2h + → Zirconia: 1450–1550°C / 2h + → Shrinkage: 20–25% linear (compensate in CAD) +6. Optional HIP for dense zirconia (density >99.9%) +7. Grinding/lapping for functional surfaces +``` + +--- + +## Inspection and Qualification + +### Inspection methods for AM parts + +| Method | Applies to | Detects | When to use | +|---|---|---|---| +| **Visual + dimensional (CMM)** | All | Dimensions, tolerances | Standard, always | +| **CT scan (tomography)** | Metal AM, ceramics | Internal porosity, cracks, inclusions | Critical parts, biomedical, aerospace | +| **Ultrasound (UT)** | Metals | Cracks, delaminations | Large parts | +| **X-ray radiography** | Metals | Porosity, defects | Cost-effective alternative to CT | +| **Hardness (HV, HRC)** | Metals | Heat treatment state | Verify post-HT | +| **Metallography** | Metals (coupon) | Microstructure, porosity | Initial process qualification | +| **Tensile testing** | All (coupon) | Rm, E, elongation | Batch qualification | +| **Profilometer** | All | Ra, Rz | Verify surface finish | + +### Acceptable porosity by application + +| Application | Max acceptable porosity | +|---|---| +| Prototypes / non-structural | <5% | +| Structural parts (non-critical) | <1% | +| Fatigue-critical applications | <0.1% (HIP often required) | +| Biomedical (implants) | <0.05% (HIP mandatory) | +| Pressure vessels / sealings | <0.01% → HIP + CT scan | diff --git a/additive-manufacturing/references/process-parameters.md b/additive-manufacturing/references/process-parameters.md new file mode 100644 index 0000000..c7d96e7 --- /dev/null +++ b/additive-manufacturing/references/process-parameters.md @@ -0,0 +1,181 @@ +# AM Process Parameters — Technical Guide + +## Important premise +The parameters listed are **optimized starting points** based on consolidated best practices. +Every machine, material lot, and geometry requires fine-tuning. +**Never use unvalidated parameters on critical parts without preliminary testing (coupons).** + +--- + +## FDM/FFF — Parameters by Material + +### General structure of FDM parameters + +``` +Layer height → Z resolution and speed (25–75% nozzle diameter) +Line width → Usually = nozzle diameter (0.4mm standard) +Print speed → mm/s (perimeters < infill < travel) +Temperature: + - Nozzle (T_e) → Material melting + - Bed (T_b) → First layer adhesion, anti-warping + - Chamber (T_c) → Required for high-temperature materials +Cooling fan → Rapid solidification (good for bridging/overhangs, bad for layer adhesion) +Retraction → Stringing prevention +``` + +### Parameter table by material + +| Material | T_nozzle (°C) | T_bed (°C) | T_chamber (°C) | Layer height | Perimeter speed | Cooling | Retraction | +|---|---|---|---|---|---|---|---| +| **PLA** | 195–220 | 50–65 | — | 0.1–0.3mm | 40–60 mm/s | 100% | 1–5mm / 25–45 mm/s | +| **PETG** | 230–250 | 70–85 | — | 0.1–0.3mm | 35–50 mm/s | 30–50% | 3–6mm / 25–35 mm/s | +| **ABS** | 230–250 | 90–110 | 40–60°C | 0.1–0.3mm | 40–60 mm/s | 0–10% | 4–6mm / 25–45 mm/s | +| **ASA** | 240–260 | 90–110 | 40–55°C | 0.1–0.3mm | 35–55 mm/s | 10–20% | 4–6mm / 25–45 mm/s | +| **PA12** | 240–260 | 70–90 | 45–65°C | 0.1–0.25mm | 30–50 mm/s | 0–10% | 6–8mm / 20–35 mm/s | +| **PC** | 260–290 | 100–120 | 60–80°C | 0.1–0.25mm | 30–50 mm/s | 0–10% | 4–6mm / 25–40 mm/s | +| **TPU (Shore 95A)** | 220–240 | 30–50 | — | 0.15–0.3mm | 20–35 mm/s | 20–50% | 0–2mm (direct) | +| **PEEK** | 360–400 | 120–140 | 90–120°C | 0.1–0.2mm | 20–40 mm/s | 0% | 2–4mm / 20–30 mm/s | +| **CF-filled (PA-CF)** | 250–270 | 70–90 | 45–65°C | 0.15–0.25mm | 30–45 mm/s | 0–10% | Hardened nozzle required | + +### Material-specific FDM notes + +**PLA:** +- Fan: always high → improves bridging and overhangs +- Warping: minimal on flat surfaces; avoid air drafts +- Pre-drying: rarely necessary (but recommended for filament >1 year old or stored in humid conditions) + +**PETG:** +- High stringing → reduce temperature, increase retraction, increase travel speed +- Excellent bed adhesion on glass + glue stick → may stick too well (use release agent) +- Reduced fan → improves interlayer adhesion + +**ABS / ASA:** +- Severe warping without enclosure → do not attempt on open-frame printers for parts >50mm +- Critical first layer: precise bed leveling, first layer speed 20–30 mm/s, precise Z offset +- Fumes: mandatory ventilation + +**PA (Nylon):** +- **Pre-drying MANDATORY:** 70–80°C / 4–8h before printing (hygroscopic filament) +- Store in dry box during printing +- Warping on large parts → enclosure + brim + +**PEEK:** +- Requires all-metal hot end (no PTFE above 260°C) +- Heated enclosure mandatory +- Pre-drying: 120°C / 4h +- Slow cooling after printing (do not open enclosure immediately) + +--- + +## SLA / DLP / MSLA — Parameters + +### Main parameters + +| Parameter | SLA (laser) | DLP | MSLA | +|---|---|---|---| +| **Layer thickness** | 25–100 µm | 25–100 µm | 25–100 µm | +| **Exposure time (normal layers)** | Depends on laser power | 2–8 sec | 2–6 sec | +| **Bottom layers** | 5–10 | 5–10 | 5–10 | +| **Bottom exposure** | 3–5× normal | 3–5× normal | 3–5× normal | +| **Lift speed** | 30–150 mm/min | 30–200 mm/min | 30–200 mm/min | +| **Lift distance** | 5–8 mm | 4–7 mm | 4–7 mm | +| **Anti-aliasing** | N/A | 4–8× | 4–8× | + +### SLA/DLP practical rules +- **Layer height and detail:** 25–50 µm for maximum detail (dental, jewelry); 100 µm for fast prototypes +- **Exposure time:** always calibrate with a test matrix (exposure test) for each resin and lot +- **Over-exposure → loss of detail, oversized dimensions** +- **Under-exposure → layers don't adhere, print failure** +- **FEP film:** replace when cloudy or scratched — causes failures and worse surface quality +- **Resin temperature:** 25–30°C optimal; cold resin (<20°C) → more viscous → adhesion problems + +--- + +## SLS / MJF — Process Parameters + +### SLS — Main parameters (EOS P396 as reference, PA2200/PA12) + +| Parameter | Typical value | Effect | +|---|---|---| +| **Layer thickness** | 100–120 µm | Standard; 60 µm for some premium materials | +| **Part bed temperature** | 168–172°C (PA12) | Critical: too low → warping; too high → hard cake | +| **Laser power** | 21–25 W | Calibrated by manufacturer — do not modify without validation | +| **Scan speed** | 5000–8000 mm/s | High speed → energy per unit area | +| **Energy density (ED)** | 0.015–0.025 J/mm² | ED = Laser power / (scan speed × hatch × layer) | +| **Hatch spacing** | 0.25–0.35 mm | | +| **Refresh rate (fresh powder)** | 30–50% per build | Mixes virgin powder with recycled powder | + +### Powder bed temperature — the most critical SLS parameter +- **Operating window:** ±2°C from the optimal point +- Too cold → distortions, curl, delaminations (curl effect) +- Too hot → excessive cake, lost detail, powder difficult to separate +- The chamber heating and cooling profile affects quality → follow manufacturer curve + +### MJF (HP) — Differences vs SLS +- Faster process (single pass of agents + IR fusion) +- **Key parameters:** controlled by HP — less parameter freedom for the user vs SLS +- User parameters: orientation, nesting, packing density +- **Optimal packing density:** 8–12% for PA12 (impacts mechanical properties) + +--- + +## LPBF / DMLS — Process Parameters + +### Fundamental LPBF parameters + +| Parameter | Symbol | Unit | Role | +|---|---|---|---| +| **Laser power** | P | W | Total available energy | +| **Scan speed** | v | mm/s | Beam travel speed | +| **Hatch spacing** | h | µm | Distance between adjacent passes | +| **Layer thickness** | t | µm | Powder layer thickness | +| **Energy Density (VED)** | E = P/(v×h×t) | J/mm³ | Synthetic indicator — not sufficient alone | + +### Typical values by alloy (reference EOS M290 / SLM Solutions 125HL) + +| Alloy | P (W) | v (mm/s) | h (µm) | t (µm) | VED (J/mm³) | +|---|---|---|---|---|---| +| **AlSi10Mg** | 340–370 | 1300–1600 | 130–190 | 30 | 40–65 | +| **Ti-6Al-4V** | 175–280 | 1000–1300 | 100–140 | 30 | 50–90 | +| **316L** | 200–280 | 700–1000 | 100–150 | 40 | 60–100 | +| **17-4PH** | 200–260 | 800–1100 | 100–150 | 40 | 55–90 | +| **Inconel 718** | 200–285 | 800–1000 | 100–130 | 40 | 65–110 | +| **Inconel 625** | 200–250 | 800–1100 | 100–140 | 40 | 55–90 | + +**Note:** These are indicative ranges. Every machine and powder lot requires optimized parameters. The machine manufacturer provides certified parameters — use those as the baseline. + +### Scan strategies + +| Strategy | Description | Use | +|---|---|---| +| **Alternating stripes** | Alternating bands at 90° layer by layer | Standard, isotropic | +| **Chessboard** | Checkerboard with rotation | Reduces distortion on large parts | +| **Island scanning** | Random islands | Reduces residual stresses, large parts | +| **Contour + infill** | Perimeter + fill separately | Improves surface Ra (slow, precise contour) | +| **Rotation per layer** | Angle rotation (e.g. 67°) each layer | Improves isotropy, modern standard | + +### Atmosphere parameters +- **Inert gas:** Argon or Nitrogen (AlSi10Mg prefers Nitrogen; Ti and superalloys → Argon) +- **O₂ target:** < 0.1–0.5% vol (depends on machine and material) +- **High O₂:** powder oxidation → inclusions → degraded mechanical properties + +### Build orientation and nesting parameters +- **Build height:** minimize → less time, less gas consumption, less risk of distortion +- **Nesting:** optimize chamber fill to reduce cost per part +- **Distance between parts:** ≥ 5mm (powder must flow between parts) + +--- + +## Parameter → Defect Correlation + +| Defect | Probable cause | Correction | +|---|---|---| +| **Gas porosity (spherical)** | Dissolved gas in powder, moisture | Powder pre-drying, gas purity | +| **Lack-of-fusion porosity (irregular)** | VED too low | Increase P, reduce v or h | +| **Solidification cracking** | Susceptible alloy, excessive VED | Reduce VED, modify strategy | +| **Warping / distortion** | Residual stresses, inadequate supports | Optimize orientation, stress relief | +| **Balling** | v too high, oxidized surface | Reduce v, check atmosphere | +| **Delamination** | t too high, P too low | Reduce layer thickness, increase P | +| **Stringing (FDM)** | T too high, insufficient retraction | Reduce T, increase retraction | +| **Warping FDM** | Low bed temperature, no enclosure | Increase bed temperature, enclosure, brim | +| **Visible layer lines SLA** | Layer height too high | Reduce to 25–50µm, post-sanding | diff --git a/additive-manufacturing/references/residual-stress-distortion.md b/additive-manufacturing/references/residual-stress-distortion.md new file mode 100644 index 0000000..d77ca72 --- /dev/null +++ b/additive-manufacturing/references/residual-stress-distortion.md @@ -0,0 +1,205 @@ +# Residual Stress and Distortion — Additive Manufacturing + +> Use this file when: +> - The designer asks why a part distorted after printing or after removal from the build plate +> - Choosing the scan strategy or planning the heat treatment +> - Quantifying the risk of distortion before printing +> - Deciding whether to perform stress relief on the build plate or in a separate furnace + +--- + +## 1. Origin of Residual Stresses in AM + +### Mechanism — why they form + +In LPBF each layer is melted rapidly (ms) and cooled equally rapidly while the underlying layers are already solidified. This creates an **enormous vertical thermal gradient** (10³–10⁵ °C/mm), resulting in: + +1. Melted layer tries to expand → constrained by the solid material below → compresses laterally +2. Layer solidifies in a compressed state +3. On cooling, the layer wants to contract but is constrained → results in **tension at the surface + compression at the core** + +``` +Typical LPBF stress profile (cross-section): + Top surface: σ_tension (+ 200–600 MPa) + Central core: σ_compression (- 100–400 MPa) + Bottom/build plate: high σ_tension (mechanical anchoring) +``` + +**When the part is removed from the build plate:** the equilibrium is broken → the part distorts. + +### Quantitative values by alloy + +| Alloy | σ_residual max as-built (MPa) | Typical distortion (mm/100mm) | Cracking risk | +|---|---|---|---| +| **Ti-6Al-4V LPBF** | 500–900 | 0.5–2.0 | High (brittle, low HRC) | +| **AlSi10Mg LPBF** | 150–300 | 0.3–1.5 | Moderate | +| **316L LPBF** | 300–600 | 0.3–1.0 | Low (ductile) | +| **17-4PH LPBF** | 400–700 | 0.5–1.5 | Moderate–high | +| **IN718 LPBF** | 600–1000 | 0.5–2.5 | High (constrained zones) | +| **IN625 LPBF** | 400–700 | 0.3–1.5 | Moderate | +| **CoCr LPBF** | 500–800 | 0.5–1.8 | Moderate | +| **FDM PA12** | 5–20 | 0.1–0.5 | Negligible | +| **SLS PA12** | 2–10 | < 0.1 | Negligible | + +> **Note:** distortion values refer to flat geometries (100×100×10mm). Asymmetric geometries with variable thicknesses or high L/t ratio can distort 3–5× more. + +--- + +## 2. Scan Strategy and Stress Reduction + +The scan strategy is the most immediate lever for reducing residual stresses during printing — with no additional cost. + +### Main strategies and impact + +| Strategy | σ_res reduction vs. unidirectional | Notes | +|---|---|---| +| **Unidirectional (baseline)** | 0% (reference) | Worst case — directional accumulation | +| **Alternating 90° each layer** | −15 to −25% | Minimum standard — simple to implement | +| **67° rotation each layer** | −25 to −40% | Pseudo-random → more uniform distribution; recommended as default | +| **Island scanning (5×5 or 7×7mm)** | −30 to −50% | Reduces local peak gradient; mandatory for IN718 and high-constraint geometries | +| **Stripe scanning** | −20 to −35% | Good for elongated parts | +| **Contour + hatch** | −10 to −20% on surface | Standard for roughness; does not significantly affect bulk | + +**Default recommendation:** 67° rotation/layer. For IN718 or critical geometries: island scanning 5×5mm + 67° rotation. + +### Parameters that worsen stresses + +- **Low layer thickness** (< 20 µm): more thermal cycles per unit volume → more stress +- **High VED** (> 80 J/mm³): larger melt zone, greater gradient +- **Very thick sections** adjacent to thin sections: differential shrinkage → distortion concentrated at the transition +- **Cold build plate** (< preheat temperature): thermal shock at the first layer + +--- + +## 3. Stress Relief — Parameters by Alloy + +Stress relief **on the build plate** (before removing the part) is the correct sequence: the build plate constrains distortion during the heat treatment. + +### Parameters + +| Alloy | Temperature (°C) | Time (h) | Atmosphere | Notes | +|---|---|---|---|---| +| **Ti-6Al-4V** | 650–730 | 2–4 | Vacuum or Ar | > 750°C → phase transformation → loss of properties | +| **AlSi10Mg** | 270–300 | 2–4 | Air or N₂ | > 310°C → precipitate coarsening → UTS −15% | +| **316L** | 450–550 | 1–2 | Ar or vacuum | Sensitization risk > 650°C | +| **17-4PH** | 325–350 | 1–2 | Ar or vacuum | Stress relief separate from aging (H900 = 480°C) | +| **IN718** | 900–950 | 1–2 | Vacuum or Ar | Stress relief only — then full solution annealing cycle | +| **IN625** | 870–900 | 1–2 | Vacuum or Ar | | +| **CoCr** | 800–850 | 1–2 | Vacuum | | + +**Heating and cooling ramps:** max 5–10°C/min to avoid thermal shock → cracking in constrained zones. + +**Effectiveness:** after correct stress relief, σ_res is reduced by **60–80%** compared to as-built. Post-removal distortion is reduced correspondingly. + +--- + +## 4. HIP — Effect on Residual Stresses + +HIP (Hot Isostatic Pressing) virtually eliminates residual stresses: + +| Parameter | Typical value | +|---|---| +| HIP temperature (Ti) | 900–920°C | +| HIP temperature (Al) | 500–515°C | +| HIP temperature (stainless steels) | 1100–1150°C | +| HIP temperature (superalloys) | 1100–1200°C | +| Pressure | 100–200 MPa (Ar) | +| Time | 2–4 hours | +| σ_res residual post-HIP | < 50 MPa (near zero) | +| Anisotropy reduction Z/XY (Ti) | From 0.60–0.75 → 0.92–0.98 | + +> **Dimensional note:** HIP causes dimensional variation of ±0.05–0.2mm for complex geometries (hot plastic deformation under isostatic pressure). Allow 0.3mm stock allowance for surfaces requiring machining after HIP. + +--- + +## 5. Distortion — Prediction and Compensation + +### High-risk geometries + +``` +Long, thin parts (L/t > 10): + → Arc distortion along the long axis + → Solution: orient the long axis along Z, or add ribs + +Vertical thin walls (t < 2mm, h > 30mm): + → Surface waviness, deviation from vertical + → Solution: stiffening ribs every 20–30mm, or angled printing + +Sections with abrupt thickness changes (factor > 3×): + → Distortion concentration at the transition + → Solution: progressive transition fillets + +Geometries with internal geometric constraint (frames, grids): + → Multiple stresses that add up → cracking risk in IN718, IN625 + → Solution: island scanning + aggressive stress relief + +Heavy build plate vs light part: + → Warping of the part upward (compressive stress at the bottom) + → Solution: tall uniform supports, CAD pre-deformation +``` + +### CAD compensation (morphing) + +For parts with tight tolerances (±0.1mm) and distortion-prone geometries: +1. Simulate distortion with AM software (Ansys Additive, Simufact, Netfabb) +2. Apply the inverse deformation in CAD (pre-compensation) +3. The part prints already distorted in the opposite direction → straightens to the final cost + +**Simulation accuracy:** ±50% of the real value — useful as a guide, not as a substitute for stress relief. + +--- + +## 6. Process Indicators: When to Be Concerned + +| Signal | Probable cause | Action | +|---|---|---| +| Delamination during printing | Residual stresses > interlayer strength (high constraint, no preheating) | Stop build. Revise scan strategy and preheating. | +| Part visibly distorts on removal from plate | Stress relief missing or at too low a temperature | Mandatory stress relief before removal | +| Supports break during build | Distortion force > support strength | Increase support density or add tie-bars | +| Visible cracking after stress relief | Ramp too fast, or temperature too high for the alloy | Reduce ramp to 3°C/min; revise temperature for the specific alloy | +| Holes or fits out of tolerance | Distortion + shrinkage not compensated | CAD pre-compensation + stress relief + final machining | + +--- + +## 7. Correct Sequence — Integration with Post-Processing + +``` +AM printing completed (part still on build plate) + ↓ +Stress Relief ON BUILD PLATE (T and time from table in section 3) + → The build plate constrains distortion during treatment + → MANDATORY for all metallic LPBF alloys + ↓ +Removal from build plate (EDM wire or saw) + → Residual distortion after stress relief: <<< as-built + ↓ +HIP if critical application (section 4) + → σ_res → near zero | closed porosity | reduced anisotropy + → Post-HIP: re-check dimensions (±0.1mm) + ↓ +Specific heat treatment (aging 17-4PH H900, double aging IN718...) + ↓ +Support removal + ↓ +CNC Machining of critical surfaces (after all treatments) + ↓ +Shot Peening (introduces controlled σ_compression on surface) + → Beneficial for fatigue but NOT before HIP + ↓ +Final inspection (CMM + CT scan) +``` + +--- + +## 8. EBM — Comparison with LPBF on Residual Stresses + +EBM (Electron Beam Melting) operates in a chamber preheated to 600–900°C → thermal gradients are drastically reduced. + +| Parameter | LPBF | EBM | +|---|---|---| +| σ_res as-built | 300–900 MPa | **50–150 MPa** | +| Typical distortion | 0.3–2.0 mm/100mm | **0.05–0.3 mm/100mm** | +| Stress relief mandatory? | Yes | Often not necessary (evaluate case by case) | +| Ra as-built | 8–20 µm | 20–35 µm (higher, offset by reduced stress) | + +**Indication:** for Ti-6Al-4V biomedical with complex geometries → EBM preferable to LPBF for residual stresses, even though as-built Ra is worse. diff --git a/additive-manufacturing/references/support-structures.md b/additive-manufacturing/references/support-structures.md new file mode 100644 index 0000000..24b2cdd --- /dev/null +++ b/additive-manufacturing/references/support-structures.md @@ -0,0 +1,172 @@ +# Supports in AM — Technical Guide by Process + +## General Principle + +Supports serve to: +1. **Anchor the part** to the build plate (prevent thermal distortions — critical in metal AM) +2. **Support overhangs** beyond the critical angle of the process +3. **Dissipate heat** during printing (especially LPBF) + +--- + +## FDM/FFF — Polymer Supports + +### When they are needed +- Overhang angles > 45° from vertical +- Bridges (bridging) > 50–60mm (depends on material and cooling) +- Horizontal holes > ø5mm + +### FDM support types + +| Type | Material | Removal | Finish | Use | +|---|---|---|---|---| +| **Normal (same material)** | = part | Mechanical | High Ra at interface | Default, low cost | +| **Soluble PVA support** | PVA | Dissolution in water | Excellent | Complex geometries, internal features | +| **Soluble HIPS support** | HIPS | Dissolution in limonene | Excellent | Mainly for ABS | +| **Soluble Breakaway support** | Special (Ultimaker, Bambu) | Snap-off | Good | Moderate geometries | + +### FDM support patterns +- **Lines/Grid:** Standard, easy to remove, adequate for most cases +- **Tree supports (organic):** Minimise contact with the part, excellent finish → recommended for aesthetic parts +- **Custom supports (manual):** For critical parts where the interface is not accessible + +### Critical FDM support parameters + +| Parameter | Typical value | Effect | +|---|---|---| +| **Support Z distance** | 0.15–0.25mm | Higher → easier removal but worse finish | +| **Support XY distance** | 0.5–1.0mm | Lateral distance from the part | +| **Interface layers** | 3–5 layers | Layers between support and part — use different pattern (e.g. lines) | +| **Support density** | 10–20% | Do not increase beyond this: unnecessary and makes removal harder | +| **Support roof/floor layers** | 2–4 | More layers → smoother surface under part | + +### Orientation to minimise FDM supports +- Rotate the part to bring critical surfaces (aesthetics, tolerances) to the top (top surface = best quality) +- Exploit **bridging:** FDM can bridge linearly up to 50–80mm with good cooling — position horizontal holes on bridges + +--- + +## SLA / DLP / MSLA — Resin Supports + +### Particularity: inverted printing +The part hangs from the build plate — peeling forces at each layer generate stresses. Supports must: +- Anchor the part to the build plate (or raft) +- Resist peeling forces (critical for flat geometries) + +### SLA support types + +| Type | Tip diameter | Use | +|---|---|---| +| **Light** | 0.3–0.4mm | Aesthetic surfaces, fine detail | +| **Medium** | 0.5–0.6mm | Standard | +| **Heavy** | 0.8–1.0mm | Heavy parts, large surfaces | + +### SLA rules +- **Raft:** Almost always necessary for medium/large parts (distributes peeling forces) +- **Tilt angle:** Tilting the part 15–30° drastically reduces supports and improves exposure uniformity +- **Islands:** Any surface disconnected from the main part requires support +- **Touchpoint:** Reduce touchpoint density on visible surfaces — prefer supports on hidden surfaces + +### Post-removal SLA +- Remove supports BEFORE post-curing if possible (uncured resin is more brittle → support breaks more easily) +- Exceptions: flexible resins → remove AFTER curing + +--- + +## SLS / MJF — No Structural Supports + +### Why SLS/MJF do not require supports +The surrounding unsintered powder supports the part during the build. This is the main advantage of SLS/MJF over FDM/LPBF. + +### What still needs to be managed +- **Powder escape holes:** MANDATORY for closed cavities (≥ ø5mm, ideally 2 opposite holes to avoid pockets) +- **Powder trapped in narrow channels:** Internal channels < ø4mm can retain powder — design with exit ports or use ø≥5mm +- **Packing density:** The packing density in the build chamber affects distortions — consult the service provider + +--- + +## LPBF / DMLS / SLM — Metal Supports + +### Specific functions for metal AM +1. **Thermal anchoring:** The part heats and cools cyclically — without adequate support it distorts or detaches from the build plate +2. **Heat sink:** Supports conduct heat towards the build plate (critical for alloys with high thermal conductivity such as AlSi10Mg) +3. **Mechanical support:** Overhangs > 45° + +### LPBF support types + +| Type | Structure | Removal | Use | +|---|---|---|---| +| **Block support** | Solid | Difficult, milling required | Very heavy parts, high heat | +| **Contour support** | Hollow shell | Medium difficulty | Standard | +| **Tree/Branch support** | Branched tree | Easier | Accessible aesthetic surfaces | +| **Lattice support** | Lattice | Easy (break-off) | Modern standard — recommended | +| **Cone support** | Conical | Easy | Single points, complex geometries | + +### Critical LPBF support parameters + +| Parameter | Typical value | Importance | +|---|---|---| +| **Top Z offset** | -0.1 to +0.05mm | Critical: too much gap → detachment; too much overlap → irremovable support | +| **Bottom Z offset** | 0.0–0.1mm | Interface with build plate | +| **Tooth height (perforated)** | 0.5–1.0mm | Facilitates removal while maintaining anchoring | +| **Perforated support** | Yes for critical surfaces | Reduces marking on the surface | +| **Lattice density** | 30–50% | Trade-off between heat dissipation and ease of removal | +| **XY support offset** | 0.05–0.2mm | Gap between support and part — critical for removal | + +### Orientation to minimise LPBF supports +- **Main rule:** Orient the build axis to minimise horizontal downward-facing surfaces +- **Critical angles:** < 30° from horizontal → always support; 30–45° → evaluate case by case +- **Trade-off:** Anti-support orientation may increase distortions or worsen metallurgy on critical surfaces + +### Strategy for critical surfaces (tolerances, Ra) +- Surfaces with tight tolerances (±0.05mm) → orient in the XY plane (not Z) AND plan for post-machining +- Sealing/mating surfaces → do not place supports on them — if unavoidable, use perforated supports + machining + +### Material-specific notes for LPBF supports + +| Alloy | Support criticality | Specific notes | +|---|---|---| +| AlSi10Mg | High (high conductivity, low melting point) | Dense supports mandatory; stress relief before removal | +| Ti-6Al-4V | Medium | Supports in same material; HT before removal | +| 316L | Low-Medium | Relatively easier to manage | +| Inconel 718/625 | High (high T, thermal gradients) | Very dense supports; significant distortions | +| 17-4PH | Medium | Stress relief critical before removal | + +### MANDATORY sequence for metal AM with supports +1. Print +2. **Thermal stress relief** (before removing from build plate and before supports) +3. Removal from build plate (EDM wire or saw) +4. Support removal (manual + tools + milling where necessary) +5. Heat treatment (if required — e.g. 17-4PH H900, IN718 aging) +6. HIP (if required) +7. Post-machining of critical surfaces +8. Inspection + +--- + +## EBM — Lightweight Supports + +- EBM operates in vacuum with powder pre-heating → thermal gradients much lower than LPBF +- **Supports needed but less critical:** Often only lightweight anchoring structures (mesh) +- Critical angle ~35° (better than LPBF due to lower thermal gradient) +- Support removal: mechanical, easier than LPBF + +--- + +## Binder Jetting — No Supports (green state) + +- The powder acts as support during the printing phase (like SLS) +- **Watch out for sintering phase:** The part may collapse if overhang geometries are excessive → plan ceramic setters or custom sintering supports +- Internal channels: verify they can be cleared after sintering + +--- + +## Support Checklist — Pre-Build + +- [ ] Are all overhangs beyond the critical angle of the process supported? +- [ ] Do critical surfaces (tolerances, Ra) avoid contact with supports, or is machining planned? +- [ ] For LPBF: is stress relief planned BEFORE support removal? +- [ ] For SLS/MJF: are powder escape holes present on all closed cavities? +- [ ] Is support removal accessible (physical access with tools)? +- [ ] Do supports not interfere with functional features (holes, sealing surfaces)? +- [ ] For complex parts: has a removability test been run in simulation (e.g. Magics)? diff --git a/additive-manufacturing/scripts/postprocess_route.py b/additive-manufacturing/scripts/postprocess_route.py new file mode 100644 index 0000000..15863cd --- /dev/null +++ b/additive-manufacturing/scripts/postprocess_route.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +""" +AM Post-Processing Route Planner +Given a process, material, and target Ra, generates the optimal post-processing sequence. +Usage: python3 postprocess_route.py --material AlSi10Mg --Ra 0.8 --use medical +""" +import json, argparse, sys +from pathlib import Path + +DB_PATH = Path(__file__).parent.parent / "references" / "materials-db.json" + +# Post-processing data by process — material-independent +POSTPROCESS_CATALOG = { + # --- Physical abrasive methods --- + "bead_blast": { + "label": "Bead/Sand Blasting", + "Ra_achievable": (3, 8), + "applies_to_processes": ["LPBF", "EBM", "SLS", "MJF", "BJT"], + "time_h": 0.1, + "cost_relative": 1, + "note": "Uniform matte finish. Typical prerequisite for other treatments.", + "sequence_priority": 1 + }, + "vibratory": { + "label": "Vibratory/Barrel Finishing", + "Ra_achievable": (1.5, 5), + "applies_to_processes": ["LPBF", "SLS", "MJF", "BJT"], + "time_h": 2, + "cost_relative": 2, + "note": "Good for batches. Watch thin features (<1mm).", + "sequence_priority": 2 + }, + "shot_peen": { + "label": "Shot Peening", + "Ra_achievable": (3, 8), + "applies_to_processes": ["LPBF", "EBM"], + "time_h": 0.5, + "cost_relative": 2, + "note": "Introduces compressive residual stress -> improves fatigue by 20-40%. AMS 2430 for aerospace.", + "sequence_priority": 2, + "functional_benefit": "fatigue_improvement" + }, + "machining_CNC": { + "label": "CNC machining (milling/turning)", + "Ra_achievable": (0.4, 1.6), + "applies_to_processes": ["LPBF", "EBM", "SLS", "BJT", "FDM"], + "time_h": 1, + "cost_relative": 4, + "note": "For accessible specific surfaces. Machining stock must be planned in design (0.5-1.5mm).", + "sequence_priority": 3 + }, + "grinding": { + "label": "Grinding", + "Ra_achievable": (0.1, 0.4), + "applies_to_processes": ["LPBF", "EBM", "BJT"], + "applies_to_materials": ["17-4PH", "IN718", "CoCr", "316L"], + "time_h": 2, + "cost_relative": 5, + "note": "For flat sealing surfaces or precision fits.", + "sequence_priority": 4 + }, + "lapping_polishing": { + "label": "Lapping / Polishing", + "Ra_achievable": (0.025, 0.2), + "applies_to_processes": ["LPBF", "EBM", "SLA", "DLP"], + "time_h": 3, + "cost_relative": 6, + "note": "For Ra <0.2um. Surgical surfaces, precision seals, optics.", + "sequence_priority": 5 + }, + "electropolish": { + "label": "Electropolishing", + "Ra_achievable": (0.2, 1.5), + "applies_to_processes": ["LPBF", "BJT"], + "applies_to_materials": ["316L", "17-4PH", "Ti-6Al-4V", "IN625", "IN718"], + "time_h": 1, + "cost_relative": 3, + "note": "Excellent for 316L (food/medical). Variable results on Ti. Not recommended on Al.", + "sequence_priority": 3, + "functional_benefit": "corrosion_resistance" + }, + "passivation": { + "label": "Passivation (nitric/citric acid)", + "Ra_achievable": None, + "applies_to_processes": ["LPBF", "BJT"], + "applies_to_materials": ["316L", "17-4PH", "15-5PH"], + "time_h": 0.5, + "cost_relative": 1, + "note": "Does not change Ra. Restores passive layer and improves corrosion resistance.", + "sequence_priority": 5, + "functional_benefit": "corrosion_resistance" + }, + "anodizing": { + "label": "Anodizing", + "Ra_achievable": None, + "applies_to_processes": ["LPBF"], + "applies_to_materials": ["AlSi10Mg", "Scalmalloy"], + "time_h": 1, + "cost_relative": 2, + "note": "Does not change Ra. Protection, color, and surface hardness for Al.", + "sequence_priority": 5, + "functional_benefit": "surface_protection" + }, + "sanding": { + "label": "Manual sanding (abrasive paper)", + "Ra_achievable": (0.4, 4), + "applies_to_processes": ["FDM", "SLA", "DLP"], + "time_h": 0.5, + "cost_relative": 1, + "grit_sequence": "120 -> 240 -> 400 -> 800 -> 1200 for Ra <1um", + "note": "Low cost. Labor-intensive. Not suitable for complex geometries.", + "sequence_priority": 2 + }, + "acetone_smoothing": { + "label": "Acetone smoothing (ABS only)", + "Ra_achievable": (1.5, 5), + "applies_to_processes": ["FDM"], + "applies_to_materials": ["ABS"], + "time_h": 0.3, + "cost_relative": 1, + "note": "ABS ONLY. Changes dimensions by +/-0.1-0.3mm; account for tolerances. Toxic vapors.", + "sequence_priority": 2 + }, + "IPA_wash_UV_cure": { + "label": "IPA Wash + UV Post-Curing", + "Ra_achievable": (1, 6), + "applies_to_processes": ["SLA", "DLP", "MSLA"], + "time_h": 0.5, + "cost_relative": 1, + "note": "MANDATORY for resins. IPA 10-15min + UV 900-1200 mJ/cm^2.", + "sequence_priority": 1, + "mandatory": True + }, + "dyeing_SLS": { + "label": "Dyeing - SLS/MJF", + "Ra_achievable": None, + "applies_to_processes": ["SLS", "MJF"], + "time_h": 1, + "cost_relative": 1, + "note": "Does not change Ra. Uniform PA12 coloration. Hot process at 80-95C.", + "sequence_priority": 3, + "functional_benefit": "aesthetics" + }, + "SLS_coating": { + "label": "SLS Coating (Ceracoat, Duracoat)", + "Ra_achievable": (3, 6), + "applies_to_processes": ["SLS"], + "time_h": 0.5, + "cost_relative": 2, + "note": "Sealing + uniform color for PA12 SLS.", + "sequence_priority": 4 + }, + "HIP": { + "label": "HIP (Hot Isostatic Pressing)", + "Ra_achievable": None, + "applies_to_processes": ["LPBF", "EBM", "BJT"], + "time_h": 8, + "cost_relative": 8, + "note": "Closes internal porosity (<0.1%). Mandatory for biomedical and fatigue-critical parts. 900C / 150MPa / 3h (Ti).", + "sequence_priority": 2, + "functional_benefit": "density_porosity" + } +} + +def load_db(): + with open(DB_PATH) as f: + return json.load(f) + +def find_material(mat_id, db): + for m in db['polymers'] + db['metals']: + if m['id'].lower() == mat_id.lower(): + return m + return None + +def plan_route(mat_id, Ra_target, process, use_case=None): + db = load_db() + mat = find_material(mat_id, db) + if not mat: + avail = [m['id'] for m in db['polymers']+db['metals']] + return None, f"Material '{mat_id}' not found. Available: {', '.join(avail)}" + + ra_data = mat.get('surface_roughness', {}) + Ra_asbuilt = ra_data.get('Ra_asbuilt_typical', 50) + postproc_achievable = ra_data.get('postprocess_achievable', {}) + mat_process = mat.get('processes', [process]) + + route = [] + reasoning = [] + + # Step 1: mandatory process steps + if any(p in ['SLA','DLP','MSLA'] for p in mat_process): + route.append({ + "step": 1, "operation": "IPA Wash + UV Post-Curing", + "conditions": "IPA 90%+ / 10-15 min agitation; UV 405nm / 900-1200 mJ/cm^2", + "Ra_after": Ra_asbuilt, "mandatory": True, "reason": "MANDATORY for resins -> final mechanical properties" + }) + + # Step 2: stress relief (metalli) + if any(p in ['LPBF','EBM','BJT'] for p in mat_process): + ht = mat.get('heat_treatment', {}) + sr = ht.get('stress_relief', {}) + if sr: + route.append({ + "step": len(route)+1, "operation": "Stress Relief termico", + "conditions": f"{sr.get('temp_C','?')}°C / {sr.get('time_h','?')}h / {sr.get('atmosphere','?')}", + "Ra_after": Ra_asbuilt, "mandatory": sr.get('mandatory', True), + "reason": sr.get('timing', "Before removal from build plate") + " -> reduces residual stress and prevents distortion" + }) + + # Step 3: HIP if required by use case + if use_case in ['biomedical', 'fatigue_critical', 'pressure_vessel']: + if any(p in ['LPBF','EBM'] for p in mat_process): + route.append({ + "step": len(route)+1, "operation": "HIP (Hot Isostatic Pressing)", + "conditions": "~900C / 150 MPa / 3h / Argon (Ti); consult supplier for other materials", + "Ra_after": Ra_asbuilt, "mandatory": True, + "reason": f"Mandatory for {use_case} -> closes porosity <0.1%, uniform properties" + }) + + # Step 4: specific heat treatment + ht = mat.get('heat_treatment', {}) + for ht_key, ht_val in ht.items(): + if isinstance(ht_val, dict) and ht_val.get('mandatory', False): + if ht_key not in ['stress_relief']: + route.append({ + "step": len(route)+1, "operation": f"Heat Treatment: {ht_key.replace('_',' ').title()}", + "conditions": f"{ht_val.get('temp_C','?')}°C / {ht_val.get('time_h','?')}h / {ht_val.get('atmosphere','?')}", + "Ra_after": Ra_asbuilt, "mandatory": True, + "reason": ht_val.get('warning', ht_val.get('note', 'Required for final mechanical properties')) + }) + + # Step 5: support removal (if required) + if mat.get('flags', {}).get('supports_needed', False): + route.append({ + "step": len(route)+1, "operation": "Support removal", + "conditions": "Mechanical (pliers, cutters) + milling for metal supports. EDM for hard-to-access areas.", + "Ra_after": Ra_asbuilt, "mandatory": True, + "reason": "After heat treatment for metals -> NOT before stress relief" + }) + + # Step 6: Ra route + Ra_current = Ra_asbuilt + if Ra_target and Ra_current > Ra_target: + reasoning.append(f"Ra as-built: {Ra_asbuilt}µm → target: {Ra_target}µm → delta: {Ra_asbuilt-Ra_target:.1f}µm") + + # Choose optimal strategy + candidates = [] + for method, vals in postproc_achievable.items(): + if isinstance(vals, dict) and 'Ra_min' in vals: + if vals['Ra_min'] <= Ra_target: + candidates.append((method, vals['Ra_min'], vals)) + + # Sort by increasing cost + cost_map = {m: POSTPROCESS_CATALOG.get(m, {}).get('cost_relative', 3) for m, _, _ in candidates} + candidates.sort(key=lambda x: cost_map.get(x[0], 3)) + + if candidates: + best_method, best_Ra_min, best_vals = candidates[0] + catalog_entry = POSTPROCESS_CATALOG.get(best_method, {}) + route.append({ + "step": len(route)+1, + "operation": catalog_entry.get('label', best_method.replace('_',' ').title()), + "conditions": catalog_entry.get('grit_sequence', catalog_entry.get('note', '')), + "Ra_after": best_Ra_min, + "mandatory": False, + "reason": f"Required to reach target Ra {Ra_target}um (as-built: {Ra_asbuilt}um). Alternative: {candidates[1][0] if len(candidates)>1 else 'none'}" + }) + Ra_current = best_Ra_min + else: + reasoning.append(f"WARNING: target Ra {Ra_target}um is not reachable with standard post-processing for {mat_id}") + + # Step 7: additional functional treatments by use case + if use_case == 'food_contact' and mat_id in ['316L']: + route.append({ + "step": len(route)+1, "operation": "Electropolishing + Passivation", + "conditions": "Electropolish in perchloric/acetic acid; nitric passivation 20-25%", + "Ra_after": 0.5, "mandatory": True, + "reason": "Mandatory for food-contact -> Ra <0.8um + intact passive layer (FDA/EHEDG)" + }) + elif use_case == 'biomedical' and mat_id in ['316L', 'Ti-6Al-4V']: + route.append({ + "step": len(route)+1, "operation": "Electropolishing + Biomedical passivation", + "conditions": "ASTM F86 or equivalent. Ra <0.8um for contact surfaces.", + "Ra_after": 0.4, "mandatory": True, + "reason": "Biomedical standard -> biofilm prevention, controlled cell adhesion" + }) + + # Final step: inspection + if use_case in ['biomedical', 'fatigue_critical', 'aerospace', 'pressure_vessel']: + route.append({ + "step": len(route)+1, "operation": "Quality inspection", + "conditions": "CT scan (porosity) + CMM (dimensions) + hardness test" + (" + FPI (cracks)" if use_case in ['fatigue_critical','aerospace'] else ""), + "Ra_after": Ra_current, "mandatory": True, + "reason": f"Mandatory qualification for {use_case} application" + }) + + return route, reasoning + +def print_route(mat_id, route, reasoning, Ra_target): + print("\n" + "="*70) + print(f" POST-PROCESSING ROUTE — {mat_id}") + if Ra_target: + print(f" Target Ra: {Ra_target} µm") + print("="*70) + + if reasoning: + print("\n Notes:") + for r in reasoning: + print(f" {r}") + + print(f"\n Sequence ({len(route)} steps):") + for step in route: + flag = " [MANDATORY]" if step.get('mandatory') else " [recommended]" + print(f"\n STEP {step['step']}: {step['operation']}{flag}") + if step.get('conditions'): + print(f" Conditions: {step['conditions']}") + if step.get('Ra_after') and Ra_target: + print(f" Ra after: ~{step['Ra_after']} µm") + print(f" Why: {step['reason']}") + print("\n" + "="*70 + "\n") + +def main(): + parser = argparse.ArgumentParser(description="AM Post-Processing Route Planner") + parser.add_argument('--material', required=True, help="Material ID (e.g. AlSi10Mg, Ti-6Al-4V, PA12-SLS)") + parser.add_argument('--Ra', type=float, help="Final target Ra (µm)") + parser.add_argument('--process', default='LPBF',help="AM process used") + parser.add_argument('--use', help="Application: biomedical, food_contact, aerospace, fatigue_critical, pressure_vessel") + parser.add_argument('--json', action='store_true', help="JSON output") + args = parser.parse_args() + + route, reasoning = plan_route(args.material, args.Ra, args.process, args.use) + if route is None: + print(f"ERROR: {reasoning}") + sys.exit(1) + + if args.json: + import json as _json + print(_json.dumps({'material': args.material, 'Ra_target': args.Ra, 'route': route, 'notes': reasoning}, indent=2)) + else: + print_route(args.material, route, reasoning, args.Ra) + +if __name__ == '__main__': + main() diff --git a/additive-manufacturing/scripts/select_material.py b/additive-manufacturing/scripts/select_material.py new file mode 100644 index 0000000..78d38f4 --- /dev/null +++ b/additive-manufacturing/scripts/select_material.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +""" +AM Material Selector — Additive Manufacturing Expert Skill +Filters and ranks materials from the database based on engineering requirements. +Usage: python3 select_material.py --help +""" +import json, argparse, sys +from pathlib import Path + +DB_PATH = Path(__file__).parent.parent / "references" / "materials-db.json" + +def load_db(): + with open(DB_PATH) as f: + return json.load(f) + +def parse_range(val): + """Converts 'min-max' or a single number into (min, max).""" + if val is None: + return None, None + s = str(val) + if '-' in s: + parts = s.split('-') + return float(parts[0]), float(parts[1]) + return float(s), float('inf') + +def score_material(mat, req): + """Computes a 0-100 score for a material against requirements. Returns (score, reasons, disqualified).""" + score = 100 + reasons = [] + disqualified = [] + + mech = mat.get('mechanical', {}) + thermal = mat.get('thermal', {}) + flags = mat.get('flags', {}) + ra = mat.get('surface_roughness', {}) + + # --- ELIMINATION FILTERS --- + + # Service temperature + if req.get('T_service'): + T = req['T_service'] + T_max = thermal.get('T_max_service', 9999) + if isinstance(T_max, str): + T_max = float(T_max.replace('>','').replace('~','')) + if T_max < T: + disqualified.append(f"T_max_service={T_max}°C < required {T}°C") + + # Process + if req.get('process'): + proc = req['process'].upper() + mat_procs = [p.upper() for p in mat.get('processes', [])] + if not any(proc in p or p in proc for p in mat_procs): + disqualified.append(f"process {req['process']} not available (processes: {mat.get('processes')})") + + # Biocompatibility + if req.get('biocompatible'): + if not flags.get('biocompatible', False): + disqualified.append("biocompatibility required but not available") + + # UV resistant + if req.get('uv_resistant'): + if not flags.get('uv_resistant', False): + disqualified.append("UV resistance required but not guaranteed") + + # Minimum UTS + if req.get('UTS_min') and disqualified == []: + uts_min_req = req['UTS_min'] + uts_max_mat = mech.get('UTS_max') or mech.get('UTS_asbuilt_max') or mech.get('UTS_LPBF_max') or 0 + if uts_max_mat < uts_min_req: + disqualified.append(f"UTS_max={uts_max_mat} MPa < required {uts_min_req} MPa") + + # Target roughness (Ra) — check if achievable + if req.get('Ra_target') and disqualified == []: + Ra_req = req['Ra_target'] + Ra_asbuilt = ra.get('Ra_asbuilt_typical', 50) + postproc = ra.get('postprocess_achievable', {}) + Ra_achievable_min = Ra_asbuilt + best_method = "as-built" + for method, vals in postproc.items(): + if isinstance(vals, dict) and 'Ra_min' in vals: + if vals['Ra_min'] < Ra_achievable_min: + Ra_achievable_min = vals['Ra_min'] + best_method = method + if Ra_achievable_min > Ra_req: + disqualified.append(f"achievable Ra_min={Ra_achievable_min}µm > target {Ra_req}µm even with post-processing") + else: + if Ra_asbuilt > Ra_req: + reasons.append(f"target Ra {Ra_req}µm achievable with {best_method} (as-built: {Ra_asbuilt}µm)") + + if disqualified: + return 0, reasons, disqualified + + # --- POSITIVE SCORING --- + + # Temperature: more margin = better + if req.get('T_service'): + T = req['T_service'] + T_max = thermal.get('T_max_service', 9999) + if isinstance(T_max, (int, float)): + margin = T_max - T + if margin > 100: + score += 10 + reasons.append(f"excellent thermal margin (+{margin:.0f}°C)") + elif margin > 30: + score += 5 + + # UTS: margin against requirement + if req.get('UTS_min'): + uts_min_req = req['UTS_min'] + uts_max_mat = mech.get('UTS_max') or mech.get('UTS_asbuilt_max') or mech.get('UTS_LPBF_max') or 0 + if uts_max_mat > 0: + ratio = uts_max_mat / uts_min_req + if ratio > 2: + score += 10 + elif ratio > 1.5: + score += 5 + + # As-built Ra: if it already meets the target without post-processing -> advantage + if req.get('Ra_target'): + Ra_asbuilt = ra.get('Ra_asbuilt_typical', 50) + if Ra_asbuilt <= req['Ra_target']: + score += 15 + reasons.append(f"as-built Ra ({Ra_asbuilt}µm) already meets the target — no additional post-processing") + + # Printability + difficulty_map = { + "easy": 10, "moderate": 5, "difficult": 0, "very difficult": -5, "extreme": -10 + } + diff = mat.get('print_difficulty', '') + score += difficulty_map.get(diff, 0) + + # Cost + cost = mat.get('cost_relative', 5) + if cost <= 2: + score += 8 + reasons.append(f"low cost (index {cost})") + elif cost <= 5: + score += 4 + elif cost > 15: + score -= 10 + + # Isotropy + aniso = mech.get('anisotropy_Z_factor', 1.0) + if aniso >= 0.9: + score += 5 + reasons.append(f"good isotropy (Z/XY = {aniso})") + + # Quantity + if req.get('quantity') and req['quantity'] > 100: + procs = mat.get('processes', []) + if any(p in ['SLS', 'MJF'] for p in procs): + score += 8 + reasons.append("process well-suited for large series") + if any(p == 'LPBF' for p in procs) and req['quantity'] > 50: + score -= 5 # LPBF is expensive for large volumes + + return min(score, 100), reasons, [] + +def recommend(req, top_n=5): + db = load_db() + all_mats = db['polymers'] + db['metals'] + results = [] + eliminated = [] + + for mat in all_mats: + score, reasons, disqualified = score_material(mat, req) + if disqualified: + eliminated.append({'id': mat['id'], 'name': mat['name'], 'why': disqualified}) + else: + results.append({ + 'id': mat['id'], + 'name': mat['name'], + 'processes': mat.get('processes', []), + 'score': score, + 'reasons': reasons, + 'cost_relative': mat.get('cost_relative', '?'), + 'Ra_asbuilt': mat.get('surface_roughness', {}).get('Ra_asbuilt_typical', '?'), + 'T_max': mat.get('thermal', {}).get('T_max_service', '?'), + 'UTS_max': (mat.get('mechanical', {}).get('UTS_max') or + mat.get('mechanical', {}).get('UTS_asbuilt_max') or + mat.get('mechanical', {}).get('UTS_LPBF_max') or '?'), + 'postprocess_for_Ra': _ra_strategy(mat, req.get('Ra_target')) + }) + + results.sort(key=lambda x: x['score'], reverse=True) + return results[:top_n], eliminated + +def _ra_strategy(mat, Ra_target): + """Returns the post-processing strategy to reach target Ra.""" + if Ra_target is None: + return None + ra = mat.get('surface_roughness', {}) + Ra_asbuilt = ra.get('Ra_asbuilt_typical', 50) + if Ra_asbuilt <= Ra_target: + return f"as-built is sufficient (Ra_typical={Ra_asbuilt}µm)" + postproc = ra.get('postprocess_achievable', {}) + strategies = [] + for method, vals in postproc.items(): + if isinstance(vals, dict) and 'Ra_min' in vals: + if vals['Ra_min'] <= Ra_target: + note = vals.get('note', '') + strategies.append(f"{method} → Ra≥{vals['Ra_min']}µm" + (f" ({note})" if note else "")) + if strategies: + return "; or ".join(strategies) + return f"target Ra={Ra_target}µm NOT achievable (min={min((v['Ra_min'] for v in postproc.values() if isinstance(v,dict) and 'Ra_min' in v), default=Ra_asbuilt)}µm)" + +def print_report(results, eliminated, req): + print("\n" + "="*70) + print(" AM MATERIAL SELECTOR — Results") + print("="*70) + print(f"\n Requirements analyzed:") + for k, v in req.items(): + if v is not None: + print(f" {k}: {v}") + print(f"\n Materials evaluated: {len(results)+len(eliminated)}") + print(f" Eligible: {len(results)} | Eliminated: {len(eliminated)}") + + print("\n" + "-"*70) + print(" TOP CANDIDATES (sorted by score)") + print("-"*70) + for i, r in enumerate(results): + print(f"\n [{i+1}] {r['name']} (score: {r['score']}/100)") + print(f" Processes: {', '.join(r['processes'])}") + print(f" UTS_max: {r['UTS_max']} MPa | T_max: {r['T_max']}°C | Ra_asbuilt: {r['Ra_asbuilt']}µm | Cost: {r['cost_relative']}/10") + if r['postprocess_for_Ra']: + print(f" Ra strategy: {r['postprocess_for_Ra']}") + if r['reasons']: + for reason in r['reasons'][:3]: + print(f" ✓ {reason}") + + if eliminated: + print("\n" + "-"*70) + print(f" ELIMINATED ({len(eliminated)}) — main reasons") + print("-"*70) + shown = 0 + for e in eliminated[:10]: + print(f" ✗ {e['name']}: {'; '.join(e['why'][:2])}") + shown += 1 + if len(eliminated) > shown: + print(f" ... and {len(eliminated)-shown} more") + print("\n" + "="*70 + "\n") + +def main(): + parser = argparse.ArgumentParser(description="AM Material Selector — filters materials by engineering requirements") + parser.add_argument('--T', type=float, help="Max service temperature (°C)") + parser.add_argument('--UTS', type=float, help="Minimum required UTS (MPa)") + parser.add_argument('--Ra', type=float, help="Target surface roughness Ra (µm)") + parser.add_argument('--process', type=str, help="Specific process (FDM, SLS, LPBF, etc.)") + parser.add_argument('--bio', action='store_true', help="Biocompatibility required") + parser.add_argument('--uv', action='store_true', help="UV resistance required") + parser.add_argument('--qty', type=int, help="Quantity (pcs)") + parser.add_argument('--top', type=int, default=5, help="Number of results (default: 5)") + parser.add_argument('--json', action='store_true', help="JSON output") + + args = parser.parse_args() + + req = { + 'T_service': args.T, + 'UTS_min': args.UTS, + 'Ra_target': args.Ra, + 'process': args.process, + 'biocompatible':args.bio or None, + 'uv_resistant': args.uv or None, + 'quantity': args.qty + } + req = {k: v for k, v in req.items() if v} + + if not req: + print("ERROR: specify at least one requirement. Use --help for parameters.") + sys.exit(1) + + results, eliminated = recommend(req, top_n=args.top) + + if args.json: + print(json.dumps({'results': results, 'eliminated': eliminated}, indent=2)) + else: + print_report(results, eliminated, req) + +if __name__ == '__main__': + main()