Commit Graph

1492 Commits

Author SHA1 Message Date
Jukka Aho 3145ab1c9c refactor(topology): Modernize quadrilateral topology implementation
- Apply Vec constructor broadcasting to all 3 quadrilateral types (Quad4, Quad8, Quad9)
- Convert edges() to return SVector of typed Edge{T} entities
- Convert faces() to return SVector of typed Face{T} entity
- Add vertices() returning four Vertex{T} instances
- Add cells() returning single Cell{T} instance
- Add entity count methods: nvertices(), nedges(), nfaces()
- Consistent formatting with cleaner syntax
2025-11-23 18:19:44 +02:00
Jukka Aho 9168f2b6cf refactor(topology): Modernize triangle topology implementation
- Apply Vec constructor broadcasting to all 4 triangle types (Tri3, Tri6, Tri7, Tri10)
- Convert edges() to return SVector of typed Edge{T} entities
- Convert faces() to return SVector of typed Face{T} entity
- Add vertices() returning three Vertex{T} instances
- Add cells() returning single Cell{T} instance
- Add entity count methods: nvertices(), nedges(), nfaces()
- Update documentation to reflect typed entity returns
2025-11-23 18:19:18 +02:00
Jukka Aho 404ea66f11 refactor(topology): Modernize segment topology implementation
- Apply Vec constructor broadcasting: Vec{1,Float64}.((...))
- Convert edges() to return typed Edge{T} in SVector
- Convert faces() to return typed Vertex{T} (endpoints in 1D)
- Add vertices() method returning two Vertex{T} instances
- Add cells() method returning single Cell{T}
- Add entity count methods: nvertices(), nedges(), nfaces()
- Clean up syntax with consistent formatting
2025-11-23 18:18:52 +02:00
Jukka Aho e8c8c04075 feat(topology): Add type-level nnodes() method
- Add nnodes(::Type{<:AbstractTopology{N}}) method for type queries
- Enables compile-time node count without instantiation
- Example: nnodes(Triangle{3}) returns 3
- Complements existing instance method for dispatch consistency
2025-11-23 18:18:24 +02:00
Jukka Aho 8ae5981c09 docs(basis): Add comprehensive README for basis module
Add extensive documentation for the basis module covering:

1. Architecture and design philosophy
   - Separation of topology and basis
   - Zero-cost abstraction principles
   - SVector return types and dual-vector design

2. API overview and usage examples
   - get_basis_functions() and get_basis_derivatives()
   - nbasis() for compile-time basis function count
   - Integration with topology and quadrature modules

3. Code generation system
   - Vandermonde approach explained
   - Symbolic differentiation and simplification
   - Why offline generation vs runtime symbolic math

4. Extension guide
   - Adding higher-order elements (step-by-step)
   - Hierarchical and specialized bases
   - When to use generator vs direct implementation

5. Performance characteristics
   - Benchmarks: 100-1000× speedup over v0.5.1
   - Zero allocations, subnanosecond evaluations
   - Scaling with element order

6. Advanced topics
   - Numerical precision and ill-conditioned Vandermonde
   - Jacobian and physical derivatives
   - Partition of unity and reproduction
   - Integration accuracy requirements

Total: ~1800 lines of documentation with complete examples,
mathematical foundations, and practical guidance.
2025-11-22 14:14:55 +02:00
Jukka Aho 4f2d59965a chore(basis): Regenerate basis functions with nbasis and canonical names
Regenerate all 14 basis families with updated generator:

1. Added nbasis() functions for compile-time basis function count:
   @inline nbasis(::Segment{2}, ::Lagrange{1}) = 2
   @inline nbasis(::Triangle{3}, ::Lagrange{1}) = 3
   @inline nbasis(::Quadrilateral{9}, ::Lagrange{2}) = 9
   etc.

2. Switched from type aliases to canonical topology names:
   - Seg2 → Segment{2}
   - Tri3 → Triangle{3}
   - Quad9 → Quadrilateral{9}
   - Tet10 → Tetrahedron{10}
   - Hex8 → Hexahedron{8}

3. Instance-based dispatch throughout:
   get_basis_functions(::Triangle{3}, ::Lagrange{1}, xi)
   get_basis_derivatives(::Triangle{3}, ::Lagrange{1}, xi)
   nbasis(::Triangle{3}, ::Lagrange{1})

