mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-09-20 01:59:59 +00:00
4603b9ff47
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
124 lines
3.2 KiB
Markdown
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.
|