Skip to content
Draft. This manual is new and still being checked against the software as it is verified. Some pages will change. If something here does not match what you see, the software is right — tell us and we will fix the page.

Command line

Every flag the application parses, verified against the source. Anything not on this page is not a flag.

The application is a windowed program and stays one on the command line. Several flags do their work and then exit; none of them run headless, because the report figures and the saved images are frames of the real viewport.

shd-simcfd-app.exe [flags] [geometry file]

Four things decide what a command line actually does.

  1. Arguments are processed in the order given. --analysis=Cavitation --bc=inlet:Velocity+inlet is not the same as the reverse.
  2. --dump-case exits as soon as it is reached. Put it last, or the flags after it never run.
  3. A value cannot contain a space — the shell splits the argument first. A + stands in for a space in --bc, --mesh-op and --doc values.
  4. Unrecognised flags are ignored, silently. There is no usage message.

--report, --save-image, --comparison-report and --measure are deferred until after every other argument has been applied, so a report of a case whose analysis or results were set by a later flag still sees them.

The first argument that is not a flag and is a readable file is imported as geometry. It is tested for being a real file rather than merely not starting with a dash, so a two-word Qt option — -platform offscreen, -style … — cannot consume the slot with its own value.

This is what makes the application a shell “Open with” target.


Flag Effect
--workspace=<dir> Put the case library somewhere other than the remembered one, for this run only. Read before any QML runs
--create Open the New simulation wizard at the top level
--create=<a.b.c> Open it with that branch chosen. Dot-separated catalogue ids
--catalogue=<leaf id> Create a case the way the wizard does, without opening it
--example Create and open the worked example, exactly as the library’s button does
--example=<id> Open a named worked example
--simulation=<n> Select a study within the open case
--duplicate-simulation=<name> Copy the open study under a new name
--sweep=<key>:<v1,v2,…> One simulation per value, cloned from the open one
--export-case=<file.zip> Write the open case out as one file, then exit
--import-case=<dir|zip> Read a case in, then exit
--dump-case=<dir> Write the generated case to a directory, then exit. Does not mesh or run

Anything that creates cases should pass --workspace as well, or it writes them into the real library.

Worked example ids:

--example= Case
submerged-body Submerged body drag study — the default when no id is given
duct Duct flow
lid Lid-driven cavity, the Ghia validation case
cavity Buoyant cavity

An unrecognised id falls back to submerged-body. An example that already exists in the workspace is opened rather than recreated.

--sweep accepts only values that parse as numbers; anything else in the list is dropped. A key beginning incidence has its values suffixed “ deg“ in the study names.


Flag Effect
--analysis=<type> Pick an analysis type and apply the same fan-out the Models pane applies
--solver=<name> Pin a solver by hand. The case adopts that solver’s physics family and its own constraints — laminar, steady-or-transient-only, fixed algorithm
--node=<name> Open a setup step, e.g. --node=Refinements. Goes to the workbench
--view=<mode> Open a viewport mode
--two-d[=x|y|z] Mesh two-dimensionally, thin along the given axis. z when not given
--split-parts Split the geometry into one patch per connected body, and save
--bc=<patch>:<kind> Set a boundary condition. The patch is created if the case does not have it
--mesh-op=<kind>[:k=v,…] Add a mesh operation with parameters
--import-mesh=<file>[:scale] Point the case at a mesh from another tool. The scale is to metres, so :0.001 reads a millimetre mesh
--add-concept=<category> Add an advanced concept
--add-concept=<category>:<kind> …with a specific kind, which decides which dictionaries it produces
--body-motion Add a 6-DoF rigid body to the open study
--region=<i>:<key>=<value> Set a field on conjugate region i, e.g. --region=1:zoneMaxX=0.02
--end=<n> Cut the run short to roughly n steps, steady or transient

Analysis type names are the ones on the Models pane, listed in Analysis types and solvers. Boundary condition kinds are in Boundary condition types — write a space as +, so --bc=inlet:Velocity+inlet.

Viewport modes: Surface, Mesh, Wireframe, Points, Clip, Slice.

Advanced concept categories: Rotating zones, Body motion, Porous media, Momentum sources, Heat sources, Stabilisation.