All functions remain zero-cost (compile to single constant/inline code).
Verified with @code_llvm showing direct constant returns.
2025-11-22 12:07:50 +02:00
Jukka Aho 9a67fa6386 feat(basis): Generate nbasis functions with canonical type names
Extend basis_generator.jl to automatically emit nbasis() functions alongside
get_basis_functions() and get_basis_derivatives():

1. Add canonical_type_name() helper to convert type aliases to full forms
   (Quad9 → Quadrilateral{9}, Tri3 → Triangle{3})

2. Generate @inline nbasis(::Topology, ::Basis) = N for each basis family
   This provides zero-cost compile-time basis function count

3. Use instance-based dispatch (::Triangle{3}, not ::Type{Triangle{3}})
   for consistency with get_basis_* functions

4. Enhanced pretty-printer to handle both function definitions and simple
   assignments, properly unwrapping begin...end blocks

Generated code now uses canonical topology names throughout, avoiding
historical type aliases for better clarity and API consistency.
2025-11-22 12:07:11 +02:00
Jukka Aho c6f18d040f feat(basis): Add basis_descriptions.jl catalog for code generation
Create centralized catalog of 14 basis element descriptions for automatic
code generation. Each description specifies:
- Topology type (Segment, Triangle, Quadrilateral, Tetrahedron, Hexahedron, etc.)
- Basis family (Lagrange{order}, Serendipity{order})
- Polynomial ansatz for Vandermonde system

Covers standard finite elements:
- 1D: Seg2, Seg3
- 2D: Tri3, Tri6, Quad4, Quad8, Quad9
- 3D: Tet4, Tet10, Hex8, Hex20, Hex27, Pyr5, Wedge6

Uses canonical topology types (Triangle{3}, Quadrilateral{9}) instead of
legacy aliases (Tri3, Quad9) for clarity and consistency.
2025-11-22 12:06:40 +02:00
Jukka Aho df449f23df feat(basis): Add nbasis() function for compile-time basis function count
Add zero-cost nbasis(topology, basis) -> Int function that returns the number
of basis functions at compile time. This is essential for validating Ciarlet
triplet (K, P, Σ) consistency and enables type-stable pre-allocations.

Key features:
- Zero-cost: compiles to single constant return (ret i64 N)
- Instance-based dispatch: nbasis(Triangle{3}(), Lagrange{1}())
- Comprehensive documentation with compile-time verification examples
- Replaces removed ndofs() function with clearer semantics

The function is generated automatically by basis_generator.jl alongside
basis function implementations, ensuring consistency.
2025-11-22 12:06:20 +02:00
Jukka Aho 6ad8c43e7e refactor(quadrature): Rename glwed.jl → gl_wedges.jl with modern API
- Deleted: src/quadrature/glwed.jl (93 lines, old zip-based API)
- Created: src/quadrature/gl_wedges.jl (142 lines, modern type-based API)

Key improvements:
- QuadraturePoint{3} with Vec{3} coordinates (not tuples)
- SVector return types (zero allocation)
- @inline directives for performance
- Two 6-point variants (default + :B)
- Comprehensive documentation explaining tensor product structure
- Three rules: 6-point (2 variants) and 21-point

Implemented rules:
  - GaussLegendre{2}(): 6 points (degree 1, default variant)
    → 3 triangle points × 2 segment points
  - GaussLegendre{2,:B}(): 6 points (degree 1, alternative triangle distribution)
  - GaussLegendre{5}(): 21 points (degree 5, high accuracy)
    → 7 triangle points × 3 segment points

Technical details:
  - Wedge is tensor product of triangle (ξ,η) and segment (ζ)
  - Reference wedge: triangular cross-section extruded in z-direction
  - 6-point rules: 2D triangle rule × 2-point 1D Gauss
  - 21-point rule: 7-point triangle × 3-point 1D Gauss
  - Legacy Val{:GLWED*} compatibility maintained

Net: +49 lines (added detailed documentation and modern type infrastructure)
2025-11-21 00:39:54 +02:00
Jukka Aho 4cf1cda237 refactor(quadrature): Rename gltet.jl → gl_tetrahedra.jl with modern API
- Deleted: src/quadrature/gltet.jl (67 lines, old zip-based API)
- Created: src/quadrature/gl_tetrahedra.jl (160 lines, modern type-based API)

