abq2ccx 1.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
abq2ccx-1.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sander van den Broek
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
abq2ccx-1.2.0/PKG-INFO ADDED
@@ -0,0 +1,274 @@
1
+ Metadata-Version: 2.4
2
+ Name: abq2ccx
3
+ Version: 1.2.0
4
+ Summary: Convert Abaqus .inp decks to CalculiX (ccx) decks
5
+ Author: Sander van den Broek
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/sandervdbroek/abq2ccx
8
+ Keywords: abaqus,calculix,ccx,finite element,converter
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Environment :: Console
12
+ Classifier: Topic :: Scientific/Engineering
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Dynamic: license-file
17
+
18
+ # abq2ccx — Abaqus → CalculiX input converter
19
+
20
+ `abq2ccx.py` converts an Abaqus `.inp` deck into a [CalculiX](http://www.calculix.de/)
21
+ (`ccx`) deck. It is one Python 3 file with no dependencies.
22
+
23
+ CalculiX copies most of Abaqus' keyword syntax, so much of a deck passes through as it is;
24
+ the work is in the parts that differ. The converter knows the complete CalculiX 2.22 + 2.23
25
+ keyword set and does one of three things with every Abaqus card: passes it through,
26
+ translates it into the CalculiX construct that does the same, or comments it out with a
27
+ warning that says what to do. Nothing is dropped silently, and nothing that changes the
28
+ physics happens unless you ask for it with `--approximate`.
29
+
30
+ ## Quick start
31
+
32
+ Run the file with Python 3.9 or later — copy it anywhere — or install it as the `abq2ccx`
33
+ command (`abq2ccx model.inp`, same options):
34
+
35
+ ```bash
36
+ pipx install abq2ccx # from PyPI
37
+ pipx install git+https://github.com/sandervdbroek/abq2ccx # the latest main
38
+ ```
39
+
40
+ ```bash
41
+ python3 abq2ccx.py model.inp # -> model_ccx.inp (+ model_ccx.log)
42
+ python3 abq2ccx.py decks/*.inp --outdir out # batch-convert into a directory
43
+ python3 abq2ccx.py model.inp --run # convert, run CalculiX, digest its results
44
+ python3 abq2ccx.py model.inp --check # report only, write nothing
45
+ ccx model_ccx # run it yourself (no .inp extension)
46
+ ```
47
+
48
+ Always read the report: it is printed to stderr, written to `*_ccx.log` and repeated as
49
+ `**` comments at the top of the converted deck. The [user guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md) has
50
+ every option, the exit codes and the Python API.
51
+
52
+ ```python
53
+ import abq2ccx
54
+ result = abq2ccx.convert_file("model.inp") # or convert_text(deck_string)
55
+ print(result.report.summary()) # "N warning(s), M note(s), K commented card(s)"
56
+ ```
57
+
58
+ ## What it converts
59
+
60
+ * **Mesh generation** (`*NGEN`, `*NFILL`, `*NCOPY`, `*ELGEN`, `*ELCOPY`) → explicit nodes
61
+ and elements.
62
+ * **Parts, instances and assemblies** → one flat model, with instance transforms applied
63
+ and part-level sections, constraints and orientations copied per instance.
64
+ * **Elements** → CalculiX types, keeping the node count. Incompatible-mode `CPS4I`/`CPE4I`
65
+ become exact one-element-thick `C3D8I` slabs (ccx has no such plane element); beams under
66
+ circular, pipe and box sections get the midside nodes ccx 2.23 needs; planar beams and
67
+ trusses are held in their plane; surface elements leave the mesh and their loads become
68
+ nodal forces; connector elements become their kinematic constraints. A substitution that
69
+ changes the element formulation (hybrid, modified or thin-shell elements run as ccx's
70
+ plain ones) is flagged as reduced physics.
71
+ * **Materials and orientations** — elastic types, plasticity (including Johnson-Cook), the
72
+ Johnson-Cook damage initiation criterion ccx shares with Abaqus, thermal expansion,
73
+ composite layups and per-element `*DISTRIBUTION` orientations (variable-angle-tow layups);
74
+ composite `S4R`/`S4`/`S3` shells run as `S8R`/`S6`, composite continuum shells (`SC8R`,
75
+ `SC6R`) as one solid per ply.
76
+ * **Constraints** — `*MPC`, kinematic couplings and rigid bodies (with *knot beams* where
77
+ ccx 2.23 rejects rigid constraints on shell and beam nodes), and the overconstraints ccx
78
+ rejects but Abaqus resolves.
79
+ * **Rigid tools** — rigid elements (`R3D3`, `R3D4`, `R2D2`, `RAX2`, …) become force-free
80
+ solid skins carried by their rigid body, so contact against them works; analytical rigid
81
+ surfaces are meshed the same way, curved ones only with `--approximate`; a `*TIE` to a
82
+ rigid surface makes its nodes part of the body, and `ROTARYI` becomes point masses.
83
+ * **Loads and BCs** — surface tractions and beam line loads become consistent nodal forces;
84
+ velocity and acceleration BCs become integrated displacement BCs; `*TRANSFORM` local axes
85
+ are respected wherever ccx reads them.
86
+ * **Steps and output** — explicit dynamics with Abaqus/Explicit's defaults, output requests
87
+ fitted to ccx's `.frd`/`.dat` model, and Abaqus' preselected output.
88
+
89
+ The exact handling of every keyword, element type and output variable is in the generated
90
+ references: [keywords](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/keyword-reference.md), [elements](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/element-reference.md),
91
+ [output variables](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/output-reference.md).
92
+
93
+ **Reduced physics.** Whatever the converter has to drop or replace of the Abaqus model — a
94
+ constitutive behaviour ccx lacks (concrete damaged plasticity, user hardening, Chaboche
95
+ back-stresses, field-dependent properties), an element formulation, a section control, a
96
+ constraint or interaction, a load — is named in a "Reduced physics" warning at the end of
97
+ the report (`Converter.reduced_physics` in the API): ccx then runs, but not the deck's own
98
+ problem.
99
+
100
+ **`--approximate`** (off by default) lets the converter reframe what ccx cannot run exactly
101
+ as a close equivalent, each flagged `[APPROX]` — a Riks step as plain static, ν ≥ 0.5 as
102
+ 0.475, an I-section in space as ccx's `U1` beam with too stiff a torsion (or an equivalent
103
+ rectangle where `U1` cannot run), NLGEOM follower tractions as fixed nodal
104
+ forces, a curved analytical rigid surface as flat facets, and a few more
105
+ ([full list](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md#--approximate)). Without it those cards are commented out
106
+ with the reason, so ccx never silently runs a different model.
107
+
108
+ ## Validation
109
+
110
+ `python validate_with_ccx.py` converts the bundled examples, runs them in CalculiX (it finds
111
+ `ccx`, including FreeCAD's copy) and compares each result with an independent reference. It
112
+ prints one `PASS` line per check, about a hundred in all; [testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) lists them.
113
+
114
+ | Check | Reference | Agreement |
115
+ | --- | --- | --- |
116
+ | NAFEMS LE10 thick plate (`*NCOPY`, `*ELGEN`, pressure face) | published σyy at D = −5.38 MPa | −5.650 MPa, 5 % (element and mesh) |
117
+ | the same plate loaded through `SFM3D8` surface elements | its face-pressure result | 7 digits |
118
+ | circular, pipe, box and planar beams; I, hexagonal and general sections as ccx's `U1` beam (cantilevers, a portal frame), general sections with a ccx profile (NAFEMS NL6); beam line loads; pinned, tied and hinged spans | beam theory, Euler buckling, the direct-stiffness frame, Abaqus' and NAFEMS' published answers | ≤ 2.4 % |
119
+ | Cook's membrane under a shear traction; a thick cylinder under a radial traction | published 23.96; Lamé | 0.12 %; 0.02 % |
120
+ | rigid couplings, `*MPC`s, connectors, BCs on coupled nodes, loads, connectors, `*MPC`s and rotations on `*TRANSFORM`ed nodes | the same model built another way (solids, hand-written equations, no transform) | ≤ 4e-5 of \|u\|, mostly exact |
121
+ | per-element `*DISTRIBUTION` orientations (a solid plate, a composite shell) | one `*ORIENTATION` per element | ≤ 3e-11 |
122
+ | a simply supported [0/90/0] plate as composite `S4R` (run as `S8R`) and `SC8R` (one `C3D8I` per ply); a [30/-60/45]s laminate's in-plane stiffness in the x-y and x-z planes (`S4R`, `SC8R`, `SC6R`) | classical lamination theory (Navier, A); Pagano's 3-D elasticity solution | 0.15 % (`S8R`, a/h = 100); 1.0 % / 2.3 % (plies, a/h = 100 / 10); A ≤ 2e-5 |
123
+ | thermal expansion (orthotropic, anisotropic, no initial temperatures) | α ΔT; analytic stress | ≤ 5e-6 |
124
+ | velocity / acceleration BCs; displacement BCs without an amplitude | their time integral; wave theory; Abaqus' default amplitudes | 5e-5 of the travel; wave stress ≈ 1 % on average; exact |
125
+ | preselected and default output, contact output | statics, wave theory | ≤ 0.005 % (static) |
126
+ | `CPS4I` / `CPE4I` cantilevers under an end couple (as `C3D8I` slabs) | beam theory (deflection, σ_xx = −My/I, σ_zz) | 4e-8 |
127
+ | pressure on a shell's `SPOS` / `SNEG` side and element-based `P` | Navier plate solution, each sign | 1.0 % |
128
+ | a bare `*KINEMATIC` (all DOFs); an assembly with a turned instance | `*RIGID BODY`; the same model written flat | exact |
129
+ | a rigid flat punch of `R3D4`, `R2D2` or `RAX2` elements or the same face as an analytical surface, also turned under NLGEOM and in explicit dynamics; a block tied to a turning rigid plate; pressure on rigid elements; `MASS` + `ROTARYI` on a rigid plate | ccx's penalty contact law; the punch given its motion node by node; p / k; spring frequencies | ≤ 8e-7 of \|u\|, mostly round-off |
130
+ | a faceted analytical sphere on a block (`--approximate`) | Hertz | 2.3 % (finite block, penalty contact) |
131
+
132
+ A **corpus of 1052 genuine Abaqus decks** — 1022 from about 180 public repositories (CAE
133
+ exports, UMAT and UEL decks, explicit and coupled models, …) and 30 NAFEMS benchmark decks of
134
+ the Abaqus 2017 documentation — is fetched on demand and run through convert → integrity check
135
+ → ccx. On ccx 2.23 all 1052 convert with no dangling reference; **189 solve the deck's own
136
+ physics**; 45 more solve but stay out of that count — 14 load nothing in the source deck, 33
137
+ (3 of them also unloaded) solve a model with reduced physics, and one converges to a solution
138
+ that is not the deck's (a part that only contact holds drifts away in ccx) — and 221 mesh-only
139
+ decks are accepted. The other 597 need what ccx cannot run — mostly user materials (353) and
140
+ user elements (66). **26 benchmark decks are checked against their published answer**: 19
141
+ match Abaqus' result for the same mesh (within 0.5 % for temperatures and frequencies, 1 % for
142
+ stresses and displacements), 7 differ for reasons traced to ccx (its nodal extrapolation,
143
+ plane-stress slab, film integration, mass matrices, coarse shell and beam meshes). See
144
+ [testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md#published-answers).
145
+
146
+ ## How it works
147
+
148
+ ```
149
+ read (+ *INCLUDE, *PARAMETER) → flatten *PART/*INSTANCE/*ASSEMBLY
150
+ → build the geometry (expand mesh generation) → plan deck-wide fixes
151
+ → translate card by card → settle *EQUATION dependents, audit loads → write
152
+ ```
153
+
154
+ | Bucket | Action | Examples |
155
+ | --- | --- | --- |
156
+ | Supported | emitted as it is | `*PLASTIC`, `*CONTACT PAIR`, `*DENSITY` |
157
+ | Translated | a handler adjusts the keyword, parameters or data | `*ELASTIC`, `*SHELL SECTION`, `*STEP`, `*DSLOAD`, output cards |
158
+ | Equivalent | mapped to the CalculiX construct that does the same | `*MPC BEAM` → `*RIGID BODY`, connectors → `*EQUATION`s, tractions → `*CLOAD` |
159
+ | Dropped | organisational, no CalculiX meaning | `*PART`/`*INSTANCE`/`*ASSEMBLY` (flattened), `*PREPRINT` |
160
+ | Commented | no equivalent: kept as `**` comments with a warning | `*VISCOELASTIC`, `*CONNECTOR BEHAVIOR`, `*INERTIA RELIEF` |
161
+
162
+ The [architecture guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/architecture.md) describes the pipeline and how to extend it.
163
+
164
+ ## Limitations
165
+
166
+ * User subroutines (UMAT/VUMAT, UEL, DLOAD, DISP, …) do not run in stock ccx. Such cards are
167
+ commented out, naming the ccx subroutine to port; a UMAT runs in a ccx built with it
168
+ (`--abaqus-umat`), a VUMAT has no ccx interface.
169
+ * Cohesive and gasket elements run as thin continua (their traction-separation law is lost;
170
+ warned). Abaqus general contact (`*CONTACT`), connector behaviours, inertia relief and
171
+ materials such as viscoelasticity and concrete damaged plasticity have no equivalent and
172
+ are flagged for remodelling; a deck that runs without them is flagged as reduced physics.
173
+ * ccx's own first-order elements are not Abaqus': its `CPE4`/`C3D8`/`CAX4` are plain 2×2(×2)
174
+ integration, without Abaqus' selectively reduced volume terms (on a coarse bending mesh
175
+ Abaqus' `CPE4` deflects 9–19 % more for ν 0–0.3), and its `CPS4` is a 3-D slab with a free
176
+ thickness, not 2-D plane stress ([compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md)).
177
+ * Explicit coupled temperature–displacement steps do not run; Riks steps, NLGEOM follower
178
+ tractions and curved analytical rigid surfaces run only with `--approximate`.
179
+ * Contact is translated card by card, but ccx's penalty contact behaves differently from
180
+ Abaqus' — check it.
181
+ * ccx 2.23 gets some valid input wrong without an error. The converter works around what it
182
+ can and warns about the rest ([compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md),
183
+ [troubleshooting](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/troubleshooting.md)).
184
+ * The converter checks structure, and physics on its benchmarks — not on your model. Run ccx
185
+ and sanity-check the results.
186
+
187
+ Validated on CalculiX 2.23 (the FreeCAD 1.1.4 build); written for 2.22–2.23.
188
+
189
+ ## Examples
190
+
191
+ | File | Exercises |
192
+ | --- | --- |
193
+ | [`nle10_thickplate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/nle10_thickplate.inp) | NAFEMS LE10: C3D20, `*NCOPY` + `*ELGEN`, `GEN`/`PERT`, `*DLOAD Px` |
194
+ | [`nle10_surface_elements`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/nle10_surface_elements.inp) | the same plate loaded through an `SFM3D8` skin → nodal forces |
195
+ | [`composite_shell`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_shell.inp) | S8R composite layup, orthotropic, `*ORIENTATION`, `ENCASTRE`, `*DSLOAD` |
196
+ | [`composite_plate_s4r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_plate_s4r.inp), [`composite_plate_sc8r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_plate_sc8r.inp) | a simply supported cross-ply plate: composite `S4R` → `S8R`; composite `SC8R` → one `C3D8I` per ply |
197
+ | [`composite_inplane_s4r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_inplane_s4r.inp), [`composite_inplane_sc8r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_inplane_sc8r.inp) | an angle-ply laminate's in-plane stiffness; BCs interpolated onto the new nodes |
198
+ | [`assembly_two_blocks`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_two_blocks.inp) | two-instance assembly, an `instance.node` reference in a step |
199
+ | [`beam_circ_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_cantilever.inp) | `B31` + `SECTION=CIRC` → `B32` with midside nodes, radius → diameters |
200
+ | [`beam_pipe_box_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_pipe_box_cantilever.inp) | `PIPE31` + `SECTION=PIPE` and `B32` + `SECTION=BOX` → `B32R` |
201
+ | [`beam_circ_rotation_bcs`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_rotation_bcs.inp) | circular-section beams with a held twist and a prescribed rotation → knot beams |
202
+ | [`beam_circ_explicit`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_explicit.inp) | a circular-section beam in `*DYNAMIC, EXPLICIT` → a maximum time increment |
203
+ | [`planar_pinned_beam`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/planar_pinned_beam.inp), [`planar_pinned_circ_beam`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/planar_pinned_circ_beam.inp) | planar `B21` beams in `*FREQUENCY` + `*BUCKLE` → planar constraint |
204
+ | [`beam_line_load_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_line_load_cantilever.inp) | `*DLOAD PY` / `P2` / `PZ` on `B31`, `B32` and a `CIRC` beam → nodal forces |
205
+ | [`beam_output_requests`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_output_requests.inp) | output at `B32` nodes → `OUTPUT=2D`, `*NODE PRINT`, `*TIME POINTS` |
206
+ | [`coupling_shell_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_shell_plate.inp), [`coupling_solid_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_solid_plate.inp) | a rigid coupling on `S8R` nodes (knot beams) and its `C3D20R` reference |
207
+ | [`coupling_bc_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_bc_bars.inp) | BCs on coupled nodes that the reference point imposes → taken off |
208
+ | [`rigid_body_bc_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_body_bc_bars.inp) | BCs on `*RIGID BODY` nodes → moved to the reference node, as Abaqus does |
209
+ | [`equation_overconstraint`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/equation_overconstraint.inp) | an `*EQUATION` on a BC'd DOF, a duplicate and a loop of ties |
210
+ | [`mpc_beam_lever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_beam_lever.inp), [`mpc_pin_tie_joints`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_pin_tie_joints.inp), [`mpc_link`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_link.inp) | `*MPC BEAM`, `PIN`, `TIE`, `LINK` |
211
+ | [`connector_hinge_beams`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_hinge_beams.inp), [`connector_hinge_bodies`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_hinge_bodies.inp), [`connector_ground_hinge`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_ground_hinge.inp) | `CONN3D2` `HINGE` connectors between beams, rigid bodies and to ground |
212
+ | [`connector_transform_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_transform_plate.inp), [`connector_transform_join`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_transform_join.inp) | `JOIN` / `LINK` connectors on nodes with a `*TRANSFORM` |
213
+ | [`mpc_transform`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_transform.inp) | `*MPC` `PIN`, `TIE` and `LINK` on nodes with a `*TRANSFORM` → local DOFs, twin nodes |
214
+ | [`op_new_respecify`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/op_new_respecify.inp), [`op_new_remove`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/op_new_remove.inp) | `*BOUNDARY, OP=NEW` after rotational BCs on beams and shells |
215
+ | [`distribution_solid_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/distribution_solid_plate.inp), [`distribution_shell_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/distribution_shell_plate.inp) | per-element `*DISTRIBUTION` orientations (solid, composite S8R); `*_explicit` are their one-orientation-per-element twins |
216
+ | [`thermal_expansion_cubes`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/thermal_expansion_cubes.inp) | isotropic `*Elastic` beside ORTHO / ANISO `*Expansion` |
217
+ | [`thermal_no_initial_temperature`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/thermal_no_initial_temperature.inp) | `*Temperature` without initial temperatures |
218
+ | [`cook_membrane_traction`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cook_membrane_traction.inp), [`cylinder_traction_cax`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cylinder_traction_cax.inp) | `*DSLOAD TRVEC` on `CPS8` and `CAX8` edges → nodal forces |
219
+ | [`traction_transformed_face`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/traction_transformed_face.inp), [`transform_spherical_rigid`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/transform_spherical_rigid.inp) | loads on `*TRANSFORM`ed nodes; a spherical transform; a transformed rigid-body reference point |
220
+ | [`transform_rotations`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/transform_rotations.inp) | rotational BCs and moments on a transformed kinematic reference point (→ `*RIGID BODY` with a `ROT NODE` in its axes) and beam tip (→ knot, global components) |
221
+ | [`velocity_bc_column`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/velocity_bc_column.inp), [`velocity_bc_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/velocity_bc_bar.inp) | `*BOUNDARY, TYPE=VELOCITY` (implicit and explicit) |
222
+ | [`default_amplitude_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/default_amplitude_bars.inp) | a displacement `*BOUNDARY` and a `*CLOAD` without an amplitude → ramped / stepped as in Abaqus (run as `*DYNAMIC`, `*VISCO`, coupled and explicit) |
223
+ | [`preselect_output_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/preselect_output_bar.inp), [`explicit_default_output_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/explicit_default_output_bar.inp), [`preselect_contact_blocks`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/preselect_contact_blocks.inp) | Abaqus' preselected and default output |
224
+ | [`cps4i_slab_bending`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cps4i_slab_bending.inp) | a `CPS4I` cantilever under an end couple → `C3D8I` slabs (also run as `CPE4I`) |
225
+ | [`shell_pressure_sides`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/shell_pressure_sides.inp) | `*DSLOAD P` on a shell's `SPOS` / `SNEG` side and an element-based `P` |
226
+ | [`kinematic_all_dofs`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/kinematic_all_dofs.inp) | a bare `*Coupling` + `*Kinematic` (all DOFs) on a solid face, against `*RIGID BODY` |
227
+ | [`assembly_rotated_instances`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_rotated_instances.inp), [`…_flat`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_rotated_instances_flat.inp) | a turned instance with an oriented orthotropic material, against the same model written flat |
228
+ | [`damage_johnson_cook_cubes`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/damage_johnson_cook_cubes.inp) | a Johnson-Cook `*DAMAGE INITIATION` → ccx's form, reporting `DUCT` |
229
+ | [`rigid_punch_block`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_punch_block.inp), [`rigid_punch_cylinder`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_punch_cylinder.inp), [`rigid_body_inertia`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_body_inertia.inp) | a rigid `R3D4` punch and the same face as an analytical `CYLINDER` → skins of their rigid body; `MASS` + `ROTARYI` on a rigid plate → point masses |
230
+ | [`coverage_kitchen_sink`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coverage_kitchen_sink.inp) | element substitutions, dropped and commented cards, output-variable mapping |
231
+
232
+ ## Tests
233
+
234
+ ```bash
235
+ python tests/test_convert.py # unit tests, no solver needed
236
+ python validate_with_ccx.py # end-to-end checks in CalculiX
237
+ python corpus/fetch.py && python tests/test_corpus.py # the corpus
238
+ ```
239
+
240
+ [Testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) describes the three layers; GitHub Actions run the first two on
241
+ every push, the unit tests on Linux, macOS and Windows.
242
+
243
+ ## Documentation
244
+
245
+ * [User guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md) — options, workflow, reading the report, the Python API.
246
+ * [Troubleshooting](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/troubleshooting.md) — ccx errors and results that look wrong.
247
+ * [Compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md) — the Abaqus/CalculiX facts the converter relies
248
+ on, ccx 2.23 issues, and what does not convert.
249
+ * [Testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) · [Architecture](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/architecture.md) ·
250
+ [Changelog](https://github.com/sandervdbroek/abq2ccx/blob/main/CHANGELOG.md)
251
+ * Generated references: [keywords](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/keyword-reference.md) ·
252
+ [elements](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/element-reference.md) · [output variables](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/output-reference.md)
253
+
254
+ ## Sources
255
+
256
+ * CalculiX CrunchiX User's Manual v2.23 — <https://www.dhondt.de/ccx_2.23.pdf>, v2.22 —
257
+ <https://www.dhondt.de/ccx_2.22.pdf>, v2.7 (HTML) —
258
+ <https://web.mit.edu/calculix_v2.7/CalculiX/ccx_2.7/doc/ccx/ccx.html>
259
+ * `calculix/new_keywords` (Abaqus↔CalculiX keyword delta) — <https://github.com/calculix/new_keywords>
260
+ * `calculix/cae` (CalculiX keyword model) — <https://github.com/calculix/cae>
261
+ * "A Guide to Modifying Abaqus Input Files for Use in CalculiX" —
262
+ <https://calculix.discourse.group/t/a-guide-to-modifying-abaqus-input-files-for-use-in-calculix/1430>
263
+ * CalculiX Discourse — <https://calculix.discourse.group/> · PrePoMax forum —
264
+ <https://prepomax.discourse.group/>
265
+
266
+ [Compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md#sources) lists the Abaqus manual pages behind
267
+ individual facts.
268
+
269
+ ## License
270
+
271
+ [MIT](https://github.com/sandervdbroek/abq2ccx/blob/main/LICENSE) © Sander van den Broek. `abq2ccx` is an independent tool, not affiliated
272
+ with or endorsed by Dassault Systèmes (Abaqus) or the CalculiX project. The test corpus is
273
+ fetched on demand and **not** redistributed here; each deck keeps its own upstream license,
274
+ recorded in [`corpus/manifest.py`](https://github.com/sandervdbroek/abq2ccx/blob/main/corpus/manifest.py).
@@ -0,0 +1,257 @@
1
+ # abq2ccx — Abaqus → CalculiX input converter
2
+
3
+ `abq2ccx.py` converts an Abaqus `.inp` deck into a [CalculiX](http://www.calculix.de/)
4
+ (`ccx`) deck. It is one Python 3 file with no dependencies.
5
+
6
+ CalculiX copies most of Abaqus' keyword syntax, so much of a deck passes through as it is;
7
+ the work is in the parts that differ. The converter knows the complete CalculiX 2.22 + 2.23
8
+ keyword set and does one of three things with every Abaqus card: passes it through,
9
+ translates it into the CalculiX construct that does the same, or comments it out with a
10
+ warning that says what to do. Nothing is dropped silently, and nothing that changes the
11
+ physics happens unless you ask for it with `--approximate`.
12
+
13
+ ## Quick start
14
+
15
+ Run the file with Python 3.9 or later — copy it anywhere — or install it as the `abq2ccx`
16
+ command (`abq2ccx model.inp`, same options):
17
+
18
+ ```bash
19
+ pipx install abq2ccx # from PyPI
20
+ pipx install git+https://github.com/sandervdbroek/abq2ccx # the latest main
21
+ ```
22
+
23
+ ```bash
24
+ python3 abq2ccx.py model.inp # -> model_ccx.inp (+ model_ccx.log)
25
+ python3 abq2ccx.py decks/*.inp --outdir out # batch-convert into a directory
26
+ python3 abq2ccx.py model.inp --run # convert, run CalculiX, digest its results
27
+ python3 abq2ccx.py model.inp --check # report only, write nothing
28
+ ccx model_ccx # run it yourself (no .inp extension)
29
+ ```
30
+
31
+ Always read the report: it is printed to stderr, written to `*_ccx.log` and repeated as
32
+ `**` comments at the top of the converted deck. The [user guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md) has
33
+ every option, the exit codes and the Python API.
34
+
35
+ ```python
36
+ import abq2ccx
37
+ result = abq2ccx.convert_file("model.inp") # or convert_text(deck_string)
38
+ print(result.report.summary()) # "N warning(s), M note(s), K commented card(s)"
39
+ ```
40
+
41
+ ## What it converts
42
+
43
+ * **Mesh generation** (`*NGEN`, `*NFILL`, `*NCOPY`, `*ELGEN`, `*ELCOPY`) → explicit nodes
44
+ and elements.
45
+ * **Parts, instances and assemblies** → one flat model, with instance transforms applied
46
+ and part-level sections, constraints and orientations copied per instance.
47
+ * **Elements** → CalculiX types, keeping the node count. Incompatible-mode `CPS4I`/`CPE4I`
48
+ become exact one-element-thick `C3D8I` slabs (ccx has no such plane element); beams under
49
+ circular, pipe and box sections get the midside nodes ccx 2.23 needs; planar beams and
50
+ trusses are held in their plane; surface elements leave the mesh and their loads become
51
+ nodal forces; connector elements become their kinematic constraints. A substitution that
52
+ changes the element formulation (hybrid, modified or thin-shell elements run as ccx's
53
+ plain ones) is flagged as reduced physics.
54
+ * **Materials and orientations** — elastic types, plasticity (including Johnson-Cook), the
55
+ Johnson-Cook damage initiation criterion ccx shares with Abaqus, thermal expansion,
56
+ composite layups and per-element `*DISTRIBUTION` orientations (variable-angle-tow layups);
57
+ composite `S4R`/`S4`/`S3` shells run as `S8R`/`S6`, composite continuum shells (`SC8R`,
58
+ `SC6R`) as one solid per ply.
59
+ * **Constraints** — `*MPC`, kinematic couplings and rigid bodies (with *knot beams* where
60
+ ccx 2.23 rejects rigid constraints on shell and beam nodes), and the overconstraints ccx
61
+ rejects but Abaqus resolves.
62
+ * **Rigid tools** — rigid elements (`R3D3`, `R3D4`, `R2D2`, `RAX2`, …) become force-free
63
+ solid skins carried by their rigid body, so contact against them works; analytical rigid
64
+ surfaces are meshed the same way, curved ones only with `--approximate`; a `*TIE` to a
65
+ rigid surface makes its nodes part of the body, and `ROTARYI` becomes point masses.
66
+ * **Loads and BCs** — surface tractions and beam line loads become consistent nodal forces;
67
+ velocity and acceleration BCs become integrated displacement BCs; `*TRANSFORM` local axes
68
+ are respected wherever ccx reads them.
69
+ * **Steps and output** — explicit dynamics with Abaqus/Explicit's defaults, output requests
70
+ fitted to ccx's `.frd`/`.dat` model, and Abaqus' preselected output.
71
+
72
+ The exact handling of every keyword, element type and output variable is in the generated
73
+ references: [keywords](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/keyword-reference.md), [elements](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/element-reference.md),
74
+ [output variables](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/output-reference.md).
75
+
76
+ **Reduced physics.** Whatever the converter has to drop or replace of the Abaqus model — a
77
+ constitutive behaviour ccx lacks (concrete damaged plasticity, user hardening, Chaboche
78
+ back-stresses, field-dependent properties), an element formulation, a section control, a
79
+ constraint or interaction, a load — is named in a "Reduced physics" warning at the end of
80
+ the report (`Converter.reduced_physics` in the API): ccx then runs, but not the deck's own
81
+ problem.
82
+
83
+ **`--approximate`** (off by default) lets the converter reframe what ccx cannot run exactly
84
+ as a close equivalent, each flagged `[APPROX]` — a Riks step as plain static, ν ≥ 0.5 as
85
+ 0.475, an I-section in space as ccx's `U1` beam with too stiff a torsion (or an equivalent
86
+ rectangle where `U1` cannot run), NLGEOM follower tractions as fixed nodal
87
+ forces, a curved analytical rigid surface as flat facets, and a few more
88
+ ([full list](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md#--approximate)). Without it those cards are commented out
89
+ with the reason, so ccx never silently runs a different model.
90
+
91
+ ## Validation
92
+
93
+ `python validate_with_ccx.py` converts the bundled examples, runs them in CalculiX (it finds
94
+ `ccx`, including FreeCAD's copy) and compares each result with an independent reference. It
95
+ prints one `PASS` line per check, about a hundred in all; [testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) lists them.
96
+
97
+ | Check | Reference | Agreement |
98
+ | --- | --- | --- |
99
+ | NAFEMS LE10 thick plate (`*NCOPY`, `*ELGEN`, pressure face) | published σyy at D = −5.38 MPa | −5.650 MPa, 5 % (element and mesh) |
100
+ | the same plate loaded through `SFM3D8` surface elements | its face-pressure result | 7 digits |
101
+ | circular, pipe, box and planar beams; I, hexagonal and general sections as ccx's `U1` beam (cantilevers, a portal frame), general sections with a ccx profile (NAFEMS NL6); beam line loads; pinned, tied and hinged spans | beam theory, Euler buckling, the direct-stiffness frame, Abaqus' and NAFEMS' published answers | ≤ 2.4 % |
102
+ | Cook's membrane under a shear traction; a thick cylinder under a radial traction | published 23.96; Lamé | 0.12 %; 0.02 % |
103
+ | rigid couplings, `*MPC`s, connectors, BCs on coupled nodes, loads, connectors, `*MPC`s and rotations on `*TRANSFORM`ed nodes | the same model built another way (solids, hand-written equations, no transform) | ≤ 4e-5 of \|u\|, mostly exact |
104
+ | per-element `*DISTRIBUTION` orientations (a solid plate, a composite shell) | one `*ORIENTATION` per element | ≤ 3e-11 |
105
+ | a simply supported [0/90/0] plate as composite `S4R` (run as `S8R`) and `SC8R` (one `C3D8I` per ply); a [30/-60/45]s laminate's in-plane stiffness in the x-y and x-z planes (`S4R`, `SC8R`, `SC6R`) | classical lamination theory (Navier, A); Pagano's 3-D elasticity solution | 0.15 % (`S8R`, a/h = 100); 1.0 % / 2.3 % (plies, a/h = 100 / 10); A ≤ 2e-5 |
106
+ | thermal expansion (orthotropic, anisotropic, no initial temperatures) | α ΔT; analytic stress | ≤ 5e-6 |
107
+ | velocity / acceleration BCs; displacement BCs without an amplitude | their time integral; wave theory; Abaqus' default amplitudes | 5e-5 of the travel; wave stress ≈ 1 % on average; exact |
108
+ | preselected and default output, contact output | statics, wave theory | ≤ 0.005 % (static) |
109
+ | `CPS4I` / `CPE4I` cantilevers under an end couple (as `C3D8I` slabs) | beam theory (deflection, σ_xx = −My/I, σ_zz) | 4e-8 |
110
+ | pressure on a shell's `SPOS` / `SNEG` side and element-based `P` | Navier plate solution, each sign | 1.0 % |
111
+ | a bare `*KINEMATIC` (all DOFs); an assembly with a turned instance | `*RIGID BODY`; the same model written flat | exact |
112
+ | a rigid flat punch of `R3D4`, `R2D2` or `RAX2` elements or the same face as an analytical surface, also turned under NLGEOM and in explicit dynamics; a block tied to a turning rigid plate; pressure on rigid elements; `MASS` + `ROTARYI` on a rigid plate | ccx's penalty contact law; the punch given its motion node by node; p / k; spring frequencies | ≤ 8e-7 of \|u\|, mostly round-off |
113
+ | a faceted analytical sphere on a block (`--approximate`) | Hertz | 2.3 % (finite block, penalty contact) |
114
+
115
+ A **corpus of 1052 genuine Abaqus decks** — 1022 from about 180 public repositories (CAE
116
+ exports, UMAT and UEL decks, explicit and coupled models, …) and 30 NAFEMS benchmark decks of
117
+ the Abaqus 2017 documentation — is fetched on demand and run through convert → integrity check
118
+ → ccx. On ccx 2.23 all 1052 convert with no dangling reference; **189 solve the deck's own
119
+ physics**; 45 more solve but stay out of that count — 14 load nothing in the source deck, 33
120
+ (3 of them also unloaded) solve a model with reduced physics, and one converges to a solution
121
+ that is not the deck's (a part that only contact holds drifts away in ccx) — and 221 mesh-only
122
+ decks are accepted. The other 597 need what ccx cannot run — mostly user materials (353) and
123
+ user elements (66). **26 benchmark decks are checked against their published answer**: 19
124
+ match Abaqus' result for the same mesh (within 0.5 % for temperatures and frequencies, 1 % for
125
+ stresses and displacements), 7 differ for reasons traced to ccx (its nodal extrapolation,
126
+ plane-stress slab, film integration, mass matrices, coarse shell and beam meshes). See
127
+ [testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md#published-answers).
128
+
129
+ ## How it works
130
+
131
+ ```
132
+ read (+ *INCLUDE, *PARAMETER) → flatten *PART/*INSTANCE/*ASSEMBLY
133
+ → build the geometry (expand mesh generation) → plan deck-wide fixes
134
+ → translate card by card → settle *EQUATION dependents, audit loads → write
135
+ ```
136
+
137
+ | Bucket | Action | Examples |
138
+ | --- | --- | --- |
139
+ | Supported | emitted as it is | `*PLASTIC`, `*CONTACT PAIR`, `*DENSITY` |
140
+ | Translated | a handler adjusts the keyword, parameters or data | `*ELASTIC`, `*SHELL SECTION`, `*STEP`, `*DSLOAD`, output cards |
141
+ | Equivalent | mapped to the CalculiX construct that does the same | `*MPC BEAM` → `*RIGID BODY`, connectors → `*EQUATION`s, tractions → `*CLOAD` |
142
+ | Dropped | organisational, no CalculiX meaning | `*PART`/`*INSTANCE`/`*ASSEMBLY` (flattened), `*PREPRINT` |
143
+ | Commented | no equivalent: kept as `**` comments with a warning | `*VISCOELASTIC`, `*CONNECTOR BEHAVIOR`, `*INERTIA RELIEF` |
144
+
145
+ The [architecture guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/architecture.md) describes the pipeline and how to extend it.
146
+
147
+ ## Limitations
148
+
149
+ * User subroutines (UMAT/VUMAT, UEL, DLOAD, DISP, …) do not run in stock ccx. Such cards are
150
+ commented out, naming the ccx subroutine to port; a UMAT runs in a ccx built with it
151
+ (`--abaqus-umat`), a VUMAT has no ccx interface.
152
+ * Cohesive and gasket elements run as thin continua (their traction-separation law is lost;
153
+ warned). Abaqus general contact (`*CONTACT`), connector behaviours, inertia relief and
154
+ materials such as viscoelasticity and concrete damaged plasticity have no equivalent and
155
+ are flagged for remodelling; a deck that runs without them is flagged as reduced physics.
156
+ * ccx's own first-order elements are not Abaqus': its `CPE4`/`C3D8`/`CAX4` are plain 2×2(×2)
157
+ integration, without Abaqus' selectively reduced volume terms (on a coarse bending mesh
158
+ Abaqus' `CPE4` deflects 9–19 % more for ν 0–0.3), and its `CPS4` is a 3-D slab with a free
159
+ thickness, not 2-D plane stress ([compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md)).
160
+ * Explicit coupled temperature–displacement steps do not run; Riks steps, NLGEOM follower
161
+ tractions and curved analytical rigid surfaces run only with `--approximate`.
162
+ * Contact is translated card by card, but ccx's penalty contact behaves differently from
163
+ Abaqus' — check it.
164
+ * ccx 2.23 gets some valid input wrong without an error. The converter works around what it
165
+ can and warns about the rest ([compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md),
166
+ [troubleshooting](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/troubleshooting.md)).
167
+ * The converter checks structure, and physics on its benchmarks — not on your model. Run ccx
168
+ and sanity-check the results.
169
+
170
+ Validated on CalculiX 2.23 (the FreeCAD 1.1.4 build); written for 2.22–2.23.
171
+
172
+ ## Examples
173
+
174
+ | File | Exercises |
175
+ | --- | --- |
176
+ | [`nle10_thickplate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/nle10_thickplate.inp) | NAFEMS LE10: C3D20, `*NCOPY` + `*ELGEN`, `GEN`/`PERT`, `*DLOAD Px` |
177
+ | [`nle10_surface_elements`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/nle10_surface_elements.inp) | the same plate loaded through an `SFM3D8` skin → nodal forces |
178
+ | [`composite_shell`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_shell.inp) | S8R composite layup, orthotropic, `*ORIENTATION`, `ENCASTRE`, `*DSLOAD` |
179
+ | [`composite_plate_s4r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_plate_s4r.inp), [`composite_plate_sc8r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_plate_sc8r.inp) | a simply supported cross-ply plate: composite `S4R` → `S8R`; composite `SC8R` → one `C3D8I` per ply |
180
+ | [`composite_inplane_s4r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_inplane_s4r.inp), [`composite_inplane_sc8r`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/composite_inplane_sc8r.inp) | an angle-ply laminate's in-plane stiffness; BCs interpolated onto the new nodes |
181
+ | [`assembly_two_blocks`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_two_blocks.inp) | two-instance assembly, an `instance.node` reference in a step |
182
+ | [`beam_circ_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_cantilever.inp) | `B31` + `SECTION=CIRC` → `B32` with midside nodes, radius → diameters |
183
+ | [`beam_pipe_box_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_pipe_box_cantilever.inp) | `PIPE31` + `SECTION=PIPE` and `B32` + `SECTION=BOX` → `B32R` |
184
+ | [`beam_circ_rotation_bcs`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_rotation_bcs.inp) | circular-section beams with a held twist and a prescribed rotation → knot beams |
185
+ | [`beam_circ_explicit`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_circ_explicit.inp) | a circular-section beam in `*DYNAMIC, EXPLICIT` → a maximum time increment |
186
+ | [`planar_pinned_beam`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/planar_pinned_beam.inp), [`planar_pinned_circ_beam`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/planar_pinned_circ_beam.inp) | planar `B21` beams in `*FREQUENCY` + `*BUCKLE` → planar constraint |
187
+ | [`beam_line_load_cantilever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_line_load_cantilever.inp) | `*DLOAD PY` / `P2` / `PZ` on `B31`, `B32` and a `CIRC` beam → nodal forces |
188
+ | [`beam_output_requests`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/beam_output_requests.inp) | output at `B32` nodes → `OUTPUT=2D`, `*NODE PRINT`, `*TIME POINTS` |
189
+ | [`coupling_shell_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_shell_plate.inp), [`coupling_solid_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_solid_plate.inp) | a rigid coupling on `S8R` nodes (knot beams) and its `C3D20R` reference |
190
+ | [`coupling_bc_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coupling_bc_bars.inp) | BCs on coupled nodes that the reference point imposes → taken off |
191
+ | [`rigid_body_bc_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_body_bc_bars.inp) | BCs on `*RIGID BODY` nodes → moved to the reference node, as Abaqus does |
192
+ | [`equation_overconstraint`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/equation_overconstraint.inp) | an `*EQUATION` on a BC'd DOF, a duplicate and a loop of ties |
193
+ | [`mpc_beam_lever`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_beam_lever.inp), [`mpc_pin_tie_joints`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_pin_tie_joints.inp), [`mpc_link`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_link.inp) | `*MPC BEAM`, `PIN`, `TIE`, `LINK` |
194
+ | [`connector_hinge_beams`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_hinge_beams.inp), [`connector_hinge_bodies`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_hinge_bodies.inp), [`connector_ground_hinge`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_ground_hinge.inp) | `CONN3D2` `HINGE` connectors between beams, rigid bodies and to ground |
195
+ | [`connector_transform_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_transform_plate.inp), [`connector_transform_join`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/connector_transform_join.inp) | `JOIN` / `LINK` connectors on nodes with a `*TRANSFORM` |
196
+ | [`mpc_transform`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/mpc_transform.inp) | `*MPC` `PIN`, `TIE` and `LINK` on nodes with a `*TRANSFORM` → local DOFs, twin nodes |
197
+ | [`op_new_respecify`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/op_new_respecify.inp), [`op_new_remove`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/op_new_remove.inp) | `*BOUNDARY, OP=NEW` after rotational BCs on beams and shells |
198
+ | [`distribution_solid_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/distribution_solid_plate.inp), [`distribution_shell_plate`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/distribution_shell_plate.inp) | per-element `*DISTRIBUTION` orientations (solid, composite S8R); `*_explicit` are their one-orientation-per-element twins |
199
+ | [`thermal_expansion_cubes`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/thermal_expansion_cubes.inp) | isotropic `*Elastic` beside ORTHO / ANISO `*Expansion` |
200
+ | [`thermal_no_initial_temperature`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/thermal_no_initial_temperature.inp) | `*Temperature` without initial temperatures |
201
+ | [`cook_membrane_traction`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cook_membrane_traction.inp), [`cylinder_traction_cax`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cylinder_traction_cax.inp) | `*DSLOAD TRVEC` on `CPS8` and `CAX8` edges → nodal forces |
202
+ | [`traction_transformed_face`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/traction_transformed_face.inp), [`transform_spherical_rigid`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/transform_spherical_rigid.inp) | loads on `*TRANSFORM`ed nodes; a spherical transform; a transformed rigid-body reference point |
203
+ | [`transform_rotations`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/transform_rotations.inp) | rotational BCs and moments on a transformed kinematic reference point (→ `*RIGID BODY` with a `ROT NODE` in its axes) and beam tip (→ knot, global components) |
204
+ | [`velocity_bc_column`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/velocity_bc_column.inp), [`velocity_bc_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/velocity_bc_bar.inp) | `*BOUNDARY, TYPE=VELOCITY` (implicit and explicit) |
205
+ | [`default_amplitude_bars`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/default_amplitude_bars.inp) | a displacement `*BOUNDARY` and a `*CLOAD` without an amplitude → ramped / stepped as in Abaqus (run as `*DYNAMIC`, `*VISCO`, coupled and explicit) |
206
+ | [`preselect_output_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/preselect_output_bar.inp), [`explicit_default_output_bar`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/explicit_default_output_bar.inp), [`preselect_contact_blocks`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/preselect_contact_blocks.inp) | Abaqus' preselected and default output |
207
+ | [`cps4i_slab_bending`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/cps4i_slab_bending.inp) | a `CPS4I` cantilever under an end couple → `C3D8I` slabs (also run as `CPE4I`) |
208
+ | [`shell_pressure_sides`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/shell_pressure_sides.inp) | `*DSLOAD P` on a shell's `SPOS` / `SNEG` side and an element-based `P` |
209
+ | [`kinematic_all_dofs`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/kinematic_all_dofs.inp) | a bare `*Coupling` + `*Kinematic` (all DOFs) on a solid face, against `*RIGID BODY` |
210
+ | [`assembly_rotated_instances`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_rotated_instances.inp), [`…_flat`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/assembly_rotated_instances_flat.inp) | a turned instance with an oriented orthotropic material, against the same model written flat |
211
+ | [`damage_johnson_cook_cubes`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/damage_johnson_cook_cubes.inp) | a Johnson-Cook `*DAMAGE INITIATION` → ccx's form, reporting `DUCT` |
212
+ | [`rigid_punch_block`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_punch_block.inp), [`rigid_punch_cylinder`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_punch_cylinder.inp), [`rigid_body_inertia`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/rigid_body_inertia.inp) | a rigid `R3D4` punch and the same face as an analytical `CYLINDER` → skins of their rigid body; `MASS` + `ROTARYI` on a rigid plate → point masses |
213
+ | [`coverage_kitchen_sink`](https://github.com/sandervdbroek/abq2ccx/blob/main/examples/coverage_kitchen_sink.inp) | element substitutions, dropped and commented cards, output-variable mapping |
214
+
215
+ ## Tests
216
+
217
+ ```bash
218
+ python tests/test_convert.py # unit tests, no solver needed
219
+ python validate_with_ccx.py # end-to-end checks in CalculiX
220
+ python corpus/fetch.py && python tests/test_corpus.py # the corpus
221
+ ```
222
+
223
+ [Testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) describes the three layers; GitHub Actions run the first two on
224
+ every push, the unit tests on Linux, macOS and Windows.
225
+
226
+ ## Documentation
227
+
228
+ * [User guide](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/user-guide.md) — options, workflow, reading the report, the Python API.
229
+ * [Troubleshooting](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/troubleshooting.md) — ccx errors and results that look wrong.
230
+ * [Compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md) — the Abaqus/CalculiX facts the converter relies
231
+ on, ccx 2.23 issues, and what does not convert.
232
+ * [Testing](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/testing.md) · [Architecture](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/architecture.md) ·
233
+ [Changelog](https://github.com/sandervdbroek/abq2ccx/blob/main/CHANGELOG.md)
234
+ * Generated references: [keywords](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/keyword-reference.md) ·
235
+ [elements](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/element-reference.md) · [output variables](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/output-reference.md)
236
+
237
+ ## Sources
238
+
239
+ * CalculiX CrunchiX User's Manual v2.23 — <https://www.dhondt.de/ccx_2.23.pdf>, v2.22 —
240
+ <https://www.dhondt.de/ccx_2.22.pdf>, v2.7 (HTML) —
241
+ <https://web.mit.edu/calculix_v2.7/CalculiX/ccx_2.7/doc/ccx/ccx.html>
242
+ * `calculix/new_keywords` (Abaqus↔CalculiX keyword delta) — <https://github.com/calculix/new_keywords>
243
+ * `calculix/cae` (CalculiX keyword model) — <https://github.com/calculix/cae>
244
+ * "A Guide to Modifying Abaqus Input Files for Use in CalculiX" —
245
+ <https://calculix.discourse.group/t/a-guide-to-modifying-abaqus-input-files-for-use-in-calculix/1430>
246
+ * CalculiX Discourse — <https://calculix.discourse.group/> · PrePoMax forum —
247
+ <https://prepomax.discourse.group/>
248
+
249
+ [Compatibility](https://github.com/sandervdbroek/abq2ccx/blob/main/docs/compatibility.md#sources) lists the Abaqus manual pages behind
250
+ individual facts.
251
+
252
+ ## License
253
+
254
+ [MIT](https://github.com/sandervdbroek/abq2ccx/blob/main/LICENSE) © Sander van den Broek. `abq2ccx` is an independent tool, not affiliated
255
+ with or endorsed by Dassault Systèmes (Abaqus) or the CalculiX project. The test corpus is
256
+ fetched on demand and **not** redistributed here; each deck keeps its own upstream license,
257
+ recorded in [`corpus/manifest.py`](https://github.com/sandervdbroek/abq2ccx/blob/main/corpus/manifest.py).