Mesh operation kinds: renumberMesh, transformPoints, mirrorMesh, refineMesh, extrudeMesh, createPatch, subsetMesh, mergeMeshes, stitchMesh, polyDualMesh, collapseEdges, combinePatchFaces.

--end is an upper bound on the work, not an exact step count. A steady case gets endIteration; a transient one gets n × deltaT as its end time, and with an adjusting time step the step grows as the run settles.

--import-mesh splits on the last colon, and only when it is past position two, so a Windows drive letter is not mistaken for a separator. The tail must parse as a positive number or it is treated as part of the path.

--mesh-op values that parse as numbers are passed as numbers; everything else is passed as a string with + replaced by a space.


Flag Effect
--add-result=<kind>[,<kind>…] Add result-control items by kind
--only-results Drop the seeded set first, so --add-result gives exactly what was asked for
--hinge-moments Add a force-and-moment control on every part except body
--results=<case dir> Post-process a case directory this application did not produce. Only the results are adopted, not the setup
--refresh-results Re-read every simulation’s coefficients from its run directory
--measure=<patch>:<field>[,<patch>:<field>…] Add boundary measurements and log the area, mean, integral and flux

Result-control kinds: forceCoeffs, forces, probes, cuttingPlane, patchData, volumeData, fieldMinMax, yPlus, wallShearStress, wallHeatFlux, binnedForces, flowRate, fieldAverage, runTimeControl.

--measure waits for the results to become readable — up to 20 seconds — before it resolves the patch names, because results load on a worker.


Flag Effect
--mesh Go to the workbench and start meshing
--run Go to the workbench and start the solver
--pipeline Mesh, then solve, then read the results, then print one summary line and exit
--pipeline=<seconds> The same with a budget other than the default 900 seconds

--pipeline prints a single PIPELINE … line to standard error carrying the case, analysis type, solver, family, mesh result, cell count, non-orthogonality, run result, outcome, error and warning counts, time and field counts, and the monitor count. The outcome is complete, mesh-failed, or timeout-<phase>.

It exits 0 whatever it found. The verdict is in the line, not in the exit code.


Flag Effect
--report=<file.pdf> Write the study report and exit
--comparison-report=<file.pdf> Write the case-level report — the sweep and every study side by side — and exit
--save-image=<file.png> Grab one frame of the viewport and exit
--doc=<field>=<value> Set a document-control field, e.g. --doc=projectNumber=P-2417

All three exit with 1 on failure. --doc replaces + with a space in the value and silently ignores a field name the report does not have.

These need a real window — the figures are frames of the viewport — so a scripted report run is a normal windowed run that quits when it is done.


Flag Effect
--sign-in Start the browser sign-in, as the Licence pane’s button does
--activate=<key> Enter a licence key
--licence-status Print tier, status, error code, error text, sign-in message and activated-machine count, then exit

--licence-status waits about six seconds before reporting, because the interesting answer is the server’s and it has not arrived at the moment the arguments are parsed.


Dump the dictionaries for one analysis type without meshing or running:

shd-simcfd-app.exe --workspace=D:/scratch --analysis=Cavitation --dump-case=D:/scratch/cav

Build a 2-D case from nothing and run it:

shd-simcfd-app.exe --workspace=D:/scratch --two-d=z ^
--bc=inlet:Velocity+inlet --bc=outlet:Pressure+outlet ^
--end=200 --pipeline

Sweep incidence on the open case and write the comparison report:

shd-simcfd-app.exe --example --sweep=incidenceAlpha:-4,0,4 ^
--comparison-report=D:/reports/sweep.pdf

shd-simcfd-translator is a separate executable and takes its own arguments. It is normally invoked by the application, not by hand.

shd-simcfd-translator --input a.step --output a.stl --units mm --heal
Flag
--input <file> Required
--output <file> Required
--units <unit> Only consulted for BREP. m, mm, cm, in, ft and their long spellings
--deflection <n> Tessellation tolerance
--angular <deg> Angular tessellation tolerance
--heal / --no-heal Sew faces and remove tiny edges, or do not
--self-test Round-trip known geometry through STEP and IGES and report

It exits 2 on a bad argument list, an unreadable file, or an extension it does not handle. Unrecognised arguments are an error here, unlike in the application.