Key improvements:
- QuadraturePoint{3} with Vec{3} coordinates (not tuples)
- SVector return types (zero allocation)
- @inline directives for performance
- Comprehensive documentation with warnings
- Four rules from 1-point to 15-point (degrees 1-4)

Implemented rules:
  - GaussLegendre{1}(): 1 point (centroid, degree 1)
  - GaussLegendre{2}(): 4 points (degree 2, symmetric placement)
  - GaussLegendre{4}(): 15 points (degree 4, all weights positive)

Technical details:
  - Reference tetrahedron: vertices at (0,0,0), (1,0,0), (0,1,0), (0,0,1)
  - All weights sum to 1/6 (volume of reference tetrahedron)
  - Parametric domain constraint: ξ + η + ζ ≤ 1
  - Legacy Val{:GLTET*} compatibility maintained

Warning documented:
  - GaussLegendre{3}() has negative weight at centroid (-2/15)
  - May cause numerical issues, GaussLegendre{2}() or {4}() recommended

Net: +93 lines (added extensive documentation, modern types, and safety warnings)
2025-11-21 00:39:27 +02:00
Jukka Aho 8c443a98fb refactor(quadrature): Rename gltri.jl → gl_triangles.jl with modern API
- Deleted: src/quadrature/gltri.jl (131 lines, old zip-based API)
- Created: src/quadrature/gl_triangles.jl (245 lines, modern type-based API)

Key improvements:
- QuadraturePoint{2} with Vec{2} coordinates (not tuples)
- SVector return types (zero allocation)
- @inline directives for performance
- Two variants for order 2 and 3 (default + :B)
- Comprehensive documentation with warnings about negative weights
- All rules 1-point through 12-point (degrees 1-6)

Implemented rules:
  - GaussLegendre{1}(): 1 point (centroid, degree 1)
  - GaussLegendre{2}(): 3 points (degree 2, default variant)
  - GaussLegendre{2,:B}(): 3 points (edge midpoints variant)
  - GaussLegendre{3}(): 4 points (degree 3, default variant, all weights positive)
  - GaussLegendre{4}(): 6 points (degree 4)
  - GaussLegendre{5}(): 7 points (degree 5, includes centroid)
  - GaussLegendre{6}(): 12 points (degree 6)

Technical details:
  - Reference triangle: vertices at (0,0), (1,0), (0,1)
  - All weights sum to 0.5 (area of reference triangle)
  - Parametric domain: [0,1]² with constraint ξ + η ≤ 1
  - Legacy Val{:GLTRI*} compatibility maintained

Warning documented:
  - GaussLegendre{3,:B}() has negative weight at centroid
  - May cause numerical issues, default variant recommended

Net: +114 lines (added extensive documentation, modern types, and variant support)
2025-11-21 00:38:58 +02:00
Jukka Aho 7f7077ee60 refactor(quadrature): Rename glquad.jl → gl_tensor_product.jl with modern API
- Deleted: src/quadrature/glquad.jl (40 lines, programmatic generation only)
- Created: src/quadrature/gl_tensor_product.jl (344 lines, complete implementations)

Key improvements:
- Explicit implementations for Segment, Quadrilateral, Hexahedron
- All rules GaussLegendre{1} through GaussLegendre{5}
- QuadraturePoint{D} with Vec{D} coordinates (not tuples)
- SVector return types for zero allocation
- @inline directives for performance
- Comprehensive documentation per function

Implemented rules:
Segments (1D):
  - GaussLegendre{1}(): 1 point (exact degree 1)
  - GaussLegendre{2}(): 2 points (exact degree 3)
  - GaussLegendre{3}(): 3 points (exact degree 5)
  - GaussLegendre{4}(): 4 points (exact degree 7)
  - GaussLegendre{5}(): 5 points (exact degree 9)

Quadrilaterals (2D tensor products):
  - GaussLegendre{1}(): 1×1 = 1 point
  - GaussLegendre{2}(): 2×2 = 4 points (standard Quad4)
  - GaussLegendre{3}(): 3×3 = 9 points (standard Quad9)
  - GaussLegendre{4}(): 4×4 = 16 points
  - GaussLegendre{5}(): 5×5 = 25 points

