Files
JuliaFEM.jl/examples/academic_matrix_extraction/README.md
T
Jukka Aho 4603b9ff47 feat(examples): Add working academic matrix extraction example (Issue #183)
Created new example demonstrating the three requirements from Issue #183:
- a) Discretize space (mesh generation shown)
- b) Assemble stiffness matrix (API demonstrated)
- c) Extract matrices for external solvers (working code)

New files:
- examples/academic_matrix_extraction/academic_example.jl (211 lines)
- examples/academic_matrix_extraction/README.md (123 lines)

This is a WORKING example using Dirichlet BC to demonstrate the matrix
extraction workflow. Shows integration with DifferentialEquations.jl,
LinearSolve.jl, Krylov.jl, and custom solvers.

Also updated gmsh_heat_equation.jl to be honest about demonstration status:
- Added clear NOTE that Heat problem is pending Phase 2
- Explains workflow structure vs actual functionality
- References architecture refactoring progress
2025-11-10 00:38:26 +02:00

124 lines
3.2 KiB
Markdown

# Academic Example: Matrix Extraction for External Solvers
**Addresses Issue #183**: Demonstrates using JuliaFEM for spatial discretization only, extracting matrices for external solvers.
## The Three Requirements
This example demonstrates exactly what was requested in Issue #183:
### a) Discretize space (into a mesh)
- Shows programmatic mesh generation
- Element connectivity accessible
- Compatible with Gmsh mesh files
### b) Assemble the stiffness matrix
- Assembly framework demonstrated
- Currently works with Dirichlet BC
- Heat/Elasticity coming in Phase 2 (2-4 months)
### c) Get back vectors and matrices
- Extract `K` (stiffness), `M` (mass), `f` (force) as standard Julia types
- `SparseMatrixCSC{Float64,Int64}` and `Vector{Float64}`
- Direct compatibility with entire Julia ecosystem
## Quick Start
```bash
cd examples/academic_matrix_extraction
julia --project=../.. academic_example.jl
```
## What You Get
After assembly, matrices are extracted as:
```julia
K = problem.assembly.K # Stiffness matrix (sparse)
M = problem.assembly.M # Mass matrix (sparse)
f = problem.assembly.f # Force vector
```
These are standard Julia types that work with:
### DifferentialEquations.jl (Transient Problems)
```julia
using DifferentialEquations
function fem_ode!(du, u, p, t)
K, M, f = p
du .= M \ (-K * u .+ f)
end
u0 = zeros(N)
prob = ODEProblem(fem_ode!, u0, (0.0, 1.0), (K, M, f))
sol = solve(prob, Tsit5())
```
### LinearSolve.jl (Steady-State)
```julia
using LinearSolve
prob = LinearProblem(K, f)
sol = solve(prob, KrylovJL_GMRES())
```
### Krylov.jl (Iterative Methods)
```julia
using Krylov
u, stats = gmres(K, f; atol=1e-10, rtol=1e-8)
```
### Custom Research Solvers
```julia
using SparseArrays, LinearAlgebra
u = K \ f # Direct solve
L = cholesky(K) # Factorization
λ, v = eigs(K, M) # Eigenvalue analysis
```
## Current Status
**What Works NOW:**
- ✅ Mesh generation and element connectivity
- ✅ Matrix extraction API (`problem.assembly.K`, `.M`, `.f`)
- ✅ Dirichlet boundary conditions
- ✅ Integration with Julia solver ecosystem
**Coming in Phase 2 (2-4 months):**
- ⏳ Heat equation problem type
- ⏳ Elasticity problem type
- ⏳ Full assembly for physics problems
- ⏳ 40-130x performance improvement
## Why Phase 2?
JuliaFEM is undergoing architecture refactoring (Nov 2025):
- Replacing Dict-based fields (100x performance penalty) with type-stable system
- New immutable element architecture (already 40-130x faster)
- Heat/Elasticity problem types depend on old system
- Being restored with new architecture
## See Also
- **Issue #183**: Original request from Chris Rackauckas (2017)
- **examples/gmsh_heat_equation/**: Full workflow with Gmsh mesh files
- **docs/book/gmsh_tutorial.md**: Comprehensive step-by-step tutorial
- **llm/ARCHITECTURE.md**: Architecture design and roadmap
- **docs/blog/immutability_performance.md**: Performance analysis
## Academic Use Case
Perfect for research where you need:
1. Spatial discretization (FEM assembly)
2. Custom time integration schemes
3. Novel solver algorithms
4. Integration with other Julia packages
JuliaFEM handles the messy FEM assembly; you control the solving.