🌐 EN | 🇯🇵 JP | Last sync: 2025-11-16

Chapter 4: Fundamentals of Additive Manufacturing

Principles and Classification of AM Technologies - 3D Printing Technical Framework

📚 3D Printing Introduction Series ⏱️ Reading time: 35-40 minutes 🎓 Difficulty: Beginner to Intermediate

Learning Objectives

Upon completing this chapter, you will be able to explain:

Basic Understanding (Level 1)

Practical Skills(Level 2)

Application Skills (Level 3)

1.1 What is Additive Manufacturing (AM)?

1.1.1 Definition of Additive Manufacturing

Additive Manufacturing (AM) is defined by ISO/ASTM 52900:2021 standard as "the process of manufacturing objects by adding material layer by layer from 3D CAD data".In contrast to traditional subtractive machining (material removal), AM adds material only where needed, providing the following innovative characteristics:

💡 Industrial Importance

The AM market is growing rapidly. According to Wohlers Report 2023:

1.1.2 History and Evolution of AM

Additive manufacturing technology has approximately 40 years of history, evolving through the following milestones:

flowchart LR
    A[1986
SLA Invented
Chuck Hull] --> B[1988
SLS Introduced
Carl Deckard] B --> C[1992
FDM Patent
Stratasys Inc.] C --> D[2005
RepRap
Open Source] D --> E[2012
Metal AM Adoption
EBM/SLM] E --> F[2023
Industrial Acceleration
Large-scale & High-speed] style A fill:#e3f2fd style B fill:#fff3e0 style C fill:#e8f5e9 style D fill:#f3e5f5 style E fill:#fce4ec style F fill:#fff9c4
  1. 1986year: ステレオリソグラフィ(SLA)発明 - Chuck HullDr.(3D Systems社創業者)光硬化樹脂layers状硬化せる最初AM技術発明(US Patent 4,575,330)。「3Dプリンティング」う言葉もこ時期誕生。
  2. 1988year: 選択的laser焼結(SLS)登場 - Carl DeckardDr.(テキサス大学)laserat/in/with粉末材料焼結する技術開発。metalandセラミックスへ応用possibility開く。
  3. 1992year: 熱溶解productlayers(FDM)特許 - Stratasys Inc.FDM技術商用化。現在最も普及してる3Dプリンティング方equation/formula基礎確立。
  4. 2005year: RepRapプロジェクト - Adrian Bowyer教授Open Source3Dプリンタ「RepRap」発表。特許切れ相まってLow価格化・民主化進展。
  5. 2012year以降: metalAM産業普及 - 電子ビーム溶解(EBM)、選択的laser溶融(SLM)航空宇宙・医療minutes野at/in/withactual用化。GE AviationFUEL噴射nozzle量産開始。
  6. 2023year現在: 大型化・Highspeed化時代 - バインダージェット、連続繊維複合材AM、Multi-materialAMなど新技術産業actual装段階へ。

1.1.3 Major Application Areas of AM

Application 1: Rapid Prototyping

The first major application of AM, for rapid manufacturing of prototypes for design verification, functional testing, and market evaluation:

Application 2: Tooling & Fixtures

Application of manufacturing jigs, tools, and molds used in production facilities with AM:

Application 3: End-Use Parts

Direct manufacturing of end-use products with AM has been rapidly increasing in recent years:

⚠️ AM Constraints and Challenges

AM is not universal and has the following constraints:

1.2 Seven AM Process Categories by ISO/ASTM 52900

1.2.1 Overview of AM Process Classification

ISO/ASTM 52900:2021規格at/in/with、すべてAM技術エネルギー源材料供給方法基づて7つprocessカテゴリCategoryしてます。各process固有長所・短所あり、用途応じて最適な技術選択する必要あります。

flowchart TD
    AM[productlayersbuild
7つprocess] --> MEX[Material Extrusion
Material Extrusion] AM --> VPP[Vat Photopolymerization
液槽光重合] AM --> PBF[Powder Bed Fusion
粉末床溶融結合] AM --> MJ[Material Jetting
材料噴射] AM --> BJ[Binder Jetting
結合剤噴射] AM --> SL[Sheet Lamination
シートproductlayers] AM --> DED[Directed Energy Deposition
指向性エネルギー堆product] MEX --> MEX_EX[FDM/FFF
Low Cost& Widespread] VPP --> VPP_EX[SLA/DLP
HighAccuracy・HighSurface Quality] PBF --> PBF_EX[SLS/SLM/EBM
High Strength・metal対応] style AM fill:#f093fb style MEX fill:#e3f2fd style VPP fill:#fff3e0 style PBF fill:#e8f5e9 style MJ fill:#f3e5f5 style BJ fill:#fce4ec style SL fill:#fff9c4 style DED fill:#fce4ec

1.2.2 Material Extrusion (MEX)

Principle: Thermoplastic filament is heated and melted, then extruded through a nozzle for layer-by-layer deposition. The most widespread technology (also called FDM/FFF).

process: フィラメント → heatingnozzle(190-260°C)→ 溶融押出 → 冷却solidification → next/orderlayersproductlayers

Characteristics:

Applications:

💡 Representative FDM Equipment

1.2.3 Vat Photopolymerization (VPP)

Principle: Liquid photopolymer resin is selectively cured layer by layer using ultraviolet (UV) laser or projector light.

process: UVexposure → 光重合反応 → solidification → ビルドプラットフォーム上昇 → next/orderlayersexposure

Two main VPP methods:

  1. SLA(Stereolithography): UV laser(355 nm)ガルバノミラーat/in/with走査し、点描的硬化。HighAccuracyだLowspeed。
  2. DLP (Digital Light Processing): Entire layer exposed at once with projector. Fast but resolution depends on projector pixel count (Full HD: 1920×1080).
  3. LCD-MSLA(Masked SLA): LCDマスク使用、DLP類似だLow Cost化($200-$1,000デスクトップ機多数)。

Characteristics:

Applications:

1.2.4 Powder Bed Fusion (PBF)

Principle: Powder material is spread in thin layers, selectively melted or sintered with laser or electron beam, then cooled and solidified. Compatible with metals, polymers, and ceramics.

process: powder spreading → laser/電子ビーム走査 → 溶融・焼結 → solidification → next/orderlayerspowder spreading

Three main PBF methods:

  1. SLS (Selective Laser Sintering): Laser sintering of polymer powder (PA12 nylon etc.). No support needed (surrounding powder provides support).
  2. SLM (Selective Laser Melting): Complete melting of metal powder (Ti-6Al-4V, AlSi10Mg, Inconel 718 etc.). Can produce high-density parts (relative density >99%).
  3. EBM(Electron Beam Melting): 電子ビームat/in/withmetal粉末溶融。Hightemperature予熱(650-1000°C)より残留応力小く、Build SpeedFast。

Characteristics:

Applications:

1.2.5 Material Jetting (MJ)

Principle: Similar to inkjet printers, droplets of material (photopolymer resin or wax) are jetted from heads and immediately cured with UV exposure for layer-by-layer build.

Characteristics:

Applications:: Medical anatomical models (soft/hard tissue reproduced with different materials), full-color architectural models, design verification models

1.2.6 Binder Jetting (BJ)

Principle: Liquid binder (adhesive) is jetted inkjet-style onto powder bed to bond powder particles. Strength improved through sintering or infiltration after build.

Characteristics:

Applications:: Sand molds for casting (large castings like engine blocks), metal parts (Desktop Metal, HP Metal Jet), full-color figures (souvenirs, educational models)

1.2.7 Sheet Lamination (SL)

Principle: Sheet materials (paper, metal foil, plastic film) are laminated and bonded by adhesive or welding. Each layer contour-cut with laser or blade.

Representative Technologies:

Characteristics: 大型build可能、材料費安価、AccuracyMedium程度、用途限定的(主視覚モデル、metalat/in/with埋込センサー等)

1.2.8 Directed Energy Deposition (DED)

Principle: Metal powder or wire fed and melted with laser, electron beam, or arc, then deposited on substrate. Used for large parts and repair of existing parts.

Characteristics:

Applications:: タービンブレード補修、大型Aerospace Components、工具耐摩耗コーティング

⚠️ Process Selection Guidelines

The optimal AM process varies by application requirements:

1.3 STL File Format and Data Processing

