The interface reference
The complete list of what the black box accepts and what it publishes is generated, not transcribed:
cdadt inspect cases/b738.yaml
cdadt inspect cases/b738.yaml --what inputs
cdadt inspect cases/b738.yaml --what outputs --filter fuel_burn
That is deliberate. A hand-written interface table in documentation is correct on the day it is
written and slowly stops being correct afterwards, and there is no way to tell by reading it.
inspect builds the case’s box on a three-node grid – a fraction of a second, nothing is
converged – and reads the interface off the live model.
What counts as an input
A variable is settable if it is an independent variable of the box: an output of one of its
IndepVarComps, or an input no component drives. Those are exactly the variables a case
file may set and a driver may move as a design variable.
For the shipped case that is 241 variables, of which 34 are ac| design parameters and 8 are
mission-level parameters; the rest are per-phase settings, most importantly the
equivalent-airspeed and vertical-speed schedules and the ISA temperature increment of each
phase.
$ cdadt inspect cases/b738.yaml --what inputs --filter "ac|geom|wing"
Inputs the box accepts (5 of 241 shown)
------------------------------------------------------------------------
ac|geom|wing|AR - (1,)
ac|geom|wing|S_ref m**2 (1,)
ac|geom|wing|c4sweep deg (1,)
ac|geom|wing|taper - (1,)
ac|geom|wing|toverc - (1,)
Note what is not in that list: ac|geom|wing|MAC. The mean aerodynamic chord is computed by
the box from the planform, so it is an output. The same is true of ac|geom|hstab|S_ref,
ac|geom|vstab|S_ref, ac|geom|fuselage|S_wet, ac|aero|CLmax_cruise,
ac|aero|CLmax_TO, ac|weights|OEW, ac|weights|MLW and ac|weights|MTOW. Attempting
to set one is an error naming it, with suggestions.
What counts as an output
Everything the box produces – 745 outputs for the shipped case at three nodes, since most of them are per-phase and per-node. Promoted inputs are omitted from the listing: a promoted input name can address several components at once and so is not unambiguously readable. Every quantity a discipline reports is an output.
The named responses
cdadt gives short names to the outputs its disciplines report, so a case file can write
objective: {name: total_fuel} rather than
mission.loiter.fuel_burn_integ.fuel_burn_final. Those names are also what
The certification basis constraints are evaluated on. They come from the discipline classes
themselves, so the list below is generated from the same source the code uses:
Discipline |
Response |
Path in the box |
Units |
Optional |
|---|---|---|---|---|
geometry |
|
|
m |
|
geometry |
|
|
m**2 |
|
geometry |
|
|
m**2 |
|
geometry |
|
|
m |
yes |
geometry |
|
|
m |
yes |
aerodynamics |
|
|
- |
|
aerodynamics |
|
|
- |
|
propulsion |
|
|
kg |
yes |
propulsion |
|
|
kg |
yes |
propulsion |
|
|
kg |
yes |
propulsion |
|
|
kg |
yes |
stability |
|
|
m**2 |
|
stability |
|
|
m**2 |
|
structures |
|
|
kg |
yes |
structures |
|
|
kg |
yes |
structures |
|
|
kg |
yes |
weights |
|
|
kg |
|
weights |
|
|
kg |
|
weights |
|
|
kg |
|
performance |
|
|
kg |
|
performance |
|
|
kg |
|
performance |
|
|
ft |
|
performance |
|
|
ft |
|
performance |
|
|
kn |
|
performance |
|
|
kn |
|
performance |
|
|
rad |
|
performance |
|
|
nmi |
|
performance |
|
|
- |
The table is abridged – the equipment weight breakdown, the remaining throttle histories and the phase durations are omitted for length. The authoritative list is:
from cdadt import ResponseCatalog
catalog = ResponseCatalog()
for name in sorted(catalog):
response = catalog.response(name)
print(f"{catalog.owner(name):14s} {name:26s} {response.path:52s} {response.units}")
Optional responses
A response marked optional exists only in a particular black-box model. The structural and equipment weight breakdowns are optional because they exist as long as the box’s weight model publishes them – which OpenConcept’s jet-transport buildup does, and a different sizing model need not.
A missing optional response is reported as unavailable in the run report and in the archived JSON, rather than being dropped. A missing required response is an error: it means the box is not the model the discipline was written against, and returning a partial result quietly would let a report claim a quantity it never read.
Every shipped case is missing exactly one, and which one tells you which group it drives.
wing_span exists only under cdadt’s own analysis group, which composes OpenConcept’s
WingSpan – its B738 sizing group never does, because nothing in it needs a span. Conversely
tail_lever_arm is OpenConcept’s own subsystem name and is absent from cdadt’s group. So a run
report’s “Not published by this black box” section is a fingerprint of the model, and the tests
assert the exact set rather than that nothing is missing. Asserting nothing is missing was true
only by accident, and stopped being true the moment cdadt published a response OpenConcept’s
group does not compute.
wing_span earns its place: with the wing area free, an aspect-ratio bound can no longer stand
in for a span limit, so a study that must fit a gate constrains the span directly. See
Optimization.