Commit Graph

1331 Commits

Author SHA1 Message Date
Jukka Aho 6ee2a3b3ff feat(basis): Add ndofs interface to query DOF counts for basis types
- Add `ndofs(::AbstractBasis)` / `ndofs(::Type{<:AbstractBasis})` with docstring and examples
- Default implementation: `ndofs == nnodes` for standard Lagrange bases
- Export `ndofs` alongside `Lagrange` and `nnodes`

This provides a stable API for callers to preallocate element-local buffers and supports plate elements that have multiple DOFs per node.
2025-11-18 15:09:27 +02:00
Jukka Aho 06d6be33df docs(api): Reflow API design documentation and add spacing for readability
- Insert blank lines around headings and list items for better rendering
- Clarify pattern notes: zero-duplication, domain ownership, minimal core
- Improve example spacing so code fences render correctly in generated docs

No code changes; only formatting and readability improvements to the API documentation.
2025-11-18 15:09:09 +02:00
Jukka Aho 9efae115e8 refactor(module): Reorganize includes and re-exports to new modular layout
- Replace `include("formulations/api.jl")` with `include("domains/continuum/formulations.jl")`
- Move domain API includes under `domains/*` (beams, shells, trusses, plates)
- Add plate formulations and plate basis includes (DKT, plate elements)
- Rework quadrature includes to load tables from `quadrature/*` and export `get_quadrature_points`
- Consolidate legacy modules under `legacy/` and adjust includes accordingly
- Consolidate mesh readers under `readers/*` and move GMSH reader into `io/gmsh_reader.jl`
- Replace older assembly includes with `assembly/framework.jl` and `assembly/*` structures
- Export new API symbols and add compatibility re-exports where needed

This change reorganizes the package file structure and wiring to make the new modular architecture (domains, quadrature tables, plate elements, and legacy shims) loadable from the top-level `src/JuliaFEM.jl`.
2025-11-18 15:09:01 +02:00
Jukka Aho 6743aa0d72 deps(manifest): Pin LinearOperators in Manifest.toml
- Added: `LinearOperators` to the `deps` list for the `JuliaFEM` project entry

Reason: The project requires linear-operator abstractions for matrix-free and operator-based solvers/benchmarks. Pinning here documents the dependency and helps maintain reproducible builds.
2025-11-18 15:08:38 +02:00
Jukka Aho a92a7ad083 chore(git): Add common local and editor files to .gitignore
- Added: `.env` to avoid committing local environment variables
- Added: `.vscode/` to ignore editor workspace settings and launch configs
- Added: `trash` to ignore developer temporary files

