feat: Consolidate FEMBase.jl into JuliaFEM (Phase 1 complete)

MAJOR MILESTONE: FEMBase + FEMBasis fully consolidated, JuliaFEM loads!

Consolidated files:
- src/elements/ (3 files): elements.jl, elements_lagrange.jl, integrate.jl
- src/fields/ (1 file): fields.jl (DCTI, DVTI, DCTV, DVTV, etc.)
- src/sparse/ (1 file): sparse.jl (SparseMatrixCOO, SparseVectorCOO)
- src/assembly/ (2 files): problems.jl, assembly.jl
- src/solvers/ (1 file): solvers_base.jl
- src/analysis.jl, src/core_types.jl (Node, IP, IntegrationPoint)

Changes to JuliaFEM.jl:
- Added dependencies: Tensors, Calculus
- Removed @reexport using FEMBase (now consolidated)
- Added 20+ include statements for consolidated files
- Include order: fields → core_types → fembase_compat → sparse → elements

Compatibility layer:
- Created fembase_compat.jl: Minimal FEMBase submodule for vendor packages
- Temporarily disabled vendor-specific Mortar2D functions in solvers_modal.jl

Bug fixes:
- Changed i == 1 → isequal(i, 1) in integrate.jl (== operator overridden by fields)
- Resolved all FEMBasis. namespace references throughout codebase

Result:
- ✅ JuliaFEM loads successfully on Julia 1.12.1
- ✅ 134 exported symbols (was 171 with separate FEMBase)
- ✅ Core types accessible: Seg2, Quad4, Problem, AbstractProblem, etc.
- ⚠️  Vendor packages show FEMBase cache warnings (expected, harmless)

TODO:
- Re-enable Mortar2D functions after vendor consolidation
- Field system == operator override needs redesign (Phase 4)
- Continue Phase 2: Consolidate remaining vendor packages
This commit is contained in:
Jukka Aho
2025-11-08 09:39:16 +02:00
parent d3fc55f13e
commit 73ec910589
31 changed files with 2228 additions and 55 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE
# AbstractBasis type and interface
# Consolidated from FEMBasis.jl package
# Consolidated from jl package
using Tensors
using LinearAlgebra
+5 -5
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
__precompile__(false)
@@ -22,7 +22,7 @@ function calculate_interpolation_polynomials(p, V)
N = Expr(:call, :+)
for (ai, bi) in zip(solution, args)
isapprox(ai, 0.0) && continue
push!(N.args, Calculus.simplify( :( $ai * $bi ) ))
push!(N.args, Calculus.simplify(:($ai * $bi)))
end
push!(basis, N)
end
@@ -55,17 +55,17 @@ function create_basis(name, description, X::Vector{<:Vecish{D}}, basis::Vector)
return create_basis(name, description, Vec.(X), basis, dbasis)
end
function create_basis(name, description, X::Vector{<:Vecish{D, T}}, basis, dbasis) where {D, T}
function create_basis(name, description, X::Vector{<:Vecish{D,T}}, basis, dbasis) where {D,T}
N = length(X)
@debug "create basis given basis functions and derivatives" name description X basis dbasis
Q = Expr(:block)
for i=1:N
for i = 1:N
push!(Q.args, :(N[$i] = $(basis[i])))
end
V = Expr(:block)
for i=1:N
for i = 1:N
push!(V.args, :(dN[$i] = Vec(float.(tuple($(dbasis[:, i]...))))))
end
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
code = create_basis_and_eval(
:Hex8,
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
# Kaltenbacher, Manfred. Numerical simulation of mechatronic sensors and actuators: finite elements for computational multiphysics. Springer, 2015.
code = create_basis_and_eval(
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
code = create_basis_and_eval(
:Quad4,
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
code = create_basis_and_eval(
:Seg2,
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
code = create_basis_and_eval(
:Tet4,
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
code = create_basis_and_eval(
:Tri3,
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
# Kaltenbacher, Manfred. Numerical simulation of mechatronic sensors and actuators: finite elements for computational multiphysics. Springer, 2015.
create_basis_and_eval(
+2 -2
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
"""
interpolate(B, T, xi)
@@ -148,7 +148,7 @@ BasisInfo(Tri3)
# output
FEMBasis.BasisInfo{FEMBasis.Tri3,Float64}([0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], 0.0)
BasisInfo{Tri3,Float64}([0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0 0.0; 0.0 0.0 0.0], [0.0 0.0; 0.0 0.0], [0.0 0.0; 0.0 0.0], 0.0)
```
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
import Base: size, length
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
""" NURBS segment. """
mutable struct NSeg <: AbstractBasis{1}
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
mutable struct NSolid <: AbstractBasis{3}
order_u :: Int
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
mutable struct NSurf <: AbstractBasis{2}
order_u :: Int
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
function subs(p::Number, ::Any)
return p
+1 -1
View File
@@ -1,5 +1,5 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/FEMBasis.jl/blob/master/LICENSE
# License is MIT: see https://github.com/JuliaFEM/jl/blob/master/LICENSE
"""
vandermonde_matrix(polynomial, coordinates)