Generated reference › Earth Nutation — Robotics/Celestial Phenomena
kind: generated#block#robotics-celestial-phenomena

Earth Nutation — Robotics/Celestial Phenomena

Robotics/Celestial_Phenomena/Earth_Nutation · 1 input / 2 output port(s) at insert · exports to Python, MATLAB, Java, Rust, C, C++

Description#

The block's own DESCRIPTION_HTML, rendered verbatim — the same text the config dialog's info panel and the library navigator show. Fix a wrong sentence in the block's .cpp (R-D9), never here.

Earth Nutation

Robotics / Celestial Phenomena

The Earth's nutation in longitude and obliquity, Δψ and Δε, by the 1980 IAU theory, at the input Julian date, and their rates – read from the nutation columns of JPL's Development Ephemeris (the DE file you supply) and evaluated by JPL's own algorithm.

Ports

  • JD (TDB) – the Julian date in Barycentric Dynamical Time, [1,1].
  • angles – [Δψ; Δε], [2,1], in rad.
  • rates – their rates, [2,1], in rad/day.

Parameters

  • Ephemeris Model – which JPL Development Ephemeris: DE405, DE421, DE423 or DE430 (DE432t carries no nutations) (default DE405, Simulink's). Each covers its own span of dates.
  • Ephemeris Folder – the folder holding JPL's published ASCII files for that model, header.4xx and the asc*.4xx data files, exactly as they download from ssd.jpl.nasa.gov/ftp/eph/planets/ascii/ (for DE432t, name them .432). Absolute, or relative to the project folder. The block reads them once and shares them. ICore ships no ephemeris: you supply the file, as MATLAB's support package does, and the files need cover only the dates you run.
  • Use Date Range – Off (default) or On. On, a date outside Start Date..End Date has no answer, as one outside the loaded data has; and an export carries only that range's records, so an export needs it On. Simulink's Earth Nutation has no date range; this one is ICore's own, for the export.
  • Start Date / End Date – the range's Julian dates (TDB), default 2458849.5 and 2469807.5 (2020-01-01 and 2050-01-01, Simulink's).
  • Action – what a date with no answer does: Error (default) stops the run naming the date; Warning reports it once per run; None says nothing. With Warning and None the outputs are NaN.
  • Sampling Time (s) – zero or less inherits the solver's rate; a positive value runs the block at that period.

Notes

  • Stateless: each date is answered on its own.
  • Simulink's None and Warning extend the nearest record's polynomial past the data; this block answers NaN there instead.

Code export

Python, MATLAB, Java, Rust, C and C++. Each carries only the 32-day records the date range falls in, packed to the coefficients its answer reads, and JPL's own evaluation of them, operation for operation as the block computes it – so Use Date Range must be On, and an export with it Off stops and says so. A date outside the range or the carried records answers NaN: a deployed core cannot stop, so Action Error answers NaN there too. The three HDL targets (VHDL, Verilog, SystemVerilog) and PLC Structured Text are not offered – an export to one of them stops and names this block – because a Julian date (about 2.4 million) cannot sit on a Q16.16 port, whose range ends at ±32768, and the records are thousands of constants.

Simulink bridge

Import and export, mapped to Aerospace Blockset's aerolibcelestial/Earth Nutation: Ephemeris Model ↔ de and Action ↔ errorflag, 1:1. Ephemeris Folder, Use Date Range, Start Date and End Date are ICore's own and do not cross. epochflag is always Julian date and velflag always on, because the other settings move Simulink's ports; an import that sets either otherwise is reported. The Simulink block has no SampleTime, so the rate stays on the ICore side.

Code facts#

FactValue
registered typeRobotics/Celestial_Phenomena/Earth_Nutation
familyRobotics/Celestial_Phenomena
solver environment classICoreBlock_0_Robotics_1_Celestial_Phenomena_2_Earth_Nutation
sourcesrc/ICoreBlocks/ICoreBlockLibrary/Blocks/Robotics/Celestial_Phenomena/Earth_Nutation/ICoreBlock_0_Robotics_1_Celestial_Phenomena_2_Earth_Nutation.cpp
headersrc/ICoreBlocks/ICoreBlockLibrary/Blocks/Robotics/Celestial_Phenomena/Earth_Nutation/ICoreBlock_0_Robotics_1_Celestial_Phenomena_2_Earth_Nutation.h
ports at insert1 in, 2 out
code generators implementedPython, MATLAB, Java, Rust, C, C++