1.3.1 Structure of STL Files

STL (STereoLithography) is the most widely used 3D model file format in AM, developed by 3D Systems in 1987.STL files represent object surfaces as a collection of triangle meshes.

Basic Structure of STL Files

STL file = Normal vector (n) + 3 vertex coordinates (v1, v2, v3) × Number of triangles

ASCII STL形equation/formulaExample:

solid cube
  facet normal 0 0 1
    outer loop
      vertex 0 0 10
      vertex 10 0 10
      vertex 10 10 10
    endloop
  endfacet
  facet normal 0 0 1
    outer loop
      vertex 0 0 10
      vertex 10 10 10
      vertex 0 10 10
    endloop
  endfacet
  ...
endsolid cube

Two types of STL format:

  1. ASCII STL: Human-readable text format. Large file size (10-20 times Binary for same model). Useful for debugging and verification.
  2. Binary STL: Binary format, small file size, fast processing. Standard for industrial use. Structure: 80-byte header + 4 bytes (triangle count) + 50 bytes per triangle (normal 12B + vertices 36B + attributes 2B).

1.3.2 Important Concepts of STL Files

1. Normal Vector

Each triangular face has a normal vector (outward direction) defined to distinguish between "inside" and "outside" of the object.Normal direction is determined by the right-hand rule:

法線n = (v2 - v1) × (v3 - v1) / |(v2 - v1) × (v3 - v1)|

Vertex Ordering Rule: Vertices v1, v2, v3 are arranged counter-clockwise (CCW), so that the normal points outward when viewed from outside.

2. Manifold Conditions

For an STL mesh to be 3D printable, it must be manifold:

⚠️ Non-Manifold Mesh Problems

Non-manifold meshes are not 3D printable. Typical problems:

These problems cause errors in slicer software and lead to build failures.

1.3.3 STL File Quality Metrics

STL mesh quality is evaluated by the following metrics:

  1. Triangle Count: Typically 10,000-500,000. Avoid too few (coarse model) or too many (large file size, processing delays).
  2. Edge Length Uniformity: Quality degrades with extreme variation in triangle sizes. Ideally in 0.1-1.0 mm range.
  3. Aspect Ratio: Elongated triangles (high aspect ratio) cause numerical errors. Ideally aspect ratio < 10.
  4. Normal Consistency: All normals consistently outward. Mixed inverted normals cause inside/outside determination errors.
💡 STL Fileresolutionトレードオフ

STLメッシュresolution(triangle数)Accuracyファイルサイズトレードオフat/in/withす:

CADソフトat/in/withSTLエクスポート時、Chordal Tolerance(chordal tolerance)またAngle Tolerance(angular tolerance)at/in/withresolution制御します。recommended value:chordal tolerance0.01-0.1 mm、angular tolerance5-15度。

1.3.4 STL Processing with Python Libraries

Major Python libraries for handling STL files:

  1. numpy-stl: Fast STL read/write, volume and surface area calculation, normal vector operations. Simple and lightweight.
  2. trimesh: Comprehensive 3D mesh processing library. Mesh repair, Boolean operations, ray casting, collision detection. Feature-rich but many dependencies.
  3. PyMesh: Advanced mesh processing (remeshing, subdivision, feature extraction). Somewhat complex installation.

numpy-stl基number of的な使用法:

# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0

"""
Example: numpy-stl基number of的な使用法:

Purpose: Demonstrate core concepts and implementation patterns
Target: Beginner to Intermediate
Execution time: ~5 seconds
Dependencies: None
"""

from stl import mesh
import numpy as np

# STL File読み込み
your_mesh = mesh.Mesh.from_file('model.stl')

# 基number of的な幾何情報
volume, cog, inertia = your_mesh.get_mass_properties()
print(f"Volume: {volume:.2f} mm³")
print(f"Center of Gravity: {cog}")
print(f"Surface Area: {your_mesh.areas.sum():.2f} mm²")

# triangle数
print(f"Number of Triangles: {len(your_mesh.vectors)}")

1.4 Slicing and Toolpath Generation

The process of converting STL files into commands (G-code) that 3D printers can understand is called slicing.こセクションat/in/with、スライシング基number ofPrinciple、ツールパス戦略、そしてG-code基礎学びます。

1.4.1 Basic Principles of Slicing

Slicing is the process of horizontally cutting a 3D model at constant height (layer height) and extracting the contour of each layer:

flowchart TD
    A[3D Model
STL File] --> B[In Z-axis direction
Layer-wise slicing] B --> C[Contour extraction for each layer
Contour Detection] C --> D[Shell generation
Perimeter Path] D --> E[Infill generation
Infill Path] E --> F[Add support
Support Structure] F --> G[Toolpath optimization
Retraction/Travel] G --> H[G-code output] style A fill:#e3f2fd style H fill:#e8f5e9

Layer Height Selection

Layer height is the most important parameter determining the tradeoff between build quality and build time:

Layer Height Build Quality Build Time Typical Applications
0.1 mm (Ultra-fine) Very high (layer lines nearly invisible) Very long (×2-3 times) Figurines, medical models, end-use parts
0.2 mm (Standard) Good (layer lines visible but acceptable) Standard General prototypes, functional parts
0.3 mm (Coarse) Low (layer lines obvious) Short (×0.5 times) Initial prototypes, internal structure parts
⚠️ Layer Height制approximately

Layer Heightnozzle径25-80%settingする必要あります。Exampleえば0.4mmnozzle場合、Layer Height0.1-0.32mm推奨範囲at/in/withす。Exceeding this causes insufficient resin extrusion or the nozzle dragging previous layers.

1.4.2 Shell and Infill Strategies

Shell (Perimeter) Generation

Shell/Perimeter is the path forming the outer periphery of each layer:

Infill (Internal Fill) Patterns

Infill forms internal structure and controls strength and material usage:

Pattern Strength Print Speed Material Usage Characteristics
Grid Medium Fast Medium シンプル、等方性、Standard的な選択
Honeycomb High Slow Medium High Strength、重量比優秀、航空宇宙用途
Gyroid 非常High Medium Medium 3D isotropic, curved, latest recommendation
Concentric Low Fast Low Flexibility focused, follows shell
Lines Low(異方性) 非常Fast Low Highspeed印刷、方向性Strength
💡 Infill Density Guidelines

1.4.3 Support Structure Generation

Parts with overhang angles exceeding 45 degrees require support structures:

Support Types

Important Support Parameters

パラメータ recommended value 効果
Overhang Angle 45-60° Generate support above this angle
Support Density 10-20% 密度Highほど安定だ除去困難
Support Z Distance 0.2-0.3 mm Gap between support and part (ease of removal)
Interface Layers 2-4 layers 接合layers数(Surface Quality除去性バランス)

1.4.4 G-code Fundamentals

G-code、3DプリンタandCNCマシン制御するStandard的な数値制御言語at/in/withす。各行1つCommand表します:

Major G-code Commands

Command Category Function Example
G0 Movement HighspeedMovement(非押出) G0 X100 Y50 Z10 F6000
G1 Movement 直線Movement(押出あり) G1 X120 Y60 E0.5 F1200
G28 Initialization Return to home position G28 (all axes), G28 Z (Z-axis only)
M104 Temperature nozzleTemperaturesetting(非wait) M104 S200
M109 Temperature nozzleTemperaturesetting(wait) M109 S210
M140 Temperature bedTemperaturesetting(非wait) M140 S60
M190 Temperature bedTemperaturesetting(wait) M190 S60

G-codeExample(build開始部minutes)

; === Start G-code ===
M140 S60       ; Start bed heating to 60°C (non-blocking)
M104 S210      ; Start nozzle heating to 210°C (non-blocking)
G28            ; Home all axes
G29            ; Auto-leveling (bed mesh measurement)
M190 S60       ; bedTemperature到達wait
M109 S210      ; nozzleTemperature到達wait
G92 E0         ; Reset extrusion to zero
G1 Z2.0 F3000  ; Raise Z-axis 2mm (safety)
G1 X10 Y10 F5000  ; プライム位置へMovement
G1 Z0.3 F3000  ; Z軸0.3mmへ降下(初layersHigh)
G1 X100 E10 F1500 ; Draw prime line (clear nozzle)
G92 E0         ; Reset extrusion again to zero
; === Build start ===