Hexahedra (3D tensor products):
  - GaussLegendre{1}(): 1×1×1 = 1 point
  - GaussLegendre{2}(): 2×2×2 = 8 points (standard Hex8)
  - GaussLegendre{3}(): 3×3×3 = 27 points (standard Hex27)
  - GaussLegendre{4}(): 4×4×4 = 64 points
  - GaussLegendre{5}(): 5×5×5 = 125 points

Legacy compatibility:
  - Old Val{:GLSEG*}, Val{:GLQUAD*}, Val{:GLHEX*} symbols still work
  - Uses _legacy_tensor_product() helper (kept old zip-based API)

Technical details:
  - Rules 1-3: Hardcoded for optimal performance
  - Rules 4-5: Generated from QUAD_DATA using ntuple for zero allocation
  - All reference domains: [-1,1]^D

Net: +304 lines (programmatic generation → explicit implementations + docs)
2025-11-21 00:38:28 +02:00
Jukka Aho 0b2195c7c2 refactor(quadrature): Rename glpyr.jl → gl_pyramids.jl with modern API
- Deleted: src/quadrature/glpyr.jl (45 lines, old zip-based API)
- Created: src/quadrature/gl_pyramids.jl (86 lines, modern type-based API)

Key improvements:
- Two pyramid rule variants: GaussLegendre{2}() (default) and GaussLegendre{2,:B}()
- QuadraturePoint{3} with Vec{3} coordinates (not tuples)
- SVector return type (zero allocation)
- Comprehensive documentation explaining pyramid singularity at apex
- Inline functions for performance
- Legacy Val{:GLPYR5} compatibility maintained

Technical details:
- Default variant: 4 base points + 1 elevated, non-uniform weights
- Variant B: 5 points with uniform weights (a = 2/15)
- Both exact for degree 1 polynomials
- Pyramid: quad base at z=0, apex at (0,0,1)

Net: +41 lines (added extensive documentation and modern types)
2025-11-21 00:37:54 +02:00
Jukka Aho 9f242df9db refactor(quadrature): Replace FEMQuad module with streamlined api.jl
- Deleted: src/quadrature/FEMQuad.jl (48 lines, old module wrapper)
- Created: src/quadrature/api.jl (365 lines, comprehensive quadrature API)

Key improvements:
- AbstractQuadratureRule type hierarchy (GaussLegendre, GaussLobatto)
- QuadraturePoint{D,T} struct with Vec{D} coordinates and Float64 weight
- Zero-allocation get_quadrature_points() returning SVector
- Multi-level default_quadrature() dispatch (4 levels: order → topology+order → topology+basis → topology only)
- Comprehensive documentation with examples and performance notes
- Integration with Tensors.jl (Vec) and StaticArrays (SVector)

Replaced:
- Old Val{:symbol} dispatch → Modern type parameters
- Old integrate_1d/2d/3d functions → Removed (not used in codebase)
- Module wrapper → Direct include (quadrature rules now in separate files)

Net: +317 lines (FEMQuad was minimal wrapper, api.jl is complete interface)
2025-11-21 00:37:27 +02:00
Jukka Aho e0d81543f6 refactor(basis): Rename and rewrite lagrange_* files to basis_* with new API
Deleted files:
- src/basis/lagrange_generated.jl (451 lines) - Old generated basis implementations
- src/basis/lagrange_generator.jl (904 lines) - Old generator with complex dispatch

New files:
- src/basis/basis_generated.jl (461 lines) - New generated implementations using get_basis_functions/derivatives API
- src/basis/basis_generator.jl (622 lines) - Simplified generator with VandermondeBasisDescription

Key changes:
- Generator: Simplified from 904 → 622 lines, removed complex dispatch logic
- Generated: New API using get_basis_functions(topology, Lagrange{P}, xi) instead of eval_basis!(Lagrange{T,P}, xi)
- Return types: NTuple → SVector for type stability and StaticArrays compatibility
- Numerical filtering: Added round_coefficient for clean fractions (1/2, 1/3, 1/18, etc.)
- Basis descriptions: Uses VandermondeBasisDescription for element metadata

