Whole-grid IONEX vertical-TEC samples.
This is the intermediate representation an IONEX product is built from and
read back as, with no text in the loop:
from_samples/1 followed by tec_grid_samples/1 reproduces every stored
float and epoch.
map_epochs are Sidereon.GNSS.Ionosphere.Epoch values, strictly increasing.
The node axes are degrees and run in the direction their signed step gives.
Shell height and base radius are kilometers. TEC and RMS grids are TECU and
height grids are kilometers, each indexed [map][latitude][longitude].
Absence
- A node without a value is
nil; a node holding0.0has a value of zero. rms_mapsorheight_mapsisnilwhere the product carries no such maps at all. That is not the same as maps present with every node non-available, which is a list of the same shape astec_mapsfilled withnil.
RMS and height maps both hold that distinction, through the handle, the writer
and a reparse: a stack present with every node nil is written out with every
node at the file's missing value and read back as a stack, where nil writes
no such records at all.
This whole-grid form is the only one that can state it.
Sidereon.GNSS.Ionosphere.from_node_samples/5 builds from flat node samples,
which carry no map-presence field: samples whose rms_tecu is nil at every
node give a product with no RMS maps, because nothing in that input says the
maps are declared. Build such a product from these samples instead.
What is refused
{:invalid_grid_field, field, value}- a field whose value is not of the field's type, with the value that is not.{:value_out_of_range, field, value}- a number past the range the boundary carries that field in, with the value that is past it. An axis entry, a step, a radius and a node value are each past it when they are an integer larger in magnitude than the largest finite double, which has no double to be read onto;EXPONENTis past it outside the signed 32-bit range it crosses in.- the epoch refusals of
Sidereon.GNSS.Ionosphere.Epoch.
Summary
Types
@type grid() :: [[[float() | nil]]]
@type t() :: %Sidereon.GNSS.Ionosphere.TecGridSamples{ base_radius_km: float(), dlat_deg: float(), dlon_deg: float(), exponent: integer(), header: Sidereon.GNSS.Ionosphere.Header.t(), height_maps: grid() | nil, lat_nodes_deg: [float()], lon_nodes_deg: [float()], map_epochs: [Sidereon.GNSS.Ionosphere.Epoch.t()], rms_maps: grid() | nil, shell_height_km: float(), tec_maps: grid() }