# Numerical Conventions ## Purpose This document defines the numerical conventions that must remain stable across the FESA solver, reference data, tests, and result files. When a convention here conflicts with a lower-level implementation note, this document wins unless `docs/ADR.md` is updated. ## Source Basis - Abaqus defines translational DOFs 1-3 and rotational DOFs 4-6, with rotations expressed in radians: https://abaqus-docs.mit.edu/2017/English/SIMACAEMODRefMap/simamod-c-conventions.htm - Abaqus has no built-in unit system except rotation and angle measures; user data must be self-consistent: https://abaqus-docs.mit.edu/2017/English/SIMACAEMODRefMap/simamod-c-conventions.htm - Abaqus uses right-handed coordinate systems and defines shell local surface directions from the projected global axis and positive element normal: https://abaqus-docs.mit.edu/2017/English/SIMACAEMODRefMap/simamod-c-conventions.htm - Intel oneMKL provides `pardiso_64`, an ILP64-style PARDISO interface accepting `long long int` integer data for large sparse systems: https://www.intel.com/content/www/us/en/docs/onemkl/developer-reference-c/2024-2/pardiso-64.html ## Binding Decisions - MITC4 coordinate and strain details will be defined explicitly in `docs/MITC4_FORMULATION.md`. - Phase 1 shell nodes use 6 DOFs per node. - The drilling DOF is retained and receives a small artificial stiffness in Phase 1. - FESA does not enforce a unit system. Input values must be self-consistent, Abaqus-style. - Result sign conventions follow Abaqus conventions. - Essential boundary conditions are applied by constrained DOF elimination. - Reaction forces are recovered from the full system vectors, not from the reduced system alone. - Reference comparison uses stored Abaqus inputs and stored solved reference results under `reference/`. - Mesh quality diagnostics are not part of Phase 1. - Singular system diagnostics are required. - Floating-point values use `double` by default. - Large-model ids and indices use signed 64-bit integers. ## Degrees of Freedom All Phase 1 shell nodes expose six structural DOFs: | FESA Component | Abaqus DOF | Meaning | Unit | |---|---:|---|---| | `UX` | 1 | Translation in global or transformed x-direction | model length | | `UY` | 2 | Translation in global or transformed y-direction | model length | | `UZ` | 3 | Translation in global or transformed z-direction | model length | | `RX` | 4 | Rotation about x-axis | radian | | `RY` | 5 | Rotation about y-axis | radian | | `RZ` | 6 | Rotation about z-axis | radian | Implementation rules: - Store DOF component ids using a compact enum or integer range `1..6`. - Store global node ids, element ids, equation ids, sparse indices, and nonzero counts with signed 64-bit integer types. - `DofManager` owns active DOF discovery, constrained/free partitioning, equation numbering, and sparse pattern inputs. - Do not store equation ids inside `Node` or `Element`. ## Precision and Numeric Types Recommended type aliases: ```cpp using Real = double; using GlobalId = std::int64_t; using LocalIndex = std::int64_t; using EquationId = std::int64_t; using SparseIndex = std::int64_t; ``` Rules: - Use `double` for matrix entries, vector entries, coordinates, material constants, loads, displacements, rotations, and result values. - Use 64-bit integer indexing throughout the sparse assembly path so that MKL `pardiso_64` remains available for large models. - Avoid silent narrowing when passing ids or sparse arrays to external libraries. ## Units FESA follows the Abaqus convention: no unit system is built into the solver. Rules: - The solver core treats all dimensional input as unitless numeric values. - The user and reference data must use a self-consistent unit system. - Rotations are always radians. - Result files may store an optional `unit_system_note` metadata string, but the solver must not convert units. Examples of acceptable unit systems: - `N, mm, tonne, second` - `N, m, kg, second` - `lbf, inch, lbf*s^2/in, second` ## Coordinate Systems Global coordinates: - The default global system is right-handed Cartesian. - Phase 1 does not support user-defined transformed nodal coordinate systems unless explicitly added to `docs/ABAQUS_INPUT_SUBSET.md`. Shell local directions: - FESA result signs follow Abaqus shell local direction conventions. - The exact MITC4 element basis construction must be defined in `docs/MITC4_FORMULATION.md`. - For Abaqus compatibility, the positive shell normal is tied to node ordering by the right-hand rule. - Local 1 and 2 directions must form a right-handed basis with the positive normal. ## Result Sign Convention FESA result sign conventions follow Abaqus unless a FESA-specific exception is documented. Phase 1 output variables: - `U`: nodal displacement and rotation vector in DOF order `UX, UY, UZ, RX, RY, RZ`. - `RF`: nodal reaction force and reaction moment in the same component order. - `S`: shell stress components in local shell directions when available. - `E`: shell strain components in local shell directions when available. - `SF`: shell section force and moment resultants when available. Stress and strain component ordering follows the Abaqus convention: - direct 1 - direct 2 - direct 3 - shear 12 - shear 13 - shear 23 Shear strain output should be documented as engineering shear strain when matched to Abaqus-style output. ## Boundary Conditions Phase 1 uses constrained DOF elimination: 1. Build the full DOF list. 2. Mark constrained DOFs from `*Boundary`. 3. Partition DOFs into free and constrained sets. 4. Assemble or project the reduced free-DOF system. 5. Solve for free DOF unknowns. 6. Reconstruct the full displacement vector. Rules: - Phase 1 supports zero-valued fixed constraints as the primary path. - Nonzero prescribed displacements are not a Phase 1 requirement unless added to `docs/ABAQUS_INPUT_SUBSET.md`. - `DofManager` owns constrained/free mapping and must provide enough data to reconstruct full vectors. ## Reaction Recovery Reaction force and moment recovery uses the full system: ```text R_full = K_full * U_full - F_full ``` Rules: - `K_full` means the assembled stiffness before constrained DOF elimination. - `U_full` means the solved displacement vector reconstructed with constrained DOF values. - `F_full` means the full external load vector in the original global DOF space. - `RF` is reported primarily for constrained DOFs, but full residual-like vectors may be retained for diagnostics. - Reference comparison should include at least one reaction balance test. ## Drilling DOF Policy Phase 1 retains `RZ` at each shell node and assigns a small artificial drilling stiffness. Rules: - The value must be parameterized, not hard-coded deep inside the MITC4 kernel. - The default value must be documented in `docs/MITC4_FORMULATION.md` before implementation. - The artificial stiffness should be small relative to representative membrane or bending stiffness, but large enough to avoid a singular stiffness matrix for unconstrained drilling modes. - Reference comparisons should include sensitivity checks if the drilling stiffness materially changes displacement results. ## Singular System Diagnostics FESA must provide actionable diagnostics before or during linear solve failure. Required Phase 1 checks: - No free DOFs exist after applying constraints. - At least one active element exists in the current `AnalysisModel`. - Every active element references existing nodes. - Every active element references an assigned property and material. - Every active property references an existing material. - Every load and boundary condition references an existing node or node set. - At least one load component is nonzero for ordinary static solve tests unless the test explicitly expects zero response. - Free DOFs exist that are not touched by any active element connectivity. - Rotational DOFs, especially drilling DOFs, may be unconstrained or weakly constrained. - The reduced system size and sparse nonzero count are nonzero before solve. - The sparse solver reports zero pivot, numerical factorization failure, or structural singularity. Recommended diagnostic style: ```text FESA-SINGULAR-DOF-UNTOUCHED: Node 42 DOF RZ is free but has no stiffness contribution from active elements. Check boundary conditions, element connectivity, property assignment, or drilling stiffness settings. ``` Phase 1 explicitly does not perform mesh quality diagnostics such as aspect ratio, warpage, skew, or element distortion checks. ## Reference Comparison Tolerances Reference comparison must use both absolute and relative tolerances: ```text pass if abs(actual - expected) <= abs_tol or abs(actual - expected) <= rel_tol * max(abs(expected), reference_scale) ``` Initial defaults may be proposed per benchmark in `docs/VERIFICATION_PLAN.md`. Final tolerances should be tied to stored reference data and solver maturity. ## Open Decisions - The exact default drilling stiffness scale. - The final MITC4 local basis algorithm for warped quadrilateral elements. - Which shell stress/strain/resultant outputs are mandatory in Phase 1. - The first accepted reference result file format under `reference/`.