1.4.5 Major Slicing Software

Software License Characteristics Recommended Use
Cura Open Source 使andす、豊富なプリセット、Tree SupportStandard搭載 初心者〜Mediumlevel users、FDM汎用
PrusaSlicer Open Source High度なsetting、variableLayer Height、カスタムsupport Mediumlevel users〜上level users、最適化重視
Slic3r Open Source Original PrusaSlicer, lightweight Legacy systems, research applications
Simplify3D Commercial ($150) Highspeedスライシング、マルチprocess、詳細制御 Professional, industrial applications
IdeaMaker Free Raise3D専用だ汎用性High、直感的UI Raise3D users, beginners

1.4.6 Toolpath Optimization Strategies

効率的なツールパス、Build Time・品質・Material Usage改善します:

Example 1: STL File読み込み基number of情報取得

# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0

"""
Example: Example 1: STL File読み込み基number of情報取得

Purpose: Demonstrate neural network implementation
Target: Beginner to Intermediate
Execution time: 5-10 seconds
Dependencies: None
"""

# ===================================
# Example 1: STL File読み込み基number of情報取得
# ===================================

import numpy as np
from stl import mesh

# STL File読み込む
your_mesh = mesh.Mesh.from_file('model.stl')

# Get basic geometric information
volume, cog, inertia = your_mesh.get_mass_properties()

print("=== STL File基number of情報 ===")
print(f"Volume: {volume:.2f} mm³")
print(f"Surface Area: {your_mesh.areas.sum():.2f} mm²")
print(f"Center of Gravity: [{cog[0]:.2f}, {cog[1]:.2f}, {cog[2]:.2f}] mm")
print(f"Number of Triangles: {len(your_mesh.vectors)}")

# Calculate bounding box (minimum enclosing box)
min_coords = your_mesh.vectors.min(axis=(0, 1))
max_coords = your_mesh.vectors.max(axis=(0, 1))
dimensions = max_coords - min_coords

print(f"\n=== Bounding Box ===")
print(f"X: {min_coords[0]:.2f} to {max_coords[0]:.2f} mm (Width: {dimensions[0]:.2f} mm)")
print(f"Y: {min_coords[1]:.2f} to {max_coords[1]:.2f} mm (Depth: {dimensions[1]:.2f} mm)")
print(f"Z: {min_coords[2]:.2f} to {max_coords[2]:.2f} mm (High: {dimensions[2]:.2f} mm)")

# Build Time簡易estimation(Layer Height0.2mm、speed度50mm/s仮定)
layer_height = 0.2  # mm
print_speed = 50    # mm/s
num_layers = int(dimensions[2] / layer_height)
# Simple calculation: estimate based on surface area
estimated_path_length = your_mesh.areas.sum() / layer_height  # mm
estimated_time_seconds = estimated_path_length / print_speed
estimated_time_minutes = estimated_time_seconds / 60

print(f"\n=== Build Estimation ===")
print(f"Number of layers (0.2mm/layer): {num_layers} layers")
print(f"estimationBuild Time: {estimated_time_minutes:.1f} minutes ({estimated_time_minutes/60:.2f} hours)")

# outputExample:
# === STL File基number of情報 ===
# Volume: 12450.75 mm³
# Surface Area: 5832.42 mm²
# Center of Gravity: [25.34, 18.92, 15.67] mm
# Number of Triangles: 2456
#
# === Bounding Box ===
# X: 0.00 to 50.00 mm (Width: 50.00 mm)
# Y: 0.00 to 40.00 mm (Depth: 40.00 mm)
# Z: 0.00 to 30.00 mm (High: 30.00 mm)
#
# === Build Estimation ===
# Number of layers (0.2mm/layer): 150 layers
# estimationBuild Time: 97.2 minutes (1.62 hours)

Example 2: Mesh Normal Vector Verification

# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0

# ===================================
# Example 2: Mesh Normal Vector Verification
# ===================================

import numpy as np
from stl import mesh

def check_normals(mesh_data):
    """Check consistency of normal vectors in STL mesh

    Args:
        mesh_data: numpy-stl Mesh object

    Returns:
        tuple: (flipped_count, total_count, percentage)
    """
    # Check normal direction with right-hand rule
    flipped_count = 0
    total_count = len(mesh_data.vectors)

    for i, facet in enumerate(mesh_data.vectors):
        v0, v1, v2 = facet

        # Calculate edge vectors
        edge1 = v1 - v0
        edge2 = v2 - v0

        # Calculate normal with cross product (right-hand)
        calculated_normal = np.cross(edge1, edge2)

        # Normalize
        norm = np.linalg.norm(calculated_normal)
        if norm > 1e-10:  # Confirm not zero vector
            calculated_normal = calculated_normal / norm
        else:
            continue  # Skip degenerate triangles

        # Compare with stored normal in file
        stored_normal = mesh_data.normals[i]
        stored_norm = np.linalg.norm(stored_normal)

        if stored_norm > 1e-10:
            stored_normal = stored_normal / stored_norm

        # Check direction match with dot product
        dot_product = np.dot(calculated_normal, stored_normal)

        # If dot product negative, opposite direction
        if dot_product < 0:
            flipped_count += 1

    percentage = (flipped_count / total_count) * 100 if total_count > 0 else 0

    return flipped_count, total_count, percentage

# STL File読み込み
your_mesh = mesh.Mesh.from_file('model.stl')

# Execute normal check
flipped, total, percent = check_normals(your_mesh)

print("=== Normal Vector Verification Results ===")
print(f"Total triangles: {total}")
print(f"Flipped normals: {flipped}")
print(f"Flip rate: {percent:.2f}%")

if flipped == 0:
    print("\n✅ All normals point in correct direction")
    print("   This mesh is 3D printable")
elif percent < 5:
    print("\n⚠️ Some normals are flipped (minor)")
    print("   スライサー自動修正するpossibilityHigh")
else:
    print("\n❌ Many normals are flipped (critical)")
    print("   Recommend repair with mesh repair tools (Meshmixer, netfabb)")

# outputExample:
# === Normal Vector Verification Results ===
# Total triangles: 2456
# Flipped normals: 0
# Flip rate: 0.00%
#
# ✅ All normals point in correct direction
#    This mesh is 3D printable

Example 3: Manifold Check

# ===================================
# Example 3: Manifold (Watertight) Check
# ===================================

import trimesh

# STL File読み込み(trimesh自動at/in/with修復試みる)
mesh = trimesh.load('model.stl')

print("=== Mesh Quality Diagnosis ===")

# Basic information
print(f"Vertex count: {len(mesh.vertices)}")
print(f"Face count: {len(mesh.faces)}")
print(f"Volume: {mesh.volume:.2f} mm³")

# Check manifold property
print(f"\n=== 3D Print Suitability Check ===")
print(f"Is watertight: {mesh.is_watertight}")
print(f"Is winding consistent: {mesh.is_winding_consistent}")
print(f"Is valid: {mesh.is_valid}")

# Diagnose problem details
if not mesh.is_watertight:
    # Detect number of holes
    try:
        edges = mesh.edges_unique
        edges_sorted = mesh.edges_sorted
        duplicate_edges = len(edges_sorted) - len(edges)
        print(f"\n⚠️ Problem detected:")
        print(f"   - Mesh has holes")
        print(f"   - Duplicate edges: {duplicate_edges}")
    except:
        print(f"\n⚠️ Mesh structure has problems")

# Attempt repair
if not mesh.is_watertight or not mesh.is_winding_consistent:
    print(f"\n🔧 自動修復actual行Medium...")

    # Fix normals
    trimesh.repair.fix_normals(mesh)
    print("   ✓ Fixed normal vectors")

    # Fill holes
    trimesh.repair.fill_holes(mesh)
    print("   ✓ Filled holes")

    # Remove degenerate faces
    mesh.remove_degenerate_faces()
    print("   ✓ Removed degenerate faces")

    # Merge duplicate vertices
    mesh.merge_vertices()
    print("   ✓ Merged duplicate vertices")

    # Check post-repair status
    print(f"\n=== Post-repair Status ===")
    print(f"Is watertight: {mesh.is_watertight}")
    print(f"Is winding consistent: {mesh.is_winding_consistent}")

    # Save repaired mesh
    if mesh.is_watertight:
        mesh.export('model_repaired.stl')
        print(f"\n✅ Repair complete! Saved as model_repaired.stl")
    else:
        print(f"\n❌ Automatic repair failed. Recommend dedicated tools like Meshmixer")