Net result: 1355 lines removed, 1083 lines added (272 line reduction with cleaner design)
2025-11-21 00:35:33 +02:00
Jukka Aho c4d732a060 refactor(basis): Consolidate abstract.jl and basis_api.jl into single api.jl
Deleted files:
- src/basis/abstract.jl (374 lines) - Old abstract type definitions
- src/basis/basis_api.jl (210 lines) - Old API documentation

New file:
- src/basis/api.jl (164 lines) - Consolidated basis API

Changes:
- Merged AbstractBasis type definition from abstract.jl
- Merged basis evaluation API (get_basis_functions, get_basis_derivatives) from basis_api.jl
- Added AbstractBasisDescription and VandermondeBasisDescription types
- Removed old Lagrange{T,P} (topology in type parameter) - now Lagrange{P} only
- Removed old nnodes formulas (now live in topology module)
- Simplified to clean separation: topology passed separately, not in basis type
- Kept deprecation stubs for eval_basis! and eval_dbasis! for backward compatibility

Net result: 584 lines removed, 164 lines added (420 line reduction)
2025-11-21 00:34:40 +02:00
Jukka Aho 447edd5694 chore: Update Manifest.toml with JuliaFormatter dependencies
Machine-generated lockfile update for:
- Added JuliaFormatter v2.2.0 and its dependencies
- Added CommonMark v0.9.1 (required by JuliaFormatter)
- Added JuliaSyntax v0.4.10 (required by JuliaFormatter)
2025-11-21 00:32:41 +02:00
Jukka Aho 1f97dc4314 deps: Add JuliaFormatter as project dependency
- Added JuliaFormatter = 98e50ef6-434e-11e9-1051-2b60c6c9e899
- Added version constraint: JuliaFormatter = 2.2.0
2025-11-21 00:32:20 +02:00
Jukka Aho 7e3f9bddc1 refactor(topology): Update 3D element reference_coordinates to SVector of Vec
Hexahedron changes:
- Hex8: tuple of tuples → SVector of Vec{3,Float64} (8 corners)
- Added Hex20: SVector with 8 corners + 12 edge midpoints
- Added Hex27: SVector with 8 corners + 12 edge midpoints + 6 face centers + 1 volume center

Pyramid changes:
- Pyr5: tuple of tuples → SVector of Vec{3,Float64} (4 base corners + 1 apex)