These entries reduce noisy diffs and help prevent accidental leakage of local secrets or editor-specific files.
2025-11-18 15:08:27 +02:00
Jukka Aho d9fc071304 Move src/solvers_modal.jl to src/legacy/solvers_modal.jl 2025-11-18 14:16:02 +02:00
Jukka Aho 2dc58661ff Move src/solvers.jl to src/legacy/solvers.jl 2025-11-18 14:16:02 +02:00
Jukka Aho 939f107846 Move src/problems_truss.jl to src/legacy/problems_truss.jl 2025-11-18 14:16:02 +02:00
Jukka Aho f4af828583 Move src/problems_mortar_3d.jl to src/legacy/problems_mortar_3d.jl 2025-11-18 14:16:01 +02:00
Jukka Aho e6c37a5287 Move src/problems_mortar.jl to src/legacy/problems_mortar.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 54ba785b1e Move src/problems_heat.jl to src/legacy/problems_heat.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 47a8304682 Move src/problems_elasticity_2d.jl to src/legacy/problems_elasticity_2d.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 66fc03d2b6 Move src/problems_elasticity.jl to src/legacy/problems_elasticity.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 10f99f071a Move src/problems_dirichlet.jl to src/legacy/problems_dirichlet.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 6e278ee5a7 Move src/problems_contact_3d.jl to src/legacy/problems_contact_3d.jl 2025-11-18 14:16:01 +02:00
Jukka Aho 7462a853d1 Move src/problems_contact.jl to src/legacy/problems_contact.jl 2025-11-18 14:16:00 +02:00
Jukka Aho 7d60567d63 Move src/physics_api.jl to src/legacy/physics_api.jl 2025-11-18 14:16:00 +02:00
Jukka Aho d019839b58 Move src/integration/integration.jl to src/quadrature/integration.jl 2025-11-18 14:16:00 +02:00
Jukka Aho e005775ceb Move src/graph/graph_ordering.jl to src/mesh/graph_ordering.jl 2025-11-18 14:16:00 +02:00
Jukka Aho c00f9e0efa Move src/gmsh_reader.jl to src/io/gmsh_reader.jl 2025-11-18 14:16:00 +02:00
Jukka Aho d25bb109b6 Move src/integration/gauss_points.jl to src/quadrature/gauss_points.jl 2025-11-18 14:16:00 +02:00
Jukka Aho 6f65fccb8d Move src/integration/gauss.jl to src/quadrature/gauss.jl 2025-11-18 14:16:00 +02:00
Jukka Aho 725552a88a Move src/fembase_compat.jl to src/legacy/fembase_compat.jl 2025-11-18 14:15:59 +02:00
Jukka Aho ec05018590 Move src/deprecations.jl to src/legacy/deprecations.jl 2025-11-18 14:15:59 +02:00
Jukka Aho 5655e204c9 Move src/deprecated_fembase.jl to src/legacy/deprecated_fembase.jl 2025-11-18 14:15:59 +02:00
Jukka Aho 62afc0e904 Move src/core_types.jl to src/legacy/core_types.jl 2025-11-18 14:15:59 +02:00
Jukka Aho 42e2ce9518 Move src/analysis.jl to src/legacy/analysis.jl 2025-11-18 14:15:58 +02:00
Jukka Aho 9d91733a2b refactor(tests): Reorganize test suite into subdirectories
Remove 71 flat test files from test/ root (all test_*.jl files):
- 22 elasticity tests (1D, 2D, 3D, plane stress/strain, various loads)
- 10 heat transfer tests (2D, 3D, convection)
- 11 mortar contact tests (2D, 3D, mesh tie, contact)
- 7 modal analysis tests
- 4 elasticplastic tests (finite strain, 2D, 3D)
- 3 assembly tests (element, nodal, comparison)
- 14 other tests (jacobian, strain, dirichlet, gpu, etc.)

These tests have been reorganized into subdirectories:
- test/assembly/ - Assembly method tests
- test/basis/ - Basis function tests
- test/backend/ - Backend-specific tests
- test/elements/ - Element-specific tests
- test/geometry/ - Geometry operation tests
- test/integration/ - Integration scheme tests
- test/io/ - Input/output tests
- test/laboratory/ - Material laboratory tests
- test/materials/ - Material model tests
- test/mesh/ - Mesh operation tests
- test/performance/ - Performance benchmarks
- test/physics/ - Physics coupling tests
- test/problems/ - Complete problem tests
- test/solvers/ - Solver tests
- test/topology/ - Topology tests
- test/validation/ - Validation against references
- test/deprecated_tests/ - Deprecated/commented-out tests

Improves test organization: domain-based structure instead of flat file list.
See test/deprecated_tests/README.md for deprecation reasoning.
2025-11-15 18:55:01 +02:00
Jukka Aho 77eebcc666 feat(core): Integrate modular API architecture into main JuliaFEM module
Update src/JuliaFEM.jl to include all domain api.jl files:
- Include api.jl as documentation guide (no type definitions)
- Include formulations/api.jl → export AbstractFormulation, continuum theories
- Include fields/api.jl → export Displacement, Temperature, DisplacementRotation
- Include materials/api.jl → export AbstractMaterial, compute_stress, elasticity_tensor
- Include mesh/api.jl → export AbstractMesh, node-to-elements mapping
- Include beams/shells/trusses/api.jl → export structural formulations
- Include physics.jl → export Physics, DirichletBC, NeumannBC
- Include topology/api.jl → export AbstractTopology{N}, interface functions

Proper dependency order enforced:
1. Core (api.jl documentation)
2. Formulations (HOW to discretize)
3. Fields (WHAT to solve)
4. Materials (constitutive laws)
5. Mesh (topology ownership)
6. Structural (beams/shells/trusses)
7. Physics (coupling all components)
8. Topology (element geometry)

Export statements organized by domain, immediately after each include.
Completes systematic modular API architecture integration.
2025-11-15 18:45:53 +02:00
Jukka Aho 096199af20 docs(api): Create documentation-only core API guide for modular architecture
Create src/api.jl as pure documentation (196 lines, NO type definitions):
- Documents the complete modular API architecture
- Lists all 9 domain api.jl files in dependency order
- Explains design philosophy: zero duplication, domain ownership, minimal core
- Shows type hierarchy across all domains
- Demonstrates assembly dispatch pattern (formulation × field)
- Lists 7 advantages of modular architecture