else:
    print(f"\n✅ This mesh is 3D printable")

# outputExample:
# === Mesh Quality Diagnosis ===
# Vertex count: 1534
# Face count: 2456
# Volume: 12450.75 mm³
#
# === 3D Print Suitability Check ===
# Is watertight: True
# Is winding consistent: True
# Is valid: True
#
# ✅ This mesh is 3D printable

Example 4: Basic Slicing Algorithm

# Requirements:
# - Python 3.9+
# - numpy>=1.24.0, <2.0.0

# ===================================
# Example 4: Basic Slicing Algorithm
# ===================================

import numpy as np
from stl import mesh

def slice_mesh_at_height(mesh_data, z_height):
    """Temperatureprofile生成

    Args:
        t (array): hoursarray [min]
        T_target (float): holdingTemperature [°C]
        heating_rate (float): heating rate [°C/min]
        hold_time (float): holdinghours [min]
        cooling_rate (float): cooling rate [°C/min]

    Returns:
        array: Temperatureprofile [°C]
    """
    T_room = 25  # room temperature
    T = np.zeros_like(t)

    # heatinghours
    t_heat = (T_target - T_room) / heating_rate

    # 冷却開始時刻
    t_cool_start = t_heat + hold_time

    for i, time in enumerate(t):
        if time <= t_heat:
            # heatingフェーズ
            T[i] = T_room + heating_rate * time
        elif time <= t_cool_start:
            # holdingフェーズ
            T[i] = T_target
        else:
            # 冷却フェーズ
            T[i] = T_target - cooling_rate * (time - t_cool_start)
            T[i] = max(T[i], T_room)  # room temperature以下ならな

    return T

def simulate_reaction_progress(T, t, Ea, D0, r0):
    """Temperatureprofile基づくreaction progress計算

    Args:
        T (array): Temperatureprofile [°C]
        t (array): hoursarray [min]
        Ea (float): activation energy [J/mol]
        D0 (float): frequency factor [m²/s]
        r0 (float): particle radius [m]

    Returns:
        array: conversion rate
    """
    R = 8.314
    C0 = 10000
    alpha = np.zeros_like(t)

    for i in range(1, len(t)):
        T_k = T[i] + 273.15
        D = D0 * np.exp(-Ea / (R * T_k))
        k = D * C0 / r0**2

        dt = (t[i] - t[i-1]) * 60  # min → s

        # 簡易productminutes(微小hoursat/in/withreaction progress)
        if alpha[i-1] < 0.99:
            dalpha = k * dt / (2 * (1 - (1-alpha[i-1])**(1/3)))
            alpha[i] = min(alpha[i-1] + dalpha, 1.0)
        else:
            alpha[i] = alpha[i-1]

    return alpha

# パラメータsetting
T_target = 1200  # °C
hold_time = 240  # min (4 hours)
Ea = 300e3  # J/mol
D0 = 5e-4  # m²/s
r0 = 5e-6  # m

# 異なるheating rateat/in/withcomparison
heating_rates = [2, 5, 10, 20]  # °C/min
cooling_rate = 3  # °C/min

# hoursarray
t_max = 800  # min
t = np.linspace(0, t_max, 2000)

# plot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))

# Temperatureprofile
for hr in heating_rates:
    T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
    ax1.plot(t/60, T_profile, linewidth=2, label=f'{hr}°C/min')

