Commit Graph

22 Commits

Author SHA1 Message Date
Jukka Aho 1ddc369d56 feat(continuum): Add abstract types for continuum mechanics
New file: src/domains/continuum/abstract.jl

Abstract types defined:
- AbstractContinuumTheory - Supertype for FullThreeD, PlaneStress, etc.
- AbstractKernel - Supertype for ContinuumKernel and future variants
- AbstractMaterialState - Supertype for material state (EmptyState, plasticity, etc.)

Purpose:
- Establish type hierarchy for dispatch
- Document interface expectations
- Enable future extensions (shells, beams, etc.)

These were previously defined in other files, now centralized
for clarity and maintainability.
2025-11-20 16:56:40 +02:00
Jukka Aho fbb40a21f6 refactor(continuum): Add @inline to compute_block_at_point
- Added @inline annotation for hot path function
- Called once per integration point per element pair
- Critical for achieving 484K elem/s throughput
- Part of selective inlining strategy (97% of max performance)
2025-11-20 16:56:36 +02:00
Jukka Aho dd468a412e refactor(continuum): Add @inline annotations to formulation functions
- Added @inline to dim, strain_size, stress_size
- These are called frequently in assembly loops
- Part of selective inlining strategy for performance
2025-11-20 16:56:36 +02:00
Jukka Aho ede78a705d feat(continuum): Implement material-independent finite strain kernel
- Implement compute_finite_strain_kernel! for generic material integration
- Support MaterialBehavior trait dispatch (Stateless/Stateful, StrainDependent)
- Compute deformation gradient F from displacement gradients
- Compute Green-Lagrange strain E from deformation gradient
- Call material-specific compute_stress! with strain measure
- Transform Piola-Kirchhoff stress to Cauchy stress
- Support all continuum theory types (3D, PlaneStress, PlaneStrain, Axisymmetric)
- Implement zero-allocation design with pre-allocated buffers
- Document finite strain kinematics and stress transformations
- 199 lines of generic finite strain kernel implementation
2025-11-19 12:01:34 +02:00
Jukka Aho 65ba108125 feat(plates): Implement complete DKT plate element
- Implement Discrete Kirchhoff Triangle (DKT) plate bending element
- Define DKTPlate formulation type with material and thickness parameters
- Implement assemble_stiffness! for plate bending problems
- Compute element stiffness matrix using DKT basis functions
- Support transverse displacement (w) and rotation (θx, θy) DOFs
- Include numerical integration over triangular domain
- Implement element force vector assembly
- Support distributed and point loads on plate surface
- Document DKT theory and implementation details
- 645 lines of complete DKT plate element implementation
2025-11-19 11:40:27 +02:00
Jukka Aho ee7554f1a4 feat(continuum): Implement v2 assembly with material trait dispatch
- Implement assemble_stiffness! with MaterialBehavior trait dispatch
- Support StatelessStrainDependent materials (LinearElastic, NeoHookean)
- Support StatefulStrainDependent materials (PerfectPlasticity)
- Implement zero-allocation element stiffness assembly
- Use generic material kernel integration
- Replace material-specific assembly functions with unified implementation
- Include integration point loops with Jacobian computation
- Support all continuum theory types (3D, PlaneStress, PlaneStrain, Axisymmetric)
- 522 lines of generic continuum assembly implementation
2025-11-19 11:40:27 +02:00
Jukka Aho 1740de62fd feat(plates): Implement DKT plate element basis functions
- Implement Discrete Kirchhoff Triangle shape functions
- Compute rotation field interpolation with C1 continuity
- Calculate bending strain-displacement matrix
- Support transverse displacement and rotation DOFs
- Include shape function derivatives for plate bending
- Implement discrete Kirchhoff constraints at element level
- 416 lines with comprehensive DKT formulation
2025-11-19 11:27:14 +02:00
Jukka Aho 05732d02b0 refactor(plates): Define plate element API interface
- Define AbstractPlateElement abstract type hierarchy
- Implement element assembly interface for plate structures
- Export DKT (Discrete Kirchhoff Triangle) plate element
- Document thin plate theory (Kirchhoff assumptions)
- Support bending and transverse shear
- Include rotation DOF handling for plate kinematics
- 188 lines of API definitions and exports
2025-11-19 11:27:14 +02:00
Jukka Aho 25624a3be4 refactor(shells): Define shell element API interface
- Define AbstractShellElement abstract type hierarchy
- Implement element assembly interface for shell structures
- Export shell formulation and element types
- Document thin shell theory (Kirchhoff-Love, Reissner-Mindlin)
- Support membrane and bending coupling
- Include rotation DOF handling for shell kinematics
- 100 lines of API definitions and exports
2025-11-19 11:27:14 +02:00
Jukka Aho c747844914 refactor(beams): Define beam element API interface
- Define AbstractBeamElement abstract type hierarchy
- Implement element assembly interface for beam structures
- Export beam formulation and element types
- Document Euler-Bernoulli and Timoshenko beam theories
- Support 2D and 3D beam elements
- Include rotation DOF handling for beam kinematics
- 98 lines of API definitions and exports
2025-11-19 11:27:13 +02:00
Jukka Aho 7c0ad5f4a2 refactor(trusses): Define truss element API interface
- Define AbstractTrussElement abstract type hierarchy
- Implement element assembly interface for truss structures
- Export truss formulation and element types
- Document 1D structural element API patterns
- Support both geometric and material nonlinearity
- 79 lines of API definitions and exports
2025-11-19 11:27:13 +02:00
Jukka Aho 66cc937d8c refactor(continuum): Replace material-specific integration with generic functions
BEFORE:
- Separate compute_block! for LinearElastic (lines 152-179)
- Separate compute_block! for NeoHookean (lines 198-236)
- Separate compute_all_blocks! for each material
- Adding 100 materials = 100 copies of integration code