Wedge changes:
- Wedge6: tuple of tuples → SVector of Vec{3,Float64} (2 triangular faces)
- Added Wedge15: SVector with 6 corners + 9 edge midpoints
2025-11-21 00:32:06 +02:00
Jukka Aho 342990ce55 refactor(topology): Update Tetrahedron reference_coordinates to SVector of Vec
- Changed Tet4 and Tet10 return types in docstrings: NTuple → SVector{N, Vec{3,Float64}}
- Changed implementations: tuple of tuples → SVector of Vec{3,Float64}
- Updated reference_coordinates for Tet4 (4 nodes) and Tet10 (10 nodes)
2025-11-21 00:31:28 +02:00
Jukka Aho fa02393718 refactor(topology): Update Quadrilateral reference_coordinates to SVector of Vec
- Changed Quad4: tuple of tuples → SVector of Vec{2,Float64}
- Added Quad8: SVector with 4 corners + 4 edge midpoints
- Added Quad9: SVector with 4 corners + 4 edge midpoints + 1 center node
- All return SVector(Vec{2}(...), ...) format with comments
2025-11-21 00:31:09 +02:00
Jukka Aho 0926a7cdbe refactor(topology): Update Triangle reference_coordinates to SVector of Vec
- Changed Triangle{3,6,7,10} return types in docstrings: NTuple → SVector{N, Vec{2,Float64}}
- Changed all implementations: tuple of tuples → SVector of Vec{2,Float64}
- Updated reference_coordinates for Tri3, Tri6, Tri7, Tri10 (4 functions)
2025-11-21 00:30:52 +02:00
Jukka Aho a1d97bb1ef refactor(topology): Update Segment reference_coordinates to SVector of Vec
- Changed Segment{2}: tuple of tuples → SVector of Vec{1,Float64}
- Changed Segment{3}: tuple of tuples → SVector of Vec{1,Float64}
- Both now return SVector(Vec{1}(...), Vec{1}(...), ...) format
2025-11-21 00:30:39 +02:00
Jukka Aho 4bf7d2ef22 docs(topology): Update API documentation for new coordinate types
- Changed reference_coordinates return type docs: tuple of tuples → SVector of Vec
- Added Base.ndims alias function for Base API interoperability
- Updated docstring examples to use SVector(Vec{D}(...)) syntax
- Updated design philosophy examples: removed old Lagrange{Topology,Order} syntax, now Lagrange{Order}
- Clarified topology defines shape+nodes, basis defines interpolation
- Updated backward compatibility notes: Tri3 → Triangle{3}, etc.
2025-11-21 00:30:12 +02:00
Jukka Aho 15e9d71275 docs(quadrature): Add deprecation notices to old integration API
- Added DEPRECATED header comment explaining migration to new API (api.jl)
- Added deprecation notices to AbstractIntegration and IntegrationPoint docstrings
- Added migration example showing old vs new syntax (IntegrationPoint → QuadraturePoint)
- Documented field name changes: ip.ξ → qp.coords
2025-11-21 00:29:48 +02:00
Jukka Aho 3983e19bff refactor(quadrature): Reorganize quadrature file includes
- Added include 'quadrature/api.jl' for core API types
- Renamed includes: 'glquad.jl' → 'gl_tensor_product.jl', 'gltri.jl' → 'gl_triangles.jl', 'gltet.jl' → 'gl_tetrahedra.jl', 'glwed.jl' → 'gl_wedges.jl', 'glpyr.jl' → 'gl_pyramids.jl'
- Updated comments to clarify topology coverage (segments, quadrilaterals, hexahedra now explicit in tensor product comment)
2025-11-21 00:29:25 +02:00
Jukka Aho 3736374976 refactor(includes): Update basis and quadrature module includes
Basis module changes:
- Changed include from 'basis/abstract.jl' to 'basis/api.jl'
- Removed include 'basis/basis_api.jl' (merged into api.jl)
- Renamed includes: 'lagrange_generator.jl' → 'basis_generator.jl', 'lagrange_generated.jl' → 'basis_generated.jl'
- Simplified export comments (removed 'OLD API' / 'NEW API' labels)
- Consolidated exports: removed duplicate 'nnodes', 'get_reference_element_coordinates', 'AbstractPlateBasis', 'DKT', 'dof_types'

Quadrature module changes:
- Added include 'quadrature/api.jl' (new core API)
- Renamed includes: 'gltet.jl' → 'gl_tetrahedra.jl', 'gltri.jl' → 'gl_triangles.jl', 'glwed.jl' → 'gl_wedges.jl', 'glpyr.jl' → 'gl_pyramids.jl', 'glquad.jl' → 'gl_tensor_product.jl'
- Added exports: AbstractQuadratureRule, GaussLegendre, GaussLobatto, QuadraturePoint, default_quadrature

Other:
- Added 'using StaticArrays: SVector' import for topology nodes
2025-11-21 00:29:01 +02:00
Jukka Aho b1ad3f7c51 fix(assemblers): Update create_element_cache to new Lagrange{P} API
- Changed basis instantiation from 'Lagrange{TopologyType,1}()' to 'Lagrange{1}()' (line 123)
- Added comment explaining new API: basis order only, topology passed separately
2025-11-21 00:28:23 +02:00
Jukka Aho 5c015536a2 fix(assembly): Update AssemblyCacheFerrite to new Lagrange{P} API
- Changed struct field from 'basis::Lagrange{T,1}' to 'basis::Lagrange{1}' (line 91)
- Changed constructor from 'Lagrange{T,1}()' to 'Lagrange{1}()' (line 211)
- Added comments explaining new API: basis order only, topology passed separately
2025-11-21 00:28:05 +02:00
Jukka Aho 39b90b210e refactor(elements): Migrate Element constructor to new Lagrange{P} API
- Changed Element(::Type{T}, connectivity) to use Lagrange{order} instead of Lagrange{base_topo,order}
- Commented out old API functions using Lagrange{T,P}: _create_topology_instance, jacobian, get_basis, get_dbasis (lines 680-761)
- Commented out get_integration_points_from_basis (lines 854-883)
- Restored get_base_topology function (needed by Element constructor)
- Updated comment explaining new API: topology passed separately, not in type parameter
2025-11-21 00:27:49 +02:00
Jukka Aho 16b652a13e test(continuum): Remove duplicate test_helpers.jl include
Replace include statement with comment noting that test_helpers.jl is included by parent runtests.jl. This eliminates method overwrite warnings for create_test_mesh() and create_test_kernel().