ax1.set_xlabel('Time (hours)', fontsize=12)
ax1.set_ylabel('Temperature (°C)', fontsize=12)
ax1.set_title('Temperature Profiles', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_xlim([0, t_max/60])

# reaction progress
for hr in heating_rates:
    T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
    alpha = simulate_reaction_progress(T_profile, t, Ea, D0, r0)
    ax2.plot(t/60, alpha, linewidth=2, label=f'{hr}°C/min')

ax2.axhline(y=0.95, color='red', linestyle='--', linewidth=1, label='Target (95%)')
ax2.set_xlabel('Time (hours)', fontsize=12)
ax2.set_ylabel('Conversion', fontsize=12)
ax2.set_title('Reaction Progress', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)
ax2.set_xlim([0, t_max/60])
ax2.set_ylim([0, 1])

plt.tight_layout()
plt.savefig('temperature_profile_optimization.png', dpi=300, bbox_inches='tight')
plt.show()

# 各heating rateat/in/with95%reaction attainmenthours計算
print("\n95%reaction attainmenthourscomparison:")
print("=" * 60)
for hr in heating_rates:
    T_profile = temperature_profile(t, T_target, hr, hold_time, cooling_rate)
    alpha = simulate_reaction_progress(T_profile, t, Ea, D0, r0)

    # 95%到達時刻
    idx_95 = np.where(alpha >= 0.95)[0]
    if len(idx_95) > 0:
        t_95 = t[idx_95[0]] / 60
        print(f"heating rate {hr:2d}°C/min: t₉₅ = {t_95:.1f} hours")
    else:
        print(f"heating rate {hr:2d}°C/min: 反応不完全")

# outputExample:
# 95%reaction attainmenthourscomparison:
# ============================================================
# heating rate  2°C/min: t₉₅ = 7.8 hours
# heating rate  5°C/min: t₉₅ = 7.2 hours
# heating rate 10°C/min: t₉₅ = 6.9 hours
# heating rate 20°C/min: t₉₅ = 6.7 hours

Exercises

1.5.1 pycalphad

pycalphad、CALPHAD(CALculation of PHAse Diagrams)法基づく相図計算ためPythonライブラリat/in/withす。熱力学データベースから平衡相計算し、反応経路設計有用at/in/withす。

💡 CALPHAD法利点

1.5.2 二元system相図計算Example

# ===================================
# Example 5: pycalphadat/in/with相図計算
# ===================================

# 注意: pycalphadインストール必要
# pip install pycalphad

from pycalphad import Database, equilibrium, variables as v
import matplotlib.pyplot as plt
import numpy as np

# TDBデータベース読み込み(ここat/in/with簡易的なExample)
# actual際適切なTDBファイル必要
# Example: BaO-TiO2system

# 簡易的なTDB文字列(actual際より複雑)
tdb_string = """
$ BaO-TiO2 system (simplified)
ELEMENT BA   BCC_A2  137.327   !
ELEMENT TI   HCP_A3   47.867   !
ELEMENT O    GAS      15.999   !

FUNCTION GBCCBA   298.15  +GHSERBA;   6000 N !
FUNCTION GHCPTI   298.15  +GHSERTI;   6000 N !
FUNCTION GGASO    298.15  +GHSERO;    6000 N !

PHASE LIQUID:L %  1  1.0  !
PHASE BAO_CUBIC %  2  1 1  !
PHASE TIO2_RUTILE %  2  1 2  !
PHASE BATIO3 %  3  1 1 3  !
"""

# 注: actual際計算正equation/formulaなTDBファイル必要
# ここat/in/with概念的な説明留める

print("pycalphadよる相図計算概念:")
print("=" * 60)
print("1. TDBデータベース(熱力学データ)読み込む")
print("2. Temperature・組成範囲setting")
print("3. 平衡計算actual行")
print("4. 安定相可視化")
print()
print("actual際適用Example:")
print("- BaO-TiO2system: BaTiO3形成Temperature・組成範囲")
print("- Si-Nsystem: Si3N4安定領域")
print("- 多元systemセラミックス相関係")

# 概念的なplot(actualデータ基づくイメージ)
fig, ax = plt.subplots(figsize=(10, 7))

# Temperature範囲
T = np.linspace(800, 1600, 100)

# 各相安定領域(概念図)
# BaO + TiO2 → BaTiO3 反応
BaO_region = np.ones_like(T) * 0.3
TiO2_region = np.ones_like(T) * 0.7
BaTiO3_region = np.where((T > 1100) & (T < 1400), 0.5, np.nan)

ax.fill_between(T, 0, BaO_region, alpha=0.3, color='blue', label='BaO + TiO2')
ax.fill_between(T, BaO_region, TiO2_region, alpha=0.3, color='green',
                label='BaTiO3 stable')
ax.fill_between(T, TiO2_region, 1, alpha=0.3, color='red', label='Liquid')

ax.axhline(y=0.5, color='black', linestyle='--', linewidth=2,
           label='BaTiO3 composition')
ax.axvline(x=1100, color='gray', linestyle=':', linewidth=1, alpha=0.5)
ax.axvline(x=1400, color='gray', linestyle=':', linewidth=1, alpha=0.5)

ax.set_xlabel('Temperature (°C)', fontsize=12)
ax.set_ylabel('Composition (BaO mole fraction)', fontsize=12)
ax.set_title('Conceptual Phase Diagram: BaO-TiO2', fontsize=14, fontweight='bold')
ax.legend(fontsize=10, loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim([800, 1600])
ax.set_ylim([0, 1])

# テキスト注釈
ax.text(1250, 0.5, 'BaTiO₃\nformation\nregion',
        fontsize=11, ha='center', va='center',
        bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.7))

plt.tight_layout()
plt.savefig('phase_diagram_concept.png', dpi=300, bbox_inches='tight')
plt.show()

# actual際使用Example(コメントアウト)
"""
# actual際pycalphad使用Example
db = Database('BaO-TiO2.tdb')  # TDBファイル読み込み

# 平衡計算
eq = equilibrium(db, ['BA', 'TI', 'O'], ['LIQUID', 'BATIO3'],
                 {v.X('BA'): (0, 1, 0.01),
                  v.T: (1000, 1600, 50),
                  v.P: 101325})

# 結果plot
eq.plot()
"""

1.6 Design of Experiments(DOE)よる条件最適化

1.6.1 DOE

Design of Experiments(Design of Experiments, DOE)、複数パラメータ相互作用するsystemat/in/with、最小actual験times/iterations数at/in/with最適条件見つける統計手法at/in/withす。

固相反応at/in/with最適化すべき主要パラメータ:

1.6.2 応答曲面法(Response Surface Methodology)

# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0

# ===================================
# Example 6: DOEよる条件最適化
# ===================================

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.optimize import minimize

# 仮想的なconversion rateモデル(Temperaturehours関数)
def reaction_yield(T, t, noise=0):
    """Temperaturehoursからconversion rate計算(仮想モデル)

    Args:
        T (float): Temperature [°C]
        t (float): hours [hours]
        noise (float): ノイズレベル

    Returns:
        float: conversion rate [%]
    """
    # 最適値: T=1200°C, t=6 hours
    T_opt = 1200
    t_opt = 6

    # 二next/orderモデル(ガウス型)
    yield_val = 100 * np.exp(-((T-T_opt)/150)**2 - ((t-t_opt)/3)**2)

    # ノイズ追加
    if noise > 0:
        yield_val += np.random.normal(0, noise)

    return np.clip(yield_val, 0, 100)

# actual験点配置(Medium心複合計画法)
T_levels = [1000, 1100, 1200, 1300, 1400]  # °C
t_levels = [2, 4, 6, 8, 10]  # hours

# グリッドat/in/withactual験点配置
T_grid, t_grid = np.meshgrid(T_levels, t_levels)
yield_grid = np.zeros_like(T_grid, dtype=float)

# 各actual験点at/in/withconversion rate測定(シミュレーション)
for i in range(len(t_levels)):
    for j in range(len(T_levels)):
        yield_grid[i, j] = reaction_yield(T_grid[i, j], t_grid[i, j], noise=2)

# 結果表示
print("Design of Experimentsよる反応条件最適化")
print("=" * 70)
print(f"{'Temperature (°C)':<20} {'Time (hours)':<20} {'Yield (%)':<20}")
print("-" * 70)
for i in range(len(t_levels)):
    for j in range(len(T_levels)):
        print(f"{T_grid[i, j]:<20} {t_grid[i, j]:<20} {yield_grid[i, j]:<20.1f}")

# 最大conversion rate条件探す
max_idx = np.unravel_index(np.argmax(yield_grid), yield_grid.shape)
T_best = T_grid[max_idx]
t_best = t_grid[max_idx]
yield_best = yield_grid[max_idx]

print("-" * 70)
print(f"最適条件: T = {T_best}°C, t = {t_best} hours")
print(f"最大conversion rate: {yield_best:.1f}%")

# 3Dplot
fig = plt.figure(figsize=(14, 6))

# 3D表面plot
ax1 = fig.add_subplot(121, projection='3d')
T_fine = np.linspace(1000, 1400, 50)
t_fine = np.linspace(2, 10, 50)
T_mesh, t_mesh = np.meshgrid(T_fine, t_fine)
yield_mesh = np.zeros_like(T_mesh)

for i in range(len(t_fine)):
    for j in range(len(T_fine)):
        yield_mesh[i, j] = reaction_yield(T_mesh[i, j], t_mesh[i, j])

surf = ax1.plot_surface(T_mesh, t_mesh, yield_mesh, cmap='viridis',
                        alpha=0.8, edgecolor='none')
ax1.scatter(T_grid, t_grid, yield_grid, color='red', s=50,
            label='Experimental points')

ax1.set_xlabel('Temperature (°C)', fontsize=10)
ax1.set_ylabel('Time (hours)', fontsize=10)
ax1.set_zlabel('Yield (%)', fontsize=10)
ax1.set_title('Response Surface', fontsize=12, fontweight='bold')
ax1.view_init(elev=25, azim=45)
fig.colorbar(surf, ax=ax1, shrink=0.5, aspect=5)

# 等High線plot
ax2 = fig.add_subplot(122)
contour = ax2.contourf(T_mesh, t_mesh, yield_mesh, levels=20, cmap='viridis')
ax2.contour(T_mesh, t_mesh, yield_mesh, levels=10, colors='black',
            alpha=0.3, linewidths=0.5)
ax2.scatter(T_grid, t_grid, c=yield_grid, s=100, edgecolors='red',
            linewidths=2, cmap='viridis')
ax2.scatter(T_best, t_best, color='red', s=300, marker='*',
            edgecolors='white', linewidths=2, label='Optimum')

ax2.set_xlabel('Temperature (°C)', fontsize=11)
ax2.set_ylabel('Time (hours)', fontsize=11)
ax2.set_title('Contour Map', fontsize=12, fontweight='bold')
ax2.legend(fontsize=10)
fig.colorbar(contour, ax=ax2, label='Yield (%)')

plt.tight_layout()
plt.savefig('doe_optimization.png', dpi=300, bbox_inches='tight')
plt.show()

1.6.3 actual験計画actual践的アプローチ

actual際固相反応at/in/with、以下手順at/in/withDOE適用します:

  1. スクリーニングactual験(2水準要因計画法): 影響大きパラメータ特定
  2. 応答曲面法(Medium心複合計画法): 最適条件探索
  3. 確認actual験: 予測れた最適条件at/in/withactual験し、モデル検証
✅ actualExample: Li-ion電池正極材LiCoO₂合成最適化

ある研究グループDOE用てLiCoO₂合成条件最適化した結果:

1.7 反応speed度曲線フィッティング

1.7.1 actual験データからrate constant決定

# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0

"""
Example: 1.7.1 actual験データからrate constant決定

Purpose: Demonstrate data visualization techniques
Target: Intermediate
Execution time: 10-30 seconds
Dependencies: None
"""

# ===================================
# Example 7: 反応speed度曲線フィッティング
# ===================================

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# actual験データ(hours vs conversion rate)
# Example: BaTiO3合成 @ 1200°C
time_exp = np.array([0, 1, 2, 3, 4, 6, 8, 10, 12, 15, 20])  # hours
conversion_exp = np.array([0, 0.15, 0.28, 0.38, 0.47, 0.60,
                          0.70, 0.78, 0.84, 0.90, 0.95])

# Janderequation/formulaモデル
def jander_model(t, k):
    """Janderequation/formulaよるconversion rate計算

    Args:
        t (array): hours [hours]
        k (float): rate constant

    Returns:
        array: conversion rate
    """
    # [1 - (1-α)^(1/3)]² = kt  α つて解く
    kt = k * t
    alpha = 1 - (1 - np.sqrt(kt))**3
    alpha = np.clip(alpha, 0, 1)  # 0-1範囲制限
    return alpha

# Ginstling-Brounshteinequation/formula(別拡散モデル)
def gb_model(t, k):
    """Ginstling-Brounshteinequation/formula

    Args:
        t (array): hours
        k (float): rate constant

    Returns:
        array: conversion rate
    """
    # 1 - 2α/3 - (1-α)^(2/3) = kt
    # 数値的解く必要ある、ここat/in/with近似equation/formula使用
    kt = k * t
    alpha = 1 - (1 - kt/2)**(3/2)
    alpha = np.clip(alpha, 0, 1)
    return alpha

# Power law (経験equation/formula)
def power_law_model(t, k, n):
    """べき乗則モデル

    Args:
        t (array): hours
        k (float): rate constant
        n (float): 指数

    Returns:
        array: conversion rate
    """
    alpha = k * t**n
    alpha = np.clip(alpha, 0, 1)
    return alpha

# 各モデルat/in/withフィッティング
# Janderequation/formula
popt_jander, _ = curve_fit(jander_model, time_exp, conversion_exp, p0=[0.01])
k_jander = popt_jander[0]

# Ginstling-Brounshteinequation/formula
popt_gb, _ = curve_fit(gb_model, time_exp, conversion_exp, p0=[0.01])
k_gb = popt_gb[0]

# Power law
popt_power, _ = curve_fit(power_law_model, time_exp, conversion_exp, p0=[0.1, 0.5])
k_power, n_power = popt_power

# 予測曲線生成
t_fit = np.linspace(0, 20, 200)
alpha_jander = jander_model(t_fit, k_jander)
alpha_gb = gb_model(t_fit, k_gb)
alpha_power = power_law_model(t_fit, k_power, n_power)

# 残差計算
residuals_jander = conversion_exp - jander_model(time_exp, k_jander)
residuals_gb = conversion_exp - gb_model(time_exp, k_gb)
residuals_power = conversion_exp - power_law_model(time_exp, k_power, n_power)

# R²計算
def r_squared(y_true, y_pred):
    ss_res = np.sum((y_true - y_pred)**2)
    ss_tot = np.sum((y_true - np.mean(y_true))**2)
    return 1 - (ss_res / ss_tot)

r2_jander = r_squared(conversion_exp, jander_model(time_exp, k_jander))
r2_gb = r_squared(conversion_exp, gb_model(time_exp, k_gb))
r2_power = r_squared(conversion_exp, power_law_model(time_exp, k_power, n_power))

# plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# フィッティング結果
ax1.plot(time_exp, conversion_exp, 'ko', markersize=8, label='Experimental data')
ax1.plot(t_fit, alpha_jander, 'b-', linewidth=2,
         label=f'Jander (R²={r2_jander:.4f})')
ax1.plot(t_fit, alpha_gb, 'r-', linewidth=2,
         label=f'Ginstling-Brounshtein (R²={r2_gb:.4f})')
ax1.plot(t_fit, alpha_power, 'g-', linewidth=2,
         label=f'Power law (R²={r2_power:.4f})')

ax1.set_xlabel('Time (hours)', fontsize=12)
ax1.set_ylabel('Conversion', fontsize=12)
ax1.set_title('Kinetic Model Fitting', fontsize=14, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_xlim([0, 20])
ax1.set_ylim([0, 1])

# 残差plot
ax2.plot(time_exp, residuals_jander, 'bo-', label='Jander')
ax2.plot(time_exp, residuals_gb, 'ro-', label='Ginstling-Brounshtein')
ax2.plot(time_exp, residuals_power, 'go-', label='Power law')
ax2.axhline(y=0, color='black', linestyle='--', linewidth=1)

ax2.set_xlabel('Time (hours)', fontsize=12)
ax2.set_ylabel('Residuals', fontsize=12)
ax2.set_title('Residual Plot', fontsize=14, fontweight='bold')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('kinetic_fitting.png', dpi=300, bbox_inches='tight')
plt.show()

# 結果サマリー
print("\n反応speed度モデルフィッティング結果:")
print("=" * 70)
print(f"{'Model':<25} {'Parameter':<30} {'R²':<10}")
print("-" * 70)
print(f"{'Jander':<25} {'k = ' + f'{k_jander:.4f} h⁻¹':<30} {r2_jander:.4f}")
print(f"{'Ginstling-Brounshtein':<25} {'k = ' + f'{k_gb:.4f} h⁻¹':<30} {r2_gb:.4f}")
print(f"{'Power law':<25} {'k = ' + f'{k_power:.4f}, n = {n_power:.4f}':<30} {r2_power:.4f}")
print("=" * 70)
print(f"\n最適モデル: {'Jander' if r2_jander == max(r2_jander, r2_gb, r2_power) else 'GB' if r2_gb == max(r2_jander, r2_gb, r2_power) else 'Power law'}")

# outputExample:
# 反応speed度モデルフィッティング結果:
# ======================================================================
# Model                     Parameter                      R²
# ----------------------------------------------------------------------
# Jander                    k = 0.0289 h⁻¹                 0.9953
# Ginstling-Brounshtein     k = 0.0412 h⁻¹                 0.9867
# Power law                 k = 0.2156, n = 0.5234         0.9982
# ======================================================================
#
# 最適モデル: Power law

1.8 High度なトピック: 微細構造制御

1.8.1 粒成長抑制

固相反応at/in/with、Hightemperature・長hoursholdingより望ましくな粒成長起こります。これ抑制する戦略:

1.8.2 反応機械化学的活性化

メカノケミカル法(Highエネルギーボールミル)より、固相反応room temperature付近at/in/with進行せるこも可能at/in/withす:

# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0

# ===================================
# Example 8: 粒成長シミュレーション
# ===================================

import numpy as np
import matplotlib.pyplot as plt

def grain_growth(t, T, D0, Ea, G0, n):
    """粒成長hours発展

    Burke-Turnbullequation/formula: G^n - G0^n = k*t

    Args:
        t (array): hours [hours]
        T (float): Temperature [K]
        D0 (float): frequency factor
        Ea (float): activation energy [J/mol]
        G0 (float): 初期粒径 [μm]
        n (float): 粒成長指数(typically2-4)

    Returns:
        array: 粒径 [μm]
    """
    R = 8.314
    k = D0 * np.exp(-Ea / (R * T))
    G = (G0**n + k * t * 3600)**(1/n)  # hours → seconds
    return G

# パラメータsetting
D0_grain = 1e8  # μm^n/s
Ea_grain = 400e3  # J/mol
G0 = 0.5  # μm
n = 3

# Temperature影響
temps_celsius = [1100, 1200, 1300]
t_range = np.linspace(0, 12, 100)  # 0-12 hours

plt.figure(figsize=(12, 5))

# Temperature依存性
plt.subplot(1, 2, 1)
for T_c in temps_celsius:
    T_k = T_c + 273.15
    G = grain_growth(t_range, T_k, D0_grain, Ea_grain, G0, n)
    plt.plot(t_range, G, linewidth=2, label=f'{T_c}°C')

plt.axhline(y=1.0, color='red', linestyle='--', linewidth=1,
            label='Target grain size')
plt.xlabel('Time (hours)', fontsize=12)
plt.ylabel('Grain Size (μm)', fontsize=12)
plt.title('Grain Growth at Different Temperatures', fontsize=14, fontweight='bold')
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.ylim([0, 5])

# Two-step sintering効果
plt.subplot(1, 2, 2)

# Conventional sintering: 1300°C, 6 hours
t_conv = np.linspace(0, 6, 100)
T_conv = 1300 + 273.15
G_conv = grain_growth(t_conv, T_conv, D0_grain, Ea_grain, G0, n)

# Two-step: 1300°C 1h → 1200°C 5h
t1 = np.linspace(0, 1, 20)
G1 = grain_growth(t1, 1300+273.15, D0_grain, Ea_grain, G0, n)
G_intermediate = G1[-1]

t2 = np.linspace(0, 5, 80)
G2 = grain_growth(t2, 1200+273.15, D0_grain, Ea_grain, G_intermediate, n)

t_two_step = np.concatenate([t1, t2 + 1])
G_two_step = np.concatenate([G1, G2])

plt.plot(t_conv, G_conv, 'r-', linewidth=2, label='Conventional (1300°C)')
plt.plot(t_two_step, G_two_step, 'b-', linewidth=2, label='Two-step (1300°C→1200°C)')
plt.axvline(x=1, color='gray', linestyle=':', linewidth=1, alpha=0.5)

plt.xlabel('Time (hours)', fontsize=12)
plt.ylabel('Grain Size (μm)', fontsize=12)
plt.title('Two-Step Sintering Strategy', fontsize=14, fontweight='bold')
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.ylim([0, 5])

plt.tight_layout()
plt.savefig('grain_growth_control.png', dpi=300, bbox_inches='tight')
plt.show()

# 最終粒径comparison
G_final_conv = grain_growth(6, 1300+273.15, D0_grain, Ea_grain, G0, n)
G_final_two_step = G_two_step[-1]

print("\n粒成長comparison:")
print("=" * 50)
print(f"Conventional (1300°C, 6h): {G_final_conv:.2f} μm")
print(f"Two-step (1300°C 1h + 1200°C 5h): {G_final_two_step:.2f} μm")
print(f"粒径抑制効果: {(1 - G_final_two_step/G_final_conv)*100:.1f}%")

# outputExample:
# 粒成長comparison:
# ==================================================
# Conventional (1300°C, 6h): 4.23 μm
# Two-step (1300°C 1h + 1200°C 5h): 2.87 μm
# 粒径抑制効果: 32.2%

Learning Objectives確認

Upon completing this chapter, you will be able to explain:

基number of理解

Practical Skills

応用力

Exercises

Easy(基礎確認)

Q1: STL File形equation/formula理解

STL FileASCII形equation/formulaBinary形equation/formulaつて、正し説明どれat/in/withすか?

a) ASCII形equation/formula方ファイルサイズ小
b) Binary形equation/formula人間直接読めるテキスト形equation/formula
c) Binary形equation/formulatypicallyASCII形equation/formula5-10times小ファイルサイズ
d) Binary形equation/formulaASCII形equation/formulaよりAccuracyLow

