feat(dofs): add entity-based DOF convenience types

New 169-line file with convenience types and helpers:
- ScalarDOF{E}: type alias for scalar DOFs at entities
- VectorDOF{D,E}: type alias for D-dimensional vector DOFs
- TensorDOF{D,E}: type alias for tensor DOFs
- Convenience constructors for common DOF patterns
- Helper functions for entity-based DOF operations

Provides convenient type aliases for common DOF patterns using entity-based system.
This commit is contained in:
Jukka Aho
2025-12-15 06:09:36 +02:00
parent d105e3e6fa
commit ed30a5fa43
+168
View File
@@ -0,0 +1,168 @@
# This file is a part of JuliaFEM.
# License is MIT: see https://github.com/JuliaFEM/JuliaFEM.jl/blob/master/LICENSE
"""
Entity-Based DOF Implementations
This file provides convenient type aliases and helper functions for common
DOF patterns using the entity-based DOF system.
The core type `DOF{T, E<:TopologicalEntity}` is defined in api.jl.
This file adds convenience constructors and commonly used patterns.
"""
# ============================================================================
# Convenience Type Aliases
# ============================================================================
"""
ScalarDOF{E<:TopologicalEntity}
Type alias for scalar DOFs at entities.
# Examples
```julia
ScalarDOF{Vertex} # Scalar at vertices (any topology)
ScalarDOF{Edge} # Scalar on edges (any topology)
ScalarDOF{Face} # Scalar on faces (any topology)
```
Equivalent to `DOF{Vec{1}, E}` (scalar as 1-component vector).
"""
const ScalarDOF{E} = DOF{Vec{1}, E} where {E<:TopologicalEntity}
"""
VectorDOF{D, E<:TopologicalEntity}
Type alias for D-dimensional vector DOFs at entities.
# Examples
```julia
VectorDOF{2, Vertex} # 2D displacement at vertices
VectorDOF{3, Vertex} # 3D displacement at vertices
VectorDOF{3, Edge} # 3D field on edges
```
Equivalent to `DOF{Vec{D}, E}`.
"""
const VectorDOF{D, E} = DOF{Vec{D}, E} where {D, E<:TopologicalEntity}
"""
TensorDOF{D, E<:TopologicalEntity}
Type alias for D×D tensor DOFs at entities.
# Examples
```julia
TensorDOF{2, Vertex} # 2D stress/strain at vertices
TensorDOF{3, Vertex} # 3D stress/strain at vertices
```
Equivalent to `DOF{Tensor{2,D}, E}`.
"""
const TensorDOF{D, E} = DOF{Tensor{2,D,Float64}, E} where {D, E<:TopologicalEntity}
# ============================================================================
# Common DOF Patterns
# ============================================================================
# Standard Lagrange element DOF types for common problems
const LagrangeHeat1D = DOF{Vec{1}, Vertex}
const LagrangeHeat2D = DOF{Vec{1}, Vertex}
const LagrangeHeat3D = DOF{Vec{1}, Vertex}
const LagrangeElasticity1D = DOF{Vec{1}, Vertex}
const LagrangeElasticity2D = DOF{Vec{2}, Vertex}
const LagrangeElasticity3D = DOF{Vec{3}, Vertex}
# Nédélec (H(curl)) element DOF types for electromagnetic problems
const NedelecScalar1D = DOF{Vec{1}, Edge}
const NedelecScalar2D = DOF{Vec{1}, Edge}
const NedelecScalar3D = DOF{Vec{1}, Edge}
const NedelecVector3D = DOF{Vec{3}, Edge}
# Raviart-Thomas (H(div)) element DOF types for fluid flow problems
const RaviartThomasScalar2D = DOF{Vec{1}, Face}
const RaviartThomasScalar3D = DOF{Vec{1}, Face}
const RaviartThomasVector3D = DOF{Vec{3}, Face}
# Discontinuous Galerkin (DG) element DOF types
const DGScalar = DOF{Vec{1}, Cell}
const DGVector2D = DOF{Vec{2}, Cell}
const DGVector3D = DOF{Vec{3}, Cell}
# ============================================================================
# Helper Functions
# ============================================================================
"""
make_vertex_dof(::Type{T}) where T
Create DOF type for quantity T at vertices.
Topology context comes from Element.
# Examples
```julia
make_vertex_dof(Vec{1}) # DOF{Vec{1}, Vertex}
make_vertex_dof(Vec{3}) # DOF{Vec{3}, Vertex}
```
"""
make_vertex_dof(::Type{T}) where T = DOF{T, Vertex}
"""
make_edge_dof(::Type{T}) where T
Create DOF type for quantity T on edges.
Topology context comes from Element.
# Examples
```julia
make_edge_dof(Vec{1}) # DOF{Vec{1}, Edge}
make_edge_dof(Vec{3}) # DOF{Vec{3}, Edge}
```
"""
make_edge_dof(::Type{T}) where T = DOF{T, Edge}
"""
make_face_dof(::Type{T}) where T
Create DOF type for quantity T on faces.
Topology context comes from Element.
# Examples
```julia
make_face_dof(Vec{1}) # DOF{Vec{1}, Face}
make_face_dof(Vec{3}) # DOF{Vec{3}, Face}
```
"""
make_face_dof(::Type{T}) where T = DOF{T, Face}
"""
make_cell_dof(::Type{T}) where T
Create DOF type for quantity T in cell interior.
Topology context comes from Element.
# Examples
```julia
make_cell_dof(Vec{1}) # DOF{Vec{1}, Cell}
make_cell_dof(Vec{3}) # DOF{Vec{3}, Cell}
```
"""
make_cell_dof(::Type{T}) where T = DOF{T, Cell}
# ============================================================================
# Exports
# ============================================================================
export ScalarDOF, VectorDOF, TensorDOF,
LagrangeHeat1D, LagrangeHeat2D, LagrangeHeat3D,
LagrangeElasticity1D, LagrangeElasticity2D, LagrangeElasticity3D,
NedelecScalar1D, NedelecScalar2D, NedelecScalar3D, NedelecVector3D,
RaviartThomasScalar2D, RaviartThomasScalar3D, RaviartThomasVector3D,
DGScalar, DGVector2D, DGVector3D,
make_vertex_dof, make_edge_dof, make_face_dof, make_cell_dof