This file is the architectural guide - all actual type definitions live in
domain-specific api.jl files:
- formulations/api.jl (AbstractFormulation, continuum theories)
- fields/api.jl (Displacement, Temperature, DisplacementRotation)
- materials/api.jl (AbstractMaterial, elastic/plastic)
- mesh/api.jl (AbstractMesh, node-to-elements mapping)
- beams/shells/trusses/api.jl (structural formulations)
- topology/api.jl (AbstractTopology{N}, 17 element types)

Completes systematic modular API refactoring - every domain owns its
abstractions, core is documentation-only.
2025-11-15 18:45:06 +02:00
Jukka Aho 1b18af15a1 refactor(topology): Move interface to topology/api.jl, keep helpers in topology.jl
Refactor src/topology/topology.jl from 173 to 12 lines:
- Remove all AbstractTopology{N} interface definitions (161 lines removed)
- Remove nnodes(), dim(), reference_coordinates(), edges(), faces() stubs
- Interface now defined in src/topology/api.jl (included first)
- Keep file as placeholder for future helper functions
- Add note referencing topology/api.jl for interface

This completes separation of interface (api.jl) from implementations.
Topology/topology.jl previously mixed interface and helpers - now
clean separation following systematic modular architecture pattern.

Part of systematic modular API refactoring.
2025-11-15 18:44:48 +02:00
Jukka Aho 000dee3994 feat(physics): Add physics coupling API with multiphysics support
Create src/physics/api.jl defining physics problem abstractions:
- AbstractPhysics base type for all physics problems
- assemble!() interface for building global system (K, f)
- solve!() interface for solving physics problems
- add_dirichlet!() for essential BCs (prescribed displacements/temperatures)
- add_neumann!() for natural BCs (surface tractions/heat flux)

Physics couples four components: Mesh (where), Material (constitutive law),
Field (what we solve), Formulation (how we discretize). Physics references
Mesh (does not own it) enabling multiphysics: multiple Physics can share
one Mesh for memory efficiency and coupling.

Dispatch specialization via formulation × field type parameters:
  assemble!(::Physics{ContinuumFormulation{FullThreeD}, Displacement{3}, M, Mat})
  assemble!(::Physics{BeamFormulation{Timoshenko}, DisplacementRotation{3}, M, Mat})

Comprehensive documentation with multiphysics examples, dispatch patterns,
and interface contracts. Assembly implementations in src/assembly/.

Part of systematic modular API architecture.
2025-11-15 18:42:03 +02:00
Jukka Aho 2e41f9502d feat(topology): Add element topology API with 17 reference element types
Create src/topology/api.jl defining element topology abstractions:
- AbstractTopology{N} base type (N = node count from mesh connectivity)
- Interface: nnodes(), dim(), reference_coordinates(), edges(), faces()
- 7 shape families: Segment, Triangle, Quadrilateral, Tetrahedron, Hexahedron, Pyramid, Wedge
- 17 concrete types: Seg2/3, Tri3/6/7, Quad4/8/9, Tet4/10, Hex8/20/27, Pyr5, Wedge6/15

Key design: Topology defines SHAPE (triangle), not node count. Node count
comes from basis order: Triangle + Lagrange{Triangle,1} → 3 nodes (Tri3),
Triangle + Lagrange{Triangle,2} → 6 nodes (Tri6). This enables clean
separation: Topology (shape) ≠ Basis (interpolation) ≠ Integration (quadrature).

Reference element coordinates defined for all topologies. Zero-allocation
API using tuples. Backward compatibility: Tri3/Quad4/Tet10 aliased to
shape names with implied basis.

Comprehensive documentation with theory and examples.
Part of systematic modular API architecture.
2025-11-15 18:41:34 +02:00
Jukka Aho d9ca71febd feat(formulations): Add continuum formulation API with four theory variants
Create src/formulations/api.jl defining discretization strategy abstractions:
- AbstractFormulation base type for all formulation strategies
- AbstractContinuumTheory for continuum mechanics theory variants
- ContinuumFormulation{Theory} parameterized formulation struct
- Four concrete theories:
  * FullThreeD - Full 3D (6 stress components, no simplifications)
  * PlaneStress - Thin plates (σ_zz=0, thickness << length)
  * PlaneStrain - Thick sections (ε_zz=0, no z-variation)
  * Axisymmetric - Rotationally symmetric (σ_rr, σ_θθ, σ_zz, σ_rz)