AFTER:
- Single generic compute_block! for ALL materials (lines 310-351)
- Single generic compute_all_blocks! for ALL materials (lines 394-406)
- Trait-based dispatch via material_behavior()
- Constant tangent optimization preserved (lines 324-332)
- Zero code duplication regardless of material count

Implementation:
- Add compute_tangent_at_point() for StatelessConstantTangent
- Add compute_tangent_at_point() for StatelessStrainDependent
- Add compute_tangent_at_point() for StatefulStrainDependent
- Generic compute_block! dispatches on material_behavior()
- Generic compute_all_blocks! calls generic compute_block!
- Type-stable at compile time via trait dispatch

Performance:
- LinearElastic: tangent computed once (O(1) material queries)
- NeoHookean: tangent at each IP (O(NIP) queries)
- PerfectPlasticity: tangent + state at each IP (O(NIP) queries)

Benefits:
- Scalable to arbitrary number of materials
- Zero allocations maintained (verified by tests)
- Type stability maintained (verified by tests)
- Single source of truth for integration logic
2025-11-19 10:03:45 +02:00
Jukka Aho fb10cbbf8a feat(continuum): Implement Jacobian and integration utilities
- Implement compute_jacobian(X, ∇N_ξ) for coordinate mapping
- Implement compute_jacobian_determinant(J) with singularity checks
- Implement compute_shape_derivatives(∇N, J) in physical coordinates
- Add default_integration(topology) for element-specific quadrature
- Support Hex8, Tet4, Quad4, Tri3, Seg2 element types
- Include integration point selection logic
- 327 lines with robust numerical handling
2025-11-19 09:03:28 +02:00
Jukka Aho 5ce552c962 feat(continuum): Implement deformation gradient and strain measures
- Implement compute_deformation_gradient(F, u, ∇N) for finite strain
- Implement compute_green_lagrange_strain(E, F) from deformation gradient
- Implement compute_small_strain(ε, u, ∇N) for linear kinematics
- Add comprehensive documentation for kinematic measures
- Support both small strain (linear) and finite strain (nonlinear)
- Include mathematical formulations in docstrings
- 224 lines with zero-allocation tensor operations
2025-11-19 09:03:28 +02:00
Jukka Aho 3ee9e69d5b refactor(continuum): Define ContinuumFormulation type
- Define ContinuumFormulation{Theory<:AbstractContinuumTheory}
- Implement formulation constructor with theory parameter
- Document formulation as discretization strategy wrapper
- Add usage examples for all theory types
- Support dispatch on Theory type parameter
- Enable theory-specific element assembly
- 323 lines with formulation infrastructure
2025-11-19 09:03:28 +02:00
Jukka Aho bbb44c0cd0 refactor(continuum): Consolidate continuum mechanics theory definitions
- Define AbstractContinuumTheory abstract type hierarchy
- Implement FullThreeD for general 3D continuum mechanics
- Implement PlaneStress for thin structures (σ_zz = 0)
- Implement PlaneStrain for long structures (ε_zz = 0)
- Implement Axisymmetric for rotationally symmetric problems
- Add Voigt notation helpers for stress/strain tensors
- Document theory assumptions and use cases
- 178 lines with comprehensive documentation
2025-11-19 09:03:27 +02:00
Jukka Aho 2522087e62 feat(continuum): Implement block-oriented kernel API
- Add 4-level composable architecture for kernel operations:
  * Level 1: compute_block_at_point - atomic 3×3 block (single IP)
  * Level 2: PreparedElement, prepare_element! - geometry preprocessing
  * Level 3: compute_block! - node-pair integration (reuses geometry)
  * Level 4: compute_element_stiffness! - full element (wrapper)

