feat: Integrate FEMBasis into JuliaFEM module (partial)

- Add Tensors and Calculus to Project.toml dependencies
- Add basis includes to src/JuliaFEM.jl (Phase 1 integration)
- Fix FEMBasis. namespace references → use JuliaFEM namespace
- Update create_basis.jl: AbstractBasis (not FEMBasis.AbstractBasis)

Status: Basis files load, but conflict with FEMBase expectations
Next: Need to consolidate FEMBase or work around AbstractElement type constraints

This is expected during consolidation - we're bridging two systems.
This commit is contained in:
Jukka Aho
2025-11-08 09:09:54 +02:00
parent 7b6fcfdaf5
commit d3fc55f13e
6 changed files with 124 additions and 7 deletions
+20
View File
@@ -107,6 +107,8 @@ module JuliaFEM
using SparseArrays, LinearAlgebra, Statistics
using Reexport, ForwardDiff, LightXML, HDF5, Parameters
using Tensors # For basis functions (Vec type)
import Calculus # For symbolic differentiation in basis generation
import FEMSparse
@@ -115,6 +117,24 @@ import FEMBase: get_unknown_field_name, get_unknown_field_dimension,
assemble!, update!, initialize!
using FEMBase: get_problems
# Consolidate FEMBasis.jl into src/basis/ (Phase 1)
include("basis/abstract.jl")
include("basis/subs.jl")
include("basis/vandermonde.jl")
include("basis/create_basis.jl")
include("basis/lagrange_segments.jl")
include("basis/lagrange_quadrangles.jl")
include("basis/lagrange_triangles.jl")
include("basis/lagrange_tetrahedrons.jl")
include("basis/lagrange_hexahedrons.jl")
include("basis/lagrange_wedges.jl")
include("basis/lagrange_pyramids.jl")
include("basis/nurbs.jl")
include("basis/nurbs_segment.jl")
include("basis/nurbs_surface.jl")
include("basis/nurbs_solid.jl")
include("basis/math.jl")
using TimerOutputs
export @timeit, print_timer
+1 -1
View File
@@ -12,7 +12,7 @@ import Calculus
export Vec
# Type alias for coordinate inputs (tuples or Vec)
const Vecish{N, T} = Union{NTuple{N, T}, Vec{N, T}}
const Vecish{N,T} = Union{NTuple{N,T},Vec{N,T}}
"""
AbstractBasis{dim}
+4 -4
View File
@@ -78,7 +78,7 @@ function create_basis(name, description, X::Vector{<:Vecish{D, T}}, basis, dbasi
end
code = quote
struct $name <: FEMBasis.AbstractBasis{$D}
struct $name <: AbstractBasis{$D}
end
Base.@pure function Base.size(::Type{$name})
@@ -94,18 +94,18 @@ function create_basis(name, description, X::Vector{<:Vecish{D, T}}, basis, dbasi
return $N
end
function FEMBasis.get_reference_element_coordinates(::Type{$name})
function get_reference_element_coordinates(::Type{$name})
return $X
end
@inline function FEMBasis.eval_basis!(::Type{$name}, N::Vector{<:Number}, xi::Vec)
@inline function eval_basis!(::Type{$name}, N::Vector{<:Number}, xi::Vec)
@assert length(N) == $N
$unpack
@inbounds $Q
return N
end
@inline function FEMBasis.eval_dbasis!(::Type{$name}, dN::Vector{<:Vec{$D}}, xi::Vec)
@inline function eval_dbasis!(::Type{$name}, dN::Vector{<:Vec{$D}}, xi::Vec)
@assert length(dN) == $N
$unpack
@inbounds $V