Ports#

#DirectionSignal typeDescription label
1inICoreDoubleJD (TDB)
2outICoreDoubleangles
3outICoreDoublerates

Ports the constructor creates. A block whose port list changes with its configuration adds or removes ports at load time; the count above is the one a freshly inserted block has.

Configuration variables#

Config variableDefaultSimulink parameter
Ephemeris ModelDE405%~%DE421%~%DE423%~%DE430~~DE405de
Ephemeris Folder—not crossed
Use Date RangeOff%~%On~~Offnot crossed
Start Date2458849.5not crossed
End Date2469807.5not crossed
ActionNone%~%Warning%~%Error~~Errorerrorflag

Every block also carries Sampling Time (s) from ICoreBlockSolverEnvironment: zero or less inherits the solver's rate, a positive value runs the block at that period.

supportSupport::Both
Simulink pathaerolibcelestial/Earth Nutation
port-count rulePortsParam::None
SampleTime parameterno — the counterpart defines none; the rate stays on the ICore side
deliberately not crossedEphemeris Folder, Use Date Range, Start Date, End Date
always setepochflag = Julian date, velflag = on
ICore configSimulink parameterValue translation
Ephemeris ModeldeDE405 → DE405, DE421 → DE421, DE423 → DE423, DE430 → DE430
ActionerrorflagNone → None, Warning → Warning, Error → Error

Caveat (shown to the user): One Julian date (TDB) in, the nutation angles [dpsi; deps] (rad) and their rates (rad/day) out. 'epochflag' is always 'Julian date' and 'velflag' always 'on': the other settings move Simulink's ports. Ephemeris Folder and the date range are ICore's own. Out of the data, Simulink's None and Warning extend the nearest record's polynomial; this block answers NaN. No SampleTime

Catalog contract: src/ICoreBlocks/ICoreCoder/ICoreCommandSystem/SimulinkBridge/ICoreSimulinkBlockCatalog.h

Description vs code#

The checker has a blind spot here — it could not resolve something (a grouped port bullet, a computed config name), which is reported and never counted as a pass. A reader has to settle it:

  • B0 no sample under docs/generated/samples/ — nothing to cross-check (P8.1)

The verdict above is tools/docs/check_block_descriptions.py (P7.1), which compares LISTS. It cannot read a sentence: "stateless" on a block with a state, an initial-value semantic the recursion does not implement, a "not synthesizable" caveat the HDL banner contradicts. That is the agent audit (P7.3) on BLOCK_DESCRIPTION_AUDIT.md, and this tool's green is not a substitute for one.

File banner (developer view)#

The top comment of the block's .cpp — the maths, the realization and the export strategy, addressed to whoever changes it. It must not contradict the description above (P7.5).

Earth Nutation -- the 1980 IAU nutation angles, from JPL's DE ephemeris Aerospace Blockset, aerolibcelestial/Earth Nutation, measured on R2026a with the Ephemeris Data support package installed: a MASKED SubSystem (EarthNutation), one input and two outputs, no SampleTime. de DE405 (default) / DE421 / DE423 / DE430 -- NO DE432t, whose file carries no nutations; errorflag Error by default; epochflag and velflag move ports, so this block always takes one Julian date and gives both outputs (fixed on the bridge). Measured: the angles [dpsi deps] in rad and their rates in rad/day are the DE file's nutation columns evaluated as JPL does; out of the data, None extrapolates silently (declined here: NaN). The date range is ICore's own: Simulink's block has none, and an export needs one.

Sample results#

No sample run is committed for this block. Samples come from the headless harness (DOCS_PLAN.md P8.1) into docs/generated/samples/; until one exists this block's behaviour is witnessed by the parity and export-verification suites, not by a plot here.