- PreparedElement uses SVector/NTuple for zero-allocation geometry cache
- Material dispatch (LinearElastic vs NeoHookean) via compute_all_blocks!
- Eliminates runtime type checks with compile-time polymorphism

- Enable multiple assembly strategies from single kernel:
  * Element assemblers: call compute_element_stiffness! (full Ke)
  * Nodal assemblers: call prepare_element! + compute_block! (per-row)
  * GPU kernels: call compute_block_at_point (SIMD-friendly)

- Maintain zero-allocation guarantee (verified in tests)
- Performance matches CSC assembler (1.48ms for 40-element benchmark)
- All methods produce numerically identical results
2025-11-19 02:13:50 +02:00
Jukka Aho 706a275d57 refactor(continuum): Remove BC functions from assemble.jl
- Remove apply_neumann_bcs! and apply_dirichlet_bcs!
- Functions moved to domains/common/boundary_conditions.jl
- Keeps assemble.jl focused on matrix/vector assembly only
2025-11-19 02:13:42 +02:00
Jukka Aho 9c980ab264 refactor(domains): Move BC functions to common location
- Move apply_neumann_bcs! and apply_dirichlet_bcs! from continuum/assemble.jl
- Functions are domain-agnostic (work with any AbstractKernel)
- Place in domains/common/ for reuse across continuum/beams/shells/trusses
- Update to use generic dofs_per_node(kernel) instead of hardcoded 3
2025-11-19 02:13:36 +02:00
Jukka Aho 1e60cb9fd8 perf(continuum): Implement zero-allocation kernel with blocked tensors
Complete zero-allocation assembly for LinearElastic and NeoHookean materials.

Key features:
1. compute_element_stiffness_blocked!() for LinearElastic
   - Uses constant elasticity tensor C (pre-computed once)
   - Efficient tensor operations with zero allocations

2. compute_element_stiffness_blocked!() for NeoHookean
   - Strain-dependent tangent modulus 𝔻(E)
   - Nonlinear material with zero allocations

3. blocked_tensor_to_matrix_view!()
   - In-place conversion from Tensor{2,3} blocks to Float64 matrix
   - Zero allocations