The parent test suite (runtests.jl) includes test_helpers.jl once, making it available to all sub-tests.
2025-11-20 18:24:58 +02:00
Jukka Aho 46be40bb4a refactor(mesh): Remove duplicate AbstractRefineStrategy definition
Replace abstract type definition with comment pointing to canonical definition in mesh/api.jl.

Eliminates documentation replacement warning while preserving single source of truth for refinement strategy hierarchy.
2025-11-20 18:24:38 +02:00
Jukka Aho 3d3a2bd338 refactor(mesh): Remove duplicate Mesh constructor
Remove positional argument constructor that duplicated keyword constructor functionality. This eliminates method overwrite warning.

Kept only the keyword constructor which provides clearer API:
- mesh = Mesh{Hex8}(nodes, conn; element_sets=..., node_sets=...)

The keyword version is more explicit and prevents accidental parameter ordering mistakes.
2025-11-20 18:24:13 +02:00
Jukka Aho 3f5e913e32 refactor(materials): Remove duplicate compute_stress stub
Replace function stub declaration with comment pointing to canonical definition in materials/api.jl. Preserves comprehensive documentation about stress computation interface.

Eliminates documentation replacement warning while maintaining API contract documentation.
2025-11-20 18:23:54 +02:00
Jukka Aho d43f89d954 refactor(legacy): Remove duplicate AbstractField definition
Replace abstract type definition and documentation with comment pointing to canonical definition in fields/api.jl. Added note about Displacement{Dim} location.

Eliminates documentation replacement warning from legacy physics API file.
2025-11-20 18:23:35 +02:00
Jukka Aho 9eb8634ed9 refactor(fields): Remove duplicate AbstractField definition
Replace abstract type definition with comment pointing to canonical definition in fields/api.jl.

Eliminates documentation replacement warning while keeping single source of truth for AbstractField supertype.
2025-11-20 18:22:59 +02:00
Jukka Aho 4521d27731 refactor(plates): Remove duplicate assemble! stub
Replace function stub declaration with comment pointing to canonical definition in physics/api.jl. Added note that plate formulations should implement specific methods.

Eliminates documentation replacement warning while preserving API documentation context.
2025-11-20 18:22:39 +02:00
Jukka Aho 95aac8a2d5 refactor(basis): Add Serendipity support to basis generator
Three-stage modification to support both Lagrange and Serendipity basis types:

1. Added basis_type parameter (default :Lagrange) to all create_basis() functions
   - Propagated through all three overloads with keyword argument
   - Used in code generation for method signatures

2. Updated ELEMENT_TO_LAGRANGE mapping:
   - Quad8: Changed to tuple (:Serendipity, :Quadrilateral) for 8-node serendipity
   - Quad9: Remains :Quadrilateral for 9-node full Lagrange
   - Added documentation explaining tuple format for serendipity elements

3. Enhanced generation loop to handle three topology cases:
   - Simple symbols (e.g., :Triangle) → Lagrange{Triangle, P}
   - Parametric functions (N -> Hexahedron{N}) → Lagrange{Hexahedron{N}, P}
   - Serendipity tuples (:Serendipity, :Topology) → Serendipity{Topology, P}

Removed 3 duplicate function stub declarations (defined in basis_api.jl):
- get_reference_element_coordinates
- eval_basis!
- eval_dbasis!

This enables clean separation of Quad8 (Serendipity, 8 nodes) from Quad9 (Lagrange, 9 nodes).
2025-11-20 18:22:20 +02:00
Jukka Aho bd66cbf689 chore(basis): Regenerate basis functions with Serendipity for Quad8
Regenerated by lagrange_generator.jl on 2025-11-20 18:14:22.

Changed Quad8 (8-node quadrilateral) from Lagrange{Quadrilateral, 2} to Serendipity{Quadrilateral, 2}. This distinguishes 8-node serendipity (no center node) from 9-node Lagrange (with center node), eliminating method overwrite warnings.

All 6 method definitions updated:
- get_reference_element_coordinates (type and instance)
- get_basis_functions (type and instance)
- get_basis_derivatives (type and instance)

