OutWit.Controller.CalculiX
1.1.2
dotnet add package OutWit.Controller.CalculiX --version 1.1.2
NuGet\Install-Package OutWit.Controller.CalculiX -Version 1.1.2
<PackageReference Include="OutWit.Controller.CalculiX" Version="1.1.2" />
<PackageVersion Include="OutWit.Controller.CalculiX" Version="1.1.2" />
<PackageReference Include="OutWit.Controller.CalculiX" />
paket add OutWit.Controller.CalculiX --version 1.1.2
#r "nuget: OutWit.Controller.CalculiX, 1.1.2"
#:package OutWit.Controller.CalculiX@1.1.2
#addin nuget:?package=OutWit.Controller.CalculiX&version=1.1.2
#tool nuget:?package=OutWit.Controller.CalculiX&version=1.1.2
OutWit.Controller.CalculiX
Runs complete CalculiX (ccx) decks on WitCloud
compute nodes. One solve = one whole deck on one node — no decomposition, no
model conversion; deck support is whatever the pinned ccx solves. The win is
throughput across many independent solves, which is exactly what the
companion OutWit.Controller.Sweep orchestrates into parameter studies.
Activity
| Activity | Side | Purpose |
|---|---|---|
Ccx.Solve(CcxTask) → CcxResult |
node | Download the variant deck, run the bundled ccx (<ccx> <jobname> in a scratch directory - a scope of the temp folder the host hands the controller, on a node the client's controllers' temp folder - OMP_NUM_THREADS from the task), upload .frd/.dat as blobs, extract the requested responses on the node, return artifact ids + exit code + measured solve time + the response row. A nonzero solver exit is data in the result, not a task failure. |
The task rides as one envelope (CcxTaskData): deck blob id, explicit
node/element counts (work estimation never opens the blob), thread policy and
the extraction request. Results return in completion order — consumers map by
VariantIndex, never positionally.
Bundled solver
The module carries pinned ccx 2.22 builds for win-x64, linux-x64 and
osx-arm64 as controller data assets, produced and mirrored by
OmnibusCloud/CalculiX. Nodes need
no preinstalled software - the macOS kit carries the GCC runtime
(libgfortran/libgomp/libquadmath/libgcc_s) beside ccx, referenced through
@loader_path; ccx-v2.22-1 had linked them by absolute Homebrew paths and
every variant on the first Apple Silicon node died with "dyld: Library not
loaded" (exit 134) - ccx-v2.22-3, controller 0.1.8. The Windows kit is built
on MSYS2 winpthreads 13.0.0.r488: the 14.x runtime turns every uncontended
mutex into a kernel wait, and libgfortran takes one per Fortran I/O statement,
so ccx-v2.22-3 ran the reference cube 1.8x slower than upstream's own Windows
build and Windows workers were rated below Linux ones by the same factor -
ccx-v2.22-4, controller 1.0.1, results byte-identical. CalculiX is GPL-2.0:
the asset kit ships the license text and the written source offer, and the
corresponding source is publicly mirrored in that repository's releases.
Node benchmark: Ccx.Solve is ranked by the reference deck (a 40³-node static
cube, 64 000 nodes, generated by CcxReferenceDeck so it is the same on every
machine) in unit ccx-static@ref40-v1. ref20-v2 (controller 1.0.3 and
earlier) used a 20³ cube that solves in under a second, where process start
and one core decide the time: a 2-vCPU virtual machine tied a 16-core desktop
and the fleet's strongest machines ranked last. The 40-cube takes 8-25 s and
lets the cores count (a Ryzen 9 5950X 8.4 s, a 6-core i7-8700K 10.9 s, a
2-vCPU VM 17.8 s), so a benchmark costs a node half a minute to a minute once
per controller install. Solves run with at most 16 OpenMP threads
(CcxProcessRunner.MAX_DEFAULT_THREADS): PARDISO saturates by then and SMT
siblings only cost time. The first solve is
an untimed warm-up - it is the first start of the freshly installed kit, and
its cold page cache and antivirus scan once rated a Ryzen 9 5950X at 1.36 s
against the 0.75 s it takes from then on; the rate is 1 / the median of three
to five timed solves (1.5 s target), so one stall does not move it and a busy
machine is still rated as busy. ref20-v1 (controller 1.0.1 and earlier)
timed one cold solve. The Custom bag carries the run times (runs_s,
median_s, warmup_s) and the solved maximum displacement (checksum).
ccx is started without a console window (CreateNoWindow). The worker client
is a windowed application with no console of its own, so before controller
1.0.3 every ccx.exe it launched got a fresh console, which cost about 0.45 s
per start on Windows 11: the reference cube took 1.13-1.23 s from the client
against 0.69-0.76 s with the flag, and every sweep variant on a Windows node
paid it.
Determinism note: ccx with OpenMP is not bitwise-reproducible across thread counts, and the three platform builds add last-digit variation — results are stable to engineering tolerance, and the controller's tests assert tolerance, not bits.
SPOOLES runs with one equation-solver thread (CCX_NPROC_EQUATION_SOLVER=1,
CcxEquationSolver). The kits link SPOOLES multithreaded, and multithreaded
SPOOLES returns a wrong field now and then with exit 0: a 14 k-node bracket
solved 60 times in concurrent pairs came back different in 2 runs (by up to
0.6 %), and a sweep variant on an arm64 Mac was 10 % off. PARDISO and
single-threaded SPOOLES gave the same answer every time. A solve goes through
SPOOLES when a step card says SOLVER=SPOOLES, and always on macOS, whose kit
has no PARDISO (ccx's default where it is linked); assembly and stress recovery
keep their OpenMP threads, and the single-threaded factorization cost about
15 % on that bracket. The benchmark's reference solve follows the same rule.
Dependencies
Variables (module dependency). The shared data types live in
OutWit.Controller.CalculiX.Model, consumed by this controller, by the Sweep
orchestration controller (a CalculiX study carries the extraction request;
its manifest rows carry the CcxResultData verbatim) and by client
applications. The sweep's own types live in OutWit.Controller.Sweep.Model.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- OutWit.Controller.CalculiX.Model (>= 2.0.0)
- OutWit.Engine.Assets.MSBuild (>= 1.0.1)
- OutWit.Engine.Data (>= 1.1.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.