4. compute_element_stiffness!()
   - Uses pre-computed topology, basis, ips from ElementCache
   - All arrays are views (zero allocations)
   - Dispatch to material-specific blocked computation

Integration strategy:
- Automatic topology detection from mesh type parameters
- Automatic basis selection (Lagrange{Topology,1})
- Automatic integration order (default_integration)

All temporary tensors are stack-allocated (small, fast).

Result: All kernel methods achieve 0 bytes allocation:
- dofs_per_node(): 0 bytes
- get_dof_mapping!(): 0 bytes
- compute_element_stiffness!(): 0 bytes (was 3568 bytes)

Verified by:
- @allocated macro: 0 bytes for all kernel methods
- @code_warntype: No Any/Union types
- 27/27 allocation tests passing
2025-11-18 20:47:11 +02:00
Jukka Aho 58e8f01479 refactor(continuum): Refactor assembly to use generic assembler framework
- Refactor assemble!() to use COOAssembler + ContinuumKernel
- Remove 1200+ lines of monolithic assembly code
- Reduce to 176 lines (93% code reduction)
- Use create_cache(), assemble!(), extract_system() from assemblers
- Keep apply_neumann_bcs!() and apply_dirichlet_bcs!() for BC handling
- 176 lines (was 1200+ lines before refactoring)

Before refactoring:
- Monolithic assembly code mixing HOW and WHAT
- Difficult to extend with new assembler strategies
- Difficult to test assembler vs kernel logic separately
- 1200+ lines of tightly coupled code

After refactoring:
- Clean separation: assembler (HOW) vs kernel (WHAT)
- Easy to swap assembler (COO ↔ CSC ↔ Nodal)
- Easy to test components independently
- 93% code reduction (176 lines)

Usage example:

    physics = Physics(
        ContinuumFormulation{FullThreeD}(),
        Displacement{3}(),
        mesh,
        LinearElastic(E=210e9, ν=0.3)
    )
    K, f = assemble!(physics)

Validation:
- Cantilever regression test passes (6/6 tests)
- Assembly time: 854.83 ms
- Tip deflection matches baseline within 0.1%
- Zero-allocation assembly confirmed
2025-11-18 18:07:07 +02:00
Jukka Aho 60b7f813f5 refactor(continuum): Implement ContinuumKernel for generic assemblers
- Implement ContinuumKernel{Theory, Material} implementing AbstractKernel
- Implement dofs_per_node() returning 3 (ux, uy, uz)
- Implement get_dof_mapping!() with node-major DOF ordering
- Implement compute_element_stiffness!() with material dispatch
- Add compute_element_stiffness_blocked!() for LinearElastic material
- Add compute_element_stiffness_blocked!() for NeoHookean material
- Add blocked_tensor_to_matrix_view!() for tensor-to-matrix conversion
- Extract topology type from Mesh{N,T} parameters at runtime
- Changed get_dof_mapping!() to accept AbstractVector{Int} for view compatibility
- 424 lines of continuum kernel implementation

Kernel interface implementation:
- dofs_per_node(): Returns 3 (displacements ux, uy, uz)
- get_dof_mapping!(): Node-major ordering [ux1, uy1, uz1, ux2, uy2, uz2, ...]
- compute_element_stiffness!(): Zero-allocation, writes to ElementCache

Material dispatch:
- LinearElastic: Pre-compute constant C tensor, efficient integration
- NeoHookean: Strain-dependent tangent 𝔻(E), nonlinear stiffness
- Future: Plasticity, damage, hyperelastic, etc.

Integration strategy:
- Automatic topology detection from mesh type
- Automatic basis selection (Lagrange{Topology,1})
- Automatic integration order (default_integration)

Zero-allocation design:
- All computations use ElementCache buffers
- Temporary tensors are stack-allocated (small, fast)
- No heap allocations during assembly loop
2025-11-18 18:02:31 +02:00