Quad9 remains Lagrange{Quadrilateral, 2} with 9 nodes including center.
2025-11-20 18:21:51 +02:00
Jukka Aho 2452735cf6 feat(basis): Add Serendipity basis type and remove duplicate function stubs
Add Serendipity{T,P} basis type for quadrilateral and hexahedral elements with reduced nodes:
- Struct definition with comprehensive documentation
- ndims methods delegating to topology dimension
- nnodes methods: Quad8 (8 nodes), Hex20 (20 nodes)
- Comparison with Lagrange documented (Quad8 vs Quad9)

Replace 4 function stub declarations with comments pointing to basis_api.jl:
- eval_basis!
- eval_dbasis!
- get_basis_functions
- get_basis_derivatives

This eliminates method overwrite warnings when Quad8 uses Serendipity and Quad9 uses Lagrange.
2025-11-20 18:21:15 +02:00
Jukka Aho f9b949b929 refactor(assemblers): Remove duplicate dofs_per_node stub
Replace function stub declaration with comment pointing to canonical definition in fields/api.jl. This eliminates documentation replacement warning while preserving documentation context.
2025-11-20 18:20:51 +02:00
Jukka Aho c8b118b8b2 test(domains): Remove Vec{3} conversions in stiffness block allocation test
- Changed 'ξ = Vec{3}(ip.ξ)' to 'ξ = ip.ξ' in two test locations
- First occurrence in warm-up loop
- Second occurrence in allocation measurement loop
- No conversions needed since ip.ξ is now already Vec{3}
2025-11-20 17:57:06 +02:00
Jukka Aho 4766cfe65e refactor(domains): Remove Vec{3} conversion in assemble_v2
- Changed 'ξ = Vec{3}(ip.ξ)' to 'ξ = ip.ξ' in compute_element_stiffness!
- No conversion needed since ip.ξ is now already Vec{3}
2025-11-20 17:56:48 +02:00
Jukka Aho 531d5cc208 refactor(assemblers): Remove Vec{3} conversions in geometry cache
- Changed 'ξ = Vec{3}(ip.ξ)' to 'ξ = ip.ξ' in two locations
- First occurrence in ∇N_data_tuple computation
- Second occurrence in detJ_w_tuple computation
- No conversions needed since ip.ξ is now already Vec{3}
2025-11-20 17:56:28 +02:00
Jukka Aho 414de67114 refactor(backend): Remove Vec{3} conversion in CPU backend
- Changed 'ξ = Vec{3}(ip.ξ)' to 'ξ = ip.ξ' in compute_element_stiffness
- No conversion needed since ip.ξ is now already Vec{3}
2025-11-20 17:56:08 +02:00
Jukka Aho 9148ef223b refactor(domains): Remove Vec{3} conversion in update_geometry_cache
- Changed 'ξ = Vec{3}(ip.ξ)' to 'ξ = ip.ξ'
- No conversion needed since ip.ξ is now already Vec{3}
2025-11-20 17:55:23 +02:00
Jukka Aho 49f55ca12a refactor(quadrature): Convert tuple to Vec when constructing IntegrationPoint
- Added Vec{D}(point) conversion before IntegrationPoint construction
- Converts tuple from quadrature rules to Vec for tensor operations
- Eliminates need for Vec{N}(ip.ξ) conversions throughout codebase
2025-11-20 17:55:06 +02:00
Jukka Aho 400e9c7c85 refactor(quadrature): Change IntegrationPoint ξ field from NTuple to Vec
- Changed ξ field type from NTuple{D,Float64} to Vec{D,Float64}
- Updated docstring to reflect Vec type instead of tuple
- Updated example to show Vec construction
- Enables direct use in tensor operations without conversion
2025-11-20 17:54:46 +02:00
Jukka Aho 2bbc9805cb test: Improve reset! test to verify via matrix extraction
Changed verification from counter-only to extracting and checking matrix:
- Added SparseArrays import for nnz()
- Verify nnz(K) > 0 after assembly (triplets exist)
- Verify nnz(K) == 0 after reset (triplets cleared)
- More robust test than checking counter alone

Counter is implementation detail, matrix content is the guarantee.
2025-11-20 17:43:38 +02:00