Formulation defines HOW to discretize (math strategy), while Field defines
WHAT to solve (physical quantity). Formulation × Field determines assembly
dispatch: ContinuumFormulation{FullThreeD} + Displacement{3} dispatches to
3D solid mechanics assembly in src/assembly/continuum_3d.jl.

Comprehensive documentation with theory selection guidelines and examples.
Part of systematic modular API architecture.
2025-11-15 18:41:04 +02:00
Jukka Aho e67c888c4d feat(physics): Add concrete Physics implementation with boundary conditions
Create src/physics.jl with concrete Physics struct implementation:
- Physics{Formulation, Field, Mesh, Material} parameterized struct
- DirichletBC for essential BCs (prescribed displacements/temperatures)
- NeumannBC for natural BCs (surface tractions/heat flux)
- Constraint placeholder for future constraint handling
- Constructor with automatic type inference
- add_dirichlet!(physics, nodes, components, value) implementation
- add_neumann!(physics, surfaces, tractions) implementation

Physics references Mesh (does not own it) for memory efficiency and
multiphysics coupling. Type parameter order optimized for dispatch:
formulation × field determines assembly method specialization.

Example:
  physics = Physics(mesh, :all, Displacement{3}(),
                   ContinuumFormulation{FullThreeD}(), steel)

Uses abstract interface from src/physics/api.jl.
Part of systematic modular API architecture.
2025-11-15 18:40:47 +02:00
Jukka Aho a9dc773342 feat(mesh): Add mesh API with topology ownership and node-to-elements mapping
Create src/mesh/api.jl defining mesh-specific abstractions:
- AbstractMesh base type for all mesh structures
- nnodes_total(), nelements() for mesh sizing
- get_node(node_id) returns Vec{Dim} coordinates
- connectivity_matrix() returns element-to-nodes mapping
- get_elements_for_node(node_id) returns node-to-elements mapping (critical for nodal assembly)
- get_element_set(name), get_node_set(name) for named sets (BCs, materials, postprocessing)
- AbstractRefineStrategy, refine() for adaptive mesh refinement

Meshes own topology (coordinates, connectivity). Multiple Physics can
share one Mesh for multiphysics coupling. Node-to-elements mapping
enables nodal assembly pattern (see docs/book/multigpu_nodal_assembly.md).

Part of systematic modular API architecture.
2025-11-15 18:40:23 +02:00
Jukka Aho e9b039509c feat(fields): Add field variable API with Displacement, Temperature, and DisplacementRotation
Create src/fields/api.jl defining field-specific abstractions:
- AbstractField base type for all field variables
- Displacement{Dim} for solid mechanics (Dim DOFs per node: ux, uy, uz)
- Temperature for heat transfer (1 DOF per node: T)
- DisplacementRotation{Dim} for beams/shells (2*Dim DOFs: displacement + rotation)
- dofs_per_node() interface for DOF counting

Field type determines solution vector structure, boundary condition
interpretation, and assembly dispatch. Examples:
- Displacement{3} with ContinuumFormulation{FullThreeD} → 3D elasticity
- Temperature with ContinuumFormulation{FullThreeD} → heat transfer
- DisplacementRotation{3} with BeamFormulation → 6 DOFs (3 trans + 3 rot)

Part of systematic modular API architecture.
2025-11-15 18:40:05 +02:00
Jukka Aho 2be68f3bf3 feat(materials): Add material model API with elastic and plastic abstractions
Create src/materials/api.jl defining material-specific abstractions:
- AbstractMaterial base type for all material models
- AbstractElasticMaterial for stateless materials (no history)
- AbstractPlasticMaterial for stateful materials (history-dependent)
- compute_stress() interface (strain → stress + tangent + updated state)
- elasticity_tensor() for elastic constitutive relations

Material models use Tensors.jl (no Voigt notation). Elastic materials
are stateless (LinearElastic, NeoHookean). Plastic materials have internal
state (plastic strain εᵖ, backstress α, hardening κ, damage).

Interface returns (σ, 𝔻, state_new) where 𝔻 is the material tangent ∂σ/∂ε.

Part of systematic modular API architecture.
2025-11-15 18:39:20 +02:00
Jukka Aho 019926617c feat(shells): Add shell formulation API with Reissner-Mindlin and Kirchhoff-Love theories
Create src/shells/api.jl defining shell-specific abstractions:
- AbstractShellTheory base type for shell theories
- ReissnerMindlin concrete theory (thick shells, includes shear, h/L > 1/20, 5 DOFs)
- KirchhoffLove concrete theory (thin shells, no shear, h/L < 1/20, 3 DOFs)
- ShellFormulation{Theory} parameterized formulation struct