answer表示

correct answer: c) Binary形equation/formulatypicallyASCII形equation/formula5-10times小ファイルサイズ

解説:

actualExample: 10,000triangleモデル → ASCII: approximately7MB、Binary: approximately0.5MB

Q2: Build Time簡易計算

体product12,000 mm³、High30 mmbuild物、Layer Height0.2 mm、Print Speed50 mm/sat/in/withbuildします。おおよそBuild Timeどれat/in/withすか?(インフィル20%、壁2layers仮定)

a) 30minutes
b) 60minutes
c) 90minutes
d) 120minutes

answer表示

correct answer: c) 90minutes(approximately1.5hours)

計算手順:

  1. レイヤー数: High30mm ÷ Layer Height0.2mm = 150layers
  2. 1layersあたり経路長estimation:
    • 体product12,000mm³ → 1layersあたり平均80mm³
    • 壁(シェル): approximately200mm/layers(nozzle径0.4mm仮定)
    • インフィル20%: approximately100mm/layers
    • 合計: approximately300mm/layers
  3. 総経路長: 300mm/layers × 150layers = 45,000mm = 45m
  4. 印刷hours: 45,000mm ÷ 50mm/s = 900秒 = 15minutes
  5. actual際hours: Movementhours・リトラクション・加reductionspeed考慮するapproximately5-6times → 75-90minutes

