Logging and progress#
TurboMoC reports through Python’s standard logging module, under one
turbo_moc logger hierarchy:
Logger |
Source |
|---|---|
|
|
|
Solver stages and progress |
|
Gmsh meshing helpers |
|
Example workflows |
Library modules never install handlers. Without configuration, Python’s default applies: warnings and errors reach stderr, routine progress stays silent.
Console and log file#
Wrap a run in logging_context to see its progress:
from turbo_moc import design_nozzle
from turbo_moc.reporting import logging_context
with logging_context("nozzle.log", level="INFO"): # file optional
result = design_nozzle(fluid_name="CO2", P0=8.85e6, T0=308.15, p_back=3.97e6)
It configures only the turbo_moc logger (never the root logger), writes each
record once to the console and to a fresh UTF-8 file, and restores the previous
handlers, level and propagation on exit, including after exceptions and Ctrl+C. An
exception leaving the block is logged there once, with its traceback, and
re-raised. The Gmsh and Fluent workflows use the same context from
turbo_moc.reporting, so MoC, meshing and workflow messages share one
console and one log file.
A short successful run looks like this:
MoC: conventional; Nitrogen; P0 500.0 kPa, T0 300.00 K; 9 seed points; target pressure 100.0 kPa
MoC: fluid properties initialized in 3.38 s (first-call setup and JIT compilation included)
MoC [1/4] Throat front (uniform post-sonic state)
MoC [1/4] Throat front (uniform post-sonic state) completed in 0.10 s
MoC [2/4] Initial-value line
MoC [2/4] Initial-value line completed in 0.25 s
MoC [3/4] Kernel region
MoC [3/4] Kernel region reached the target in 0.93 s
MoC [4/4] Reflex region
MoC [4/4] Reflex region completed in 0.07 s
MoC results
Status Converged
Exit pressure 100.0 kPa
Target pressure 100.0 kPa
Exit Mach 1.7088 (design 1.7088)
Total runtime 4.79 s
Levels#
INFO: inputs and target, fluid initialization, each stage’s start and completion with its elapsed time, progress of long stages at most once per second, and the result summary.
DEBUG: per-iteration diagnostics (kernel angle, adaptive step, axis state, mass flow), critical-state details, fluid-manager reuse. These are computed only when DEBUG is enabled.
WARNING: recoverable property failures, an exhausted angular range, use of the last valid front, automatic retries with their modified inlet quality, and non-converged results. Each says what happened and what the solver does next.
Finishing all stages is not the same as reaching the design target: the summary’s Status uses the solver’s own convergence check (exit Mach within 5 % of the design value), and a non-converged result is also reported as a warning.
Progress callbacks#
design_nozzle(..., progress_callback=f) calls f(fraction, stage_label) on every
update, independently of the log level and of the console’s once-per-second
throttling; turbo_moc.make_progress_reporter turns it into the app’s progress bar.
Labels start with the stage ("1 of 4" to "4 of 4", "4A of 4" for the
conventional reflex region). Fractions are finite, within [0, 1] and never decrease
within a stage:
counted loops report work done over total work;
the conventional kernel reports the fraction of the initial gap to its termination target closed (pressure, or Mach without a back pressure). This is an estimate of convergence, not of the remaining runtime;
the minimum-length kernel reports the swept fraction of its prescribed fan angle.
An automatic retry restarts at stage 1 with labels such as
"1 of 4 (retry 2 of 6)". The final update names the outcome:
"4 of 4 (finished)" or "4 of 4 (finished, not converged)".
Timing#
Elapsed times are measured once with time.perf_counter() at stage boundaries.
They include first-call setup and JAX compilation where these happen (notably fluid
initialization), which is not measured separately.