Reissner-Mindlin has 5 DOFs per node (ux, uy, uz, θx, θy) with explicit
rotations. Kirchhoff-Love has 3 DOFs (ux, uy, uz) with rotations computed
from displacement gradients (normals remain perpendicular).

Part of systematic modular API architecture.
2025-11-15 18:38:47 +02:00
Jukka Aho b8c769601b feat(beams): Add beam formulation API with Euler-Bernoulli and Timoshenko theories
Create src/beams/api.jl defining beam-specific abstractions:
- AbstractBeamTheory base type for beam theories
- EulerBernoulli concrete theory (classical, no shear deformation, L/h > 10)
- Timoshenko concrete theory (includes shear, thick beams)
- BeamFormulation{Theory} parameterized formulation struct

Beam elements have 6 DOFs per node (ux, uy, uz, θx, θy, θz) and work
with DisplacementRotation{3} field. Euler-Bernoulli assumes plane sections
remain perpendicular to neutral axis, while Timoshenko allows shear deformation.

Part of systematic modular API architecture.
2025-11-15 18:38:34 +02:00
Jukka Aho 30da7a3ba1 feat(trusses): Add truss formulation API with SimpleTruss theory
Create src/trusses/api.jl defining truss-specific abstractions:
- AbstractTrussTheory base type for truss theories
- SimpleTruss concrete theory (axial force only, pin-jointed)
- TrussFormulation{Theory} parameterized formulation struct

SimpleTruss supports 2D/3D displacement fields with 2 or 3 DOFs per node.
Documented for future extension with CableTruss and PretensionedTruss.

Part of systematic modular API architecture where each structural
element type owns its formulation abstractions.
2025-11-15 18:38:20 +02:00
Jukka Aho 81440d7265 refactor(topology): Remove old per-variant topology files
Remove individual topology files replaced by parametric variants.

Deleted files (16 total):
- Hexahedra: hex8.jl, hex20.jl, hex27.jl → hexahedra.jl with Hexahedron{N}
- Segments: seg2.jl, seg3.jl → segments.jl with Segment{N}
- Quadrilaterals: quad4.jl, quad8.jl, quad9.jl → quadrilaterals.jl with Quadrilateral{N}
- Triangles: tri3.jl, tri6.jl, tri7.jl → triangles.jl with Triangle{N}
- Tetrahedra: tet4.jl, tet10.jl → tetrahedra.jl with Tetrahedron{N}
- Pyramids: pyr5.jl → pyramids.jl with Pyramid{N}
- Wedges: wedge6.jl, wedge15.jl → wedges.jl with Wedge{N}

Each topology type now handles all node count variants via type parameter {N}.
Implements ADR-002 (November 13, 2025): node count from mesh connectivity.
2025-11-15 05:34:51 +02:00
Jukka Aho f980186fb6 refactor(core): Reorganize JuliaFEM.jl main module with new API structure
Major reorganization of main module file to support new architecture.

Changes - Include Order:
- Include api.jl FIRST (all abstract types and interfaces)
- Include physics.jl after api.jl (concrete Physics implementation)
- Material models after physics (LinearElastic, NeoHookean)
- New Mesh{T} infrastructure (mesh.jl, refine.jl, structured.jl)

Changes - Exports:
- Export core API types: AbstractMesh, AbstractTopology, AbstractMaterial, etc.
- Export physics types: AbstractField, AbstractFormulation, Physics, Constraint
- Export boundary conditions: DirichletBC, NeumannBC
- Export mesh operations: Mesh, topology_type, get_elements_for_node, etc.
- Export refinement: AbstractRefineStrategy, LongestEdgeBisection, refine
- Export structured mesh: create_structured_box_mesh, create_cantilever_mesh, etc.

Changes - Removals:
- Remove temporary jacobian() function (now in elements/elements.jl)
- Comment out backend files (need API updates)
- Comment out old Dict-based Mesh (conflicts with new Mesh{T})

Changes - Additions:
- Include assembly/continuum_3d.jl and continuum_3d_v2.jl
- Export compute_element_stiffness for testing