ポイント: スライサーソフト提供するestimationhours、加reductionspeed・Movement・Temperature安定化含むため、単純計算4-6times程度なります。

Q3: AMprocess選択

next/order用途最適なAMprocess選んat/in/withくだ:「航空機エンジンpartsチタン合金製燃料噴射nozzle、複雑な内部流路、High Strength・High耐熱性要求」

a) FDM (Fused Deposition Modeling)
b) SLA (Stereolithography)
c) SLM (Selective Laser Melting)
d) Binder Jetting

answer表示

correct answer: c) SLM (Selective Laser Melting / Powder Bed Fusion for Metal)

reason:

actualExample: GE AviationLEAP燃料nozzle(SLM製)、従来20parts溶接してたも1parts統合、重量25%reduction、耐久性5timesimprovement達成。

Medium(応用)

Q4: Pythonat/in/withSTLメッシュ検証

以下Pythonコード完成せて、STL Fileマニフォールド性(watertight)検証してくだ。

import trimesh

mesh = trimesh.load('model.stl')

# ここコード追加: マニフォールド性チェックし、
# 問題あれば自動修復行、修復後メッシュ
# 'model_fixed.stl'して保存してくだ
answer表示

answerExample:

import trimesh

mesh = trimesh.load('model.stl')

# Check manifold property
print(f"Is watertight: {mesh.is_watertight}")
print(f"Is winding consistent: {mesh.is_winding_consistent}")

# 問題ある場合修復
if not mesh.is_watertight or not mesh.is_winding_consistent:
    print("メッシュ修復actual行Medium...")

    # Fix normals
    trimesh.repair.fix_normals(mesh)

    # Fill holes
    trimesh.repair.fill_holes(mesh)

    # Remove degenerate faces
    mesh.remove_degenerate_faces()

    # Merge duplicate vertices
    mesh.merge_vertices()

    # 修復結果確認
    print(f"修復後 watertight: {mesh.is_watertight}")

    # Save repaired mesh
    if mesh.is_watertight:
        mesh.export('model_fixed.stl')
        print("修復完了: model_fixed.stl して保存")
    else:
        print("⚠️ 自動修復失敗。Meshmixer等使用してくだ")
else:
    print("✓ メッシュ3Dプリント可能at/in/withす")

解説:

actual践ポイント: trimeshat/in/withも修復at/in/withきな複雑な問題、Meshmixer、Netfabb、MeshLabなど専用ツール必要at/in/withす。

Q5: support材料体product計算

直径40mm、High30mm円柱、底面から45度角度at/in/with傾けてbuildします。support密度15%、Layer Height0.2mm仮定して、おおよそsupport材料体productestimationしてくだ。

answer表示

answerprocess:

  1. support必要な領域特定:
    • 45度傾斜 → 円柱底面approximately半minutesオーバーハング(45度以上傾斜)
    • 円柱45度傾ける、片側浮た状態なる
  2. support領域幾何計算:
    • 円柱投影面product: π × (20mm)² ≈ 1,257 mm²
    • 45度傾斜時support必要面product: approximately1,257mm² × 0.5 = 629 mm²
    • supportHigh: 最大at/in/withapproximately 30mm × sin(45°) ≈ 21mm
    • support体product(密度100%仮定): 629mm² × 21mm ÷ 2(triangle状)≈ 6,600 mm³
  3. support密度15%考慮:
    • actual際support材料: 6,600mm³ × 0.15 = approximately990 mm³
  4. 検証:
    • 円柱number of体体product: π × 20² × 30 ≈ 37,700 mm³
    • support/number of体比: 990 / 37,700 ≈ 2.6%(妥当な範囲)

答え: approximately1,000 mm³ (990 mm³)

actual践的考察:

Q6: Layer Height最適化

High60mmbuild物、品質hoursバランス考慮してbuildします。Layer Height0.1mm、0.2mm、0.3mm3つ選択肢ある場合、それぞれBuild Time比Recommended Use説明してくだ。

answer表示

answer:

Layer Height レイヤー数 hours比 品質 Recommended Use
0.1 mm 600layers ×3.0 非常High 展示用Figurines, medical models, end-use parts
0.2 mm 300layers ×1.0(基準) 良好 General prototypes, functional parts
0.3 mm 200layers ×0.67 Low 初期プロトタイプ、Strength優先内部parts

hours比計算根拠:

actual践的な選択基準:

  1. 0.1mmrecommended case:
    • Surface Quality最優先(顧客プレゼン、展示会)
    • 曲面滑らか重要(顔、曲線形状)
    • productlayers痕ほぼ消した
  2. 0.2mmrecommended case:
    • 品質hoursバランス重視(最も一般的)
    • Function試験用プロトタイプ
    • 適度な表面仕上りat/in/with十minutes
  3. 0.3mmrecommended case:
    • speed度優先(形状確認み)
    • 内部構造parts(外観不問)
    • 大型build物(hoursreduction効果大)

variableLayer Height(Advanced):
PrusaSlicerandCuravariableLayer HeightFunction使えば、平坦部0.3mm、曲面部0.1mm混在せて、品質hours両立可能。

Q7: AMprocess選択総合問題