This establishes the foundation for the new type-parametric architecture.
2025-11-15 05:34:19 +02:00
Jukka Aho 9c6086a554 fix(sparse): Qualify isempty() with Base.isempty()
Fix method ambiguity by explicitly qualifying Base.isempty calls.

Changes:
- function isempty(A::SparseMatrixCOO) → function Base.isempty(A::SparseMatrixCOO)
- Internal isempty() calls qualified with Base.isempty()
- Avoids method ambiguity warnings

Consistent with assembly/problems.jl fix (commit 0d41c8c).
2025-11-15 05:33:26 +02:00
Jukka Aho 249646b740 refactor(elements): Update get_basis/get_dbasis to use new topology API
Migrate element basis evaluation functions to use new topology-aware API.

Changes:
- Add _create_topology_instance() helper to construct topology from Lagrange{T,P}
- Update get_basis() to call get_basis_functions(topology, basis, xi)
- Update get_dbasis() to call get_basis_derivatives(topology, basis, xi)
- Add jacobian() function with embedding support (1D element in 2D/3D space)
- Constraint: B <: Lagrange added to method signatures

Migration from OLD API:
- eval_basis!(B, T, xi) → get_basis_functions(topology, basis, xi)
- eval_dbasis!(B, xi) → get_basis_derivatives(topology, basis, xi)

Maintains compatibility: still returns matrices/vectors for old code interface.
2025-11-15 04:41:59 +02:00
Jukka Aho 0d41c8cc4b fix(assembly): Qualify isempty() with Base.isempty()
Fix method ambiguity by explicitly qualifying Base.isempty calls.

Changes:
- function isempty(assembly::Assembly) → function Base.isempty(assembly::Assembly)
- All internal isempty() calls qualified with Base.isempty()
- Avoids method ambiguity warnings

This is a standard Julia pattern for extending Base methods on custom types.
2025-11-15 04:21:33 +02:00
Jukka Aho 8e13862828 feat(integration): Add default_integration() helper function
Add helper to get recommended integration schemes for topology types.

Changes:
- New function: default_integration(::Type{<:AbstractTopology{N}})
- Returns appropriate Gauss{order}() for common topologies
- Rules: linear elements use minimal exact integration, quadratic use higher order
- Implementations for: Tet4/10, Hex8/20/27, Tri3/6, Quad4/8/9

Examples:
- default_integration(Hexahedron{8}) → Gauss{2}() (2×2×2 = 8 points)
- default_integration(Tetrahedron{4}) → Gauss{1}() (1 point)
- default_integration(Hexahedron{27}) → Gauss{3}() (3×3×3 = 27 points)

Simplifies user code: no need to memorize integration order for each element.
2025-11-15 04:16:43 +02:00
Jukka Aho 75735ea63c refactor(topology): Implement Wedge{N} with type parameter
Update Wedge to use node count type parameter per ADR-002.

Changes:
- struct Wedge → struct Wedge{N} <: AbstractTopology{N}
- Aliases: Wedge6 = Wedge{6}, Wedge15 = Wedge{15}
- Simplified implementation following same pattern
- Remove old design documentation

Implements ADR-002 (November 13, 2025): node count from mesh, not basis.

Old files removed: wedge6.jl, wedge15.jl
New file: Single wedges.jl handles all variants via {N}
2025-11-15 04:07:28 +02:00
Jukka Aho a9e31c1ed2 refactor(topology): Implement Pyramid{N} with type parameter
Update Pyramid to use node count type parameter per ADR-002.

Changes:
- struct Pyramid → struct Pyramid{N} <: AbstractTopology{N}
- Alias: Pyr5 = Pyramid{5}
- Simplified implementation following same pattern
- Remove old design documentation

Implements ADR-002 (November 13, 2025): node count from mesh, not basis.

Old file removed: pyr5.jl
New file: Single pyramids.jl handles all variants via {N}
2025-11-15 03:55:02 +02:00
Jukka Aho 2c6d6dc620 refactor(topology): Implement Tetrahedron{N} with type parameter
Update Tetrahedron to use node count type parameter per ADR-002.

Changes:
- struct Tetrahedron → struct Tetrahedron{N} <: AbstractTopology{N}
- Aliases: Tet4 = Tetrahedron{4}, Tet10 = Tetrahedron{10}
- Simplified implementation following same pattern
- Remove old design documentation

Implements ADR-002 (November 13, 2025): node count from mesh, not basis.

Old files removed: tet4.jl, tet10.jl
New file: Single tetrahedra.jl handles all variants via {N}
2025-11-15 02:56:52 +02:00