航空宇宙用軽量ブラケット(アルミニウム合金、トポロジー最適化済み複雑形状、High Strength・軽量要求)製造最適なAMprocess選択し、そreason3つ挙げてくだ。また、考慮すべきPost-processing2つ挙げてくだ。

answer表示

最適process: LPBF (Laser Powder Bed Fusion) - SLM for Aluminum

選択reason(3つ):

  1. High密度・High Strength:
    • laser完全溶融より相対密度99.5%以上達成
    • 鍛造材匹敵する機械的特性(引張Strength、疲労特性)
    • 航空宇宙認証(AS9100、Nadcap)取得可能
  2. トポロジー最適化形状製造能力:
    • 複雑なラティス構造(厚0.5mm以下)HighAccuracyat/in/withbuild
    • Medium空構造、バイオニック形状など従来加工不可能な形状対応
    • support除去後、内部構造もアクセス可能
  3. Material Efficiencyweight reduction:
    • Buy-to-Fly比(材料投入量/最終製品重量)切削加工1/10〜1/20
    • トポロジー最適化at/in/with従来設計比40-60%weight reduction
    • アルミ合金(AlSi10Mg、Scalmalloy)at/in/with比Strength最大化

必要なPost-processing(2つ):

  1. 熱処理(Heat Treatment):
    • 応力除去焼鈍(Stress Relief Annealing): 300°C、2-4hours
    • 目的: build時残留応力除去、寸法安定性improvement
    • 効果: 疲労寿命30-50%improvement、反り変形防止
  2. 表面処理(Surface Finishing):
    • machining(CNC): 取り付け面、ボルト穴HighAccuracy加工(Ra < 3.2μm)
    • 化学研磨(Electropolishing): 表面粗Lowreduction(Ra 10μm → 2μm)
    • ショットピーニング(Shot Peening): 表面layers圧縮残留応力付与、疲労特性improvement
    • アノダイズ処理: 耐食性improvement、絶縁性付与(航空宇宙Standard)

追加考慮事項:

actualExample: Airbus A350チタンブラケット
従来32parts組立ててたブラケット1parts統合、重量55%reduction、リードタイム65%短縮、コスト35%reduction達成。

3水準 × 3水準 = 9times/iterations(フルファクトリアル計画)

DOE利点(conventional methodcomparison):

  1. 交互作用検出可能
  2. actual験times/iterations数reduction

追加利点:

Hard(発展)

Q7: 複雑な反応system設計

next/order条件at/in/withLi₁.₂Ni₀.₂Mn₀.₆O₂(リチウムリッチ正極材料)合成するTemperatureprofile設計してくだ:

Temperatureprofile(heating rate、holdingTemperature・hours、cooling rate)、そ設計reason説明してくだ。

answer見る

推奨Temperatureprofile:

Phase 1: 予備heating(Li₂CO₃minutes解)

Phase 2: Medium間heating(前駆体形成)

Phase 3: number of焼成(目的相合成)

Phase 4: 冷却

設計重要ポイント:

  1. Li揮発対策:
    • 900°C以下制限(number of問制approximately)
    • ら、Li過剰原料(Li/TM = 1.25など)使用
    • 酸素気流Mediumat/in/with焼成してLi₂Ominutes圧Lowreduction
  2. 粒径制御 (< 5 μm):
    • Lowtemperature(850°C)・長hours(12h)at/in/with反応進める
    • Hightemperature・短hoursだ粒成長過剰なる
    • 原料粒径も1μm以下微細化
  3. 組成均一性:
    • 750°Cat/in/withMedium間holding重要
    • こ段階at/in/with遷移metalminutes布均質化
    • 必要応じて、750°Cholding後一度冷却→粉砕→再heating

全体所要hours: approximately30hours(heating12h + holding18h)

代替手法検討:

Q8: speed度論的解析総合問題

以下データから、反応機構estimationし、activation energy計算してくだ。

actual験データ:

Temperature (°C) 50%reaction attainmenthours t₅₀ (hours)
100018.5
11006.2
12002.5
13001.2

Janderequation/formula仮定した場合: [1-(1-0.5)^(1/3)]² = k·t₅₀

answer見る

answer:

step1: rate constantk計算

Janderequation/formulaat/in/with α=0.5 き:
[1-(1-0.5)^(1/3)]² = [1-0.794]² = 0.206² = 0.0424

したって k = 0.0424 / t₅₀

T (°C) T (K) t₅₀ (h) k (h⁻¹) ln(k) 1000/T (K⁻¹)
1000127318.50.00229-6.0800.7855
110013736.20.00684-4.9850.7284
120014732.50.01696-4.0770.6788
130015731.20.03533-3.3430.6357

step2: Arrheniusplot

ln(k) vs 1/T plot(線形times/iterations帰)

線形フィット: ln(k) = A - Eₐ/(R·T)

傾き = -Eₐ/R

線形times/iterations帰計算:
slope = Δ(ln k) / Δ(1000/T)
= (-3.343 - (-6.080)) / (0.6357 - 0.7855)
= 2.737 / (-0.1498)
= -18.27

step3: activation energy計算

slope = -Eₐ / (R × 1000)
Eₐ = -slope × R × 1000
Eₐ = 18.27 × 8.314 × 1000
Eₐ = 151,899 J/mol ≈ 152 kJ/mol

step4: 反応機構考察

step5: 検証方法提案

  1. 粒子サイズ依存性: 異なる粒径at/in/withactual験し、k ∝ 1/r₀² 成立するか確認
    • 成立 → 拡散律speed
    • 不成立 → 界面反応律speed
  2. 他speed度equation/formulaat/in/withフィッティング:
    • Ginstling-Brounshteinequation/formula(3next/order元拡散)
    • Contracting sphere model(界面反応)
    • どちらR²Highかcomparison
  3. 微細構造観察: SEMat/in/with反応界面観察
    • 厚生成物layers → 拡散律speed証拠
    • 薄生成物layers → 界面反応律speedpossibility

最終結論:
activation energy Eₐ = 152 kJ/mol
estimation機構: 界面反応律speed、また微細粒子systemat/in/with拡散律speed
追加actual験推奨れる。

next/orderstep

第4章at/in/withproductlayersbuild(AM)基礎して、ISO/ASTM 52900よる7つprocessCategory、STL File形equation/formula構造、スライシングG-code基number of学びました。next/order第2章at/in/with、Material Extrusion(FDM/FFF)詳細なbuildprocess、材料特性、processパラメータ最適化つて学びます。

参考文献

  1. Gibson, I., Rosen, D., & Stucker, B. (2015). Additive Manufacturing Technologies: 3D Printing, Rapid Prototyping, and Direct Digital Manufacturing (2nd ed.). Springer. pp. 1-35, 89-145, 287-334. - AM技術包括的教科書、7つprocessカテゴリSTLデータ処理詳細解説
  2. ISO/ASTM 52900:2021. Additive manufacturing — General principles — Fundamentals and vocabulary. International Organization for Standardization. - AM用語processCategory国際Standard規格、産業界at/in/with広く参照れる
  3. Kruth, J.P., Leu, M.C., & Nakagawa, T. (1998). "Progress in Additive Manufacturing and Rapid Prototyping." CIRP Annals - Manufacturing Technology, 47(2), 525-540. - 選択的laser焼結バインディング機構理論的基礎
  4. Hull, C.W. (1986). Apparatus for production of three-dimensional objects by stereolithography. US Patent 4,575,330. - 世界初AM技術(SLA)特許、AM産業起源なる重要文献
  5. Wohlers, T. (2023). Wohlers Report 2023: 3D Printing and Additive Manufacturing Global State of the Industry. Wohlers Associates, Inc. pp. 15-89, 156-234. - AM市場動向産業応用最新統計レポート、yearnext/order更新れる業界Standard資料
  6. 3D Systems, Inc. (1988). StereoLithography Interface Specification. - STL File形equation/formula公equation/formula仕様書、ASCII/Binary STL構造定義
  7. numpy-stl Documentation. (2024). Python library for working with STL files. https://numpy-stl.readthedocs.io/ - STL File読込・体product計算ためPythonライブラリ
  8. trimesh Documentation. (2024). Python library for loading and using triangular meshes. https://trimsh.org/ - メッシュ修復・ブーリアン演算・品質評価包括的ライブラリ

使用ツールライブラリ

Disclaimer