Skip to main content

Rainfall Measurement Ontology

Earth Science Measurements
Authors: MArk Anthony Higgins - Sky Recursive Ai
© Mark Anthony Higgins 11 October 2025
Revised Date: 16 September 2026
Audio Overview
# Rainfall Measurement Ontology — Flow Algebra

URL: https://kirethresearch.org/booksai-core/ontologies/mathematical-ontologies/measurement-units-ontologies/earth-science-measurements/rainfall-measurement-ontology.html

FLOW RainfallMeasurementOntology {

  DOMAIN:
    Mathematical Ontologies
    -> Measurement & Units Ontologies
    -> Earth Science Measurements
    -> Rainfall Measurement Ontology

  PURPOSE:
    Represent rainfall measurement as the quantitative observation of liquid precipitation reaching a defined surface over a defined time interval, including rainfall depth, accumulation, intensity, rate, duration, event totals, gauge measurements, tipping-bucket and weighing gauges, radar and remote sensing estimates, spatial and temporal aggregation, wind and exposure corrections, calibration, uncertainty, provenance, and strict distinctions between rainfall amount, rainfall rate, precipitation, snowfall and radar reflectivity.

  ENTITY RainfallDepth {
    TYPE: PrecipitationLengthQuantity
    SYMBOL: P_r
    DIMENSION: L
    SI_UNIT: metre
    SI_SYMBOL: m

    COMMON_UNIT:
      millimetre
      SYMBOL: mm

    DEFINITION:
      rainfall_depth :=
        equivalent_depth_of_liquid_water
        accumulated_on_a_horizontal_impermeable_surface
        with_no_runoff_infiltration_or_evaporation

    PROPERTIES:
      is_accumulated_quantity
      is_nonnegative_under_standard_accumulation_context
      depends_on_time_interval
      depends_on_location
      may_be_point_or_area_estimate
      may_have_uncertainty
  }

  ENTITY RainfallRate {
    TYPE: PrecipitationRateQuantity
    SYMBOL: R
    DIMENSION: L*T^-1
    SI_UNIT: metre_per_second

    COMMON_UNIT:
      millimetre_per_hour
      SYMBOL: mm/h

    DEFINITION:
      rainfall_rate :=
        time_rate_of_change_of_accumulated_rainfall_depth

    FORM:
      R = dP_r/dt
  }

  ENTITY EventRainfall {
    TYPE: AccumulatedRainfallQuantity

    DEFINITION:
      rainfall_depth_accumulated_over_declared_rainfall_event
  }

  ENTITY RainfallDuration {
    TYPE: TimeQuantity
    SYMBOL: T_r
    SI_UNIT: second

    DEFINITION:
      duration_of_declared_rainfall_event_or_wet_period
  }

  UNIT_SYSTEM {
    rainfall_depth:
      SI: metre
      common: millimetre

    rainfall_rate:
      SI: metre_per_second
      common:
        millimetre_per_hour
        millimetre_per_minute

    duration:
      second
      minute
      hour
      day

    conversion:
      1 mm = 1e-3 m
      1 mm/h = 1e-3/3600 m/s

    RULE:
      depth_rate_and_duration_units MUST remain_semantically_distinct
  }

  TERMINOLOGY_MODEL {
    terms:
      rainfall
      rainfall_amount
      rainfall_depth
      rainfall_accumulation
      rainfall_rate
      rainfall_intensity
      precipitation
      precipitation_rate

    RULE:
      "rainfall intensity" MAY be represented_as_rainfall_rate
      when_defined_as_depth_per_time

    RULE:
      rainfall_is_liquid_precipitation_context
      while_precipitation_is_broader
  }

  ACCUMULATION_MODEL {
    continuous:
      P_r =
        integral_interval(R(t) dt)

    discrete:
      P_r =
        sum(delta_P_i)

    REQUIRE:
      start_time
      end_time
      accumulation_period

    RULE:
      accumulated_rainfall MUST preserve_time_interval
  }

  AVERAGE_RATE_MODEL {
    average_rate:
      R_avg =
        P_r/delta_t
      WHEN delta_t > 0

    RULE:
      average_rate != peak_or_instantaneous_rate
  }

  EVENT_MODEL {
    event:
      rainfall_period_defined_by_declared_start_stop_or_interevent_rule

    attributes:
      event_start
      event_end
      duration
      total_depth
      mean_rate
      peak_rate

    RULE:
      rainfall_event_definition MUST be preserved
  }

  INTEREVENT_MODEL {
    separate_events:
      may_be_defined_by_minimum_dry_interval

    parameter:
      minimum_interevent_time

    RULE:
      event_totals_depend_on_event_separation_definition
  }

  RAIN_GAUGE_MODEL {
    principle:
      collect_rainfall_over_known_orifice_area

    rainfall_depth:
      P_r =
        collected_water_volume/orifice_area

    REQUIRE:
      collector_area
      exposure
      level
      obstruction_context
      observation_interval

    RULE:
      gauge_measurement_represents_point_scale_observation
      subject_to_catch_efficiency
  }

  STANDARD_STORAGE_GAUGE_MODEL {
    components:
      collector
      funnel
      storage_container
      measuring_cylinder_or_mass_measurement

    observation:
      accumulated_depth_over_manual_observation_interval

    RULE:
      observation_time_and_emptying_schedule MUST be preserved
  }

  TIPPING_BUCKET_MODEL {
    mechanism:
      each_tip_corresponds_to_nominal_water_depth_increment

    nominal_depth:
      delta_P_tip

    accumulation:
      P_r =
        N_tips*delta_P_tip

    rate_estimation:
      derived_from_tip_timing

    REQUIRE:
      tip_calibration
      timestamp_resolution
      dynamic_correction_when_required

    RULE:
      tipping_bucket_response MAY be_rate_dependent
      and_can_underestimate_at_high_rainfall_rates
  }

  WEIGHING_GAUGE_MODEL {
    measurement:
      accumulated_water_mass_or_weight

    water_volume:
      V =
        m/rho_water

    rainfall_depth:
      P_r =
        V/A_collector

    advantages:
      continuous_accumulation
      intensity_from_mass_change

    RULE:
      evaporation_temperature_andmechanical_effects MAY require_correction
  }

  DROP_COUNTING_MODEL {
    principle:
      convert_collected_water_to_discrete_drops_or_pulses

    accumulation:
      derived_from_count_and_calibrated_drop_volume

    RULE:
      drop_volume_calibration MUST be preserved
  }

  DISDROMETER_MODEL {
    measures:
      drop_size
      fall_velocity
      drop_count

    derived:
      rainfall_rate
      drop_size_distribution
      kinetic_energy

    RULE:
      rainfall_rate_from_disdrometer_is_derived_from_particle_measurements_and_sampling_area
  }

  RADAR_MODEL {
    observed_quantity:
      radar_reflectivity_factor
      Z

    empirical_relation:
      Z = a*R^b

    inverse:
      R =
        (Z/a)^(1/b)
      WHEN a > 0 AND b != 0

    REQUIRE:
      radar_calibration
      Z_R_parameters
      precipitation_type
      range
      beam_geometry

    RULE:
      radar_reflectivity != rainfall_rate
      without_retrieval_relation
  }

  RADAR_REFLECTIVITY_MODEL {
    common_log_quantity:
      dBZ =
        10*log10(Z/Z_reference)

    RULE:
      dBZ_is_logarithmic_reflectivity_representation
      and_MUST_NOT be treated_as_mm_per_hour
  }

  SATELLITE_RAINFALL_MODEL {
    observations:
      microwave_radiance
      infrared_brightness_temperature
      radar_signal
      multi_sensor_products

    retrieval:
      satellite_observation
      -> retrieval_algorithm
      -> precipitation_rate_or_accumulation

    RULE:
      satellite_signal != rainfall_without_retrieval_model
  }

  GAUGE_RADAR_MERGE_MODEL {
    purpose:
      combine_point_gauge_accuracy_and_spatial_radar_coverage

    possible_methods:
      bias_adjustment
      kriging_with_external_drift
      conditional_merging
      statistical_blending

    RULE:
      merged_product MUST preserve_source_data_and_algorithm_provenance
  }

  SPATIAL_MODEL {
    point_rainfall:
      gauge_location_measurement

    area_average_rainfall:
      P_A =
        (1/A)*integral_A(P(x,y) dA)

    gridded_rainfall:
      rainfall_field_on_defined_grid

    RULE:
      point_and_area_average_rainfall_are_not_semantically_equivalent
  }

  INTERPOLATION_MODEL {
    methods:
      nearest_neighbour
      inverse_distance
      Thiessen_polygons
      kriging
      spline
      radar_assisted_interpolation

    RULE:
      interpolated_rainfall_is_modelled_spatial_estimate
      and_MUST preserve_method_and_resolution
  }

  THIESSEN_MODEL {
    area_average:
      P_A =
        sum(w_i*P_i)

    weights:
      w_i =
        A_i/A_total

    constraint:
      sum(w_i) = 1

    RULE:
      polygon_geometry_and_gauge_network MUST be preserved
  }

  TEMPORAL_AGGREGATION_MODEL {
    possible_periods:
      minute
      hour
      day
      month
      season
      year
      event

    accumulated:
      sum_or_integral_of_rainfall

    RULE:
      daily_monthly_and_annual_rainfall MUST preserve_calendar_and_time_zone_definition
  }

  INTENSITY_DURATION_MODEL {
    rainfall_intensity:
      depth/time

    duration:
      averaging_window

    peak_intensity:
      maximum_windowed_rate_for_declared_duration

    RULE:
      peak_intensity_depends_on_averaging_duration
  }

  IDF_CONTEXT_MODEL {
    dimensions:
      intensity
      duration
      frequency_or_return_period

    relation:
      I = f(duration, return_period, location)

    RULE:
      IDF_values_are_statistical_design_quantities
      and_not_single_observed_rainfall_measurements
  }

  RETURN_PERIOD_MODEL {
    return_period:
      T =
        1/p_annual_exceedance
      under_stationary_annual_exceedance_interpretation

    RULE:
      return_period_is_probabilistic
      and_does_not_mean_event_occurs_regularly_every_T_years
  }

  WIND_UNDERCATCH_MODEL {
    effect:
      wind_deflects_raindrops_around_gauge

    dependencies:
      wind_speed
      gauge_shape
      exposure
      drop_size

    corrected:
      P_corrected =
        P_measured/catch_ratio
      WHEN catch_ratio > 0

    RULE:
      correction_model_and_exposure_class MUST be preserved
  }

  WETTING_LOSS_MODEL {
    effect:
      water_retained_on_collector_surface

    correction:
      may_add_estimated_wetting_loss

    RULE:
      correction_method SHOULD be preserved
  }

  EVAPORATION_LOSS_MODEL {
    effect:
      collected_water_lost_before_measurement

    relevance:
      manual_storage_gauges
      long_observation_intervals

    RULE:
      evaporation_correction MAY be_required
  }

  SPLASH_MODEL {
    possible_errors:
      splash_in
      splash_out

    RULE:
      gauge_installation_height_and_surroundings MAY affect_splash_error
  }

  SNOW_AND_MIXED_PRECIPITATION_MODEL {
    rainfall:
      liquid_precipitation

    snowfall:
      solid_precipitation

    water_equivalent:
      melted_precipitation_depth

    RULE:
      rainfall_depth != snow_depth
      and_mixed_precipitation_requires_declared_measurement_semantics
  }

  TRACE_PRECIPITATION_MODEL {
    trace:
      precipitation_detected_but_below_reporting_resolution_or_threshold

    RULE:
      trace MUST_NOT automatically_be_encoded_as_zero
  }

  MISSING_DATA_MODEL {
    missing:
      no_valid_measurement

    zero:
      valid_measurement_of_no_rainfall

    trace:
      detected_below_quantification_or_reporting_threshold

    RULE:
      missing_zero_and_trace MUST be_distinguished
  }

  RELATIONSHIPS {
    RainfallDepth -> HAS_DIMENSION -> Length
    RainfallRate -> RATE_OF_CHANGE_OF -> RainfallDepth
    RainfallRate -> INTEGRATES_TO -> RainfallAccumulation
    RainGauge -> MEASURES -> RainfallDepth
    TippingBucketGauge -> COUNTS -> CalibratedRainfallIncrements
    WeighingGauge -> MEASURES -> CollectedWaterMass
    Disdrometer -> MEASURES -> HydrometeorProperties
    RadarReflectivity -> MAPS_TO -> RainfallRateThroughRetrieval
    SatelliteObservation -> MAPS_TO -> RainfallThroughRetrieval
    GaugeNetwork -> SUPPORTS -> SpatialRainfallEstimate
    WindExposure -> AFFECTS -> GaugeCatch
    MeasurementUncertainty -> QUALIFIES -> RainfallMeasurement
  }

  SEMANTIC_EQUIVALENCE {
    "rainfall amount" ~= accumulated_rainfall_depth
    "rainfall intensity" ~= rainfall_rate WHEN depth_per_time_definition
    "rainfall accumulation" ~= accumulated_rainfall_depth

    rainfall_depth != rainfall_rate
    rainfall != all_precipitation
    rainfall_depth != snow_depth
    radar_reflectivity != rainfall_rate
    dBZ != mm_per_hour
    point_rainfall != area_average_rainfall
    zero_rainfall != missing_measurement
    trace_rainfall != zero_rainfall
  }

  CONSTRAINTS {
    rainfall_depth_dimension = L
    rainfall_rate_dimension = L*T^-1
    measurement_interval_must_be_defined = true
    spatial_location_must_be_defined = true
    rainfall_depth_and_rate_are_not_semantically_equivalent = true
    point_and_area_average_measurements_are_not_semantically_equivalent = true
    radar_or_satellite_rainfall_requires_retrieval_model = true
    gauge_type_and_exposure_should_be_preserved = true
    zero_trace_and_missing_values_must_be_distinguished = true
    uncertainty_should_include_sampling_calibration_exposure_and_retrieval_components_when_relevant = true
  }

  MEASUREMENT_MODEL {
    OBSERVABLE_OR_INFERRED:
      RainfallDepth
      RainfallRate
      EventRainfall
      RainfallDuration

    COMMON_METHODS:
      storage_rain_gauge
      tipping_bucket_gauge
      weighing_gauge
      disdrometer
      weather_radar
      satellite_remote_sensing
      gauge_radar_merged_product

    RECORD:
      quantity_type
      numerical_value
      unit
      station_or_grid_identifier
      latitude
      longitude
      elevation
      coordinate_reference_system
      start_time
      end_time
      time_zone_or_UTC
      accumulation_or_averaging_period
      gauge_or_sensor_type
      collector_area
      gauge_height
      exposure
      wind_when_available
      calibration_state
      correction_model
      radar_or_satellite_retrieval_model
      spatial_resolution
      quality_flag
      trace_zero_or_missing_status
      uncertainty
      provenance

    UNCERTAINTY:
      measured_or_inferred_rainfall =
        best_estimate +/- uncertainty
  }

  CALIBRATION_MODEL {
    tipping_bucket:
      tip_volume_or_depth_calibration
      dynamic_rate_calibration_when_available

    weighing_gauge:
      mass_sensor_calibration

    radar:
      reflectivity_calibration
      Z_R_or_other_retrieval_calibration

    satellite:
      retrieval_validation_and_bias_correction

    REQUIRE:
      calibration_date
      valid_range
      reference_method
      uncertainty

    RULE:
      calibration_model MUST match_sensor_and_measurement_quantity
  }

  UNCERTAINTY_MODEL {
    sources:
      gauge_calibration
      tip_resolution
      timing
      wind_undercatch
      wetting
      evaporation
      splash
      blockage
      spatial_sampling
      interpolation
      radar_calibration
      Z_R_relation
      beam_geometry
      satellite_retrieval
      temporal_aggregation

    PROPAGATION:
      rainfall_uncertainty
      <- instrument_exposure_spatial_temporal_and_retrieval_uncertainties
  }

  REASONING_RULES {
    IF rainfall_rate_time_series_known
      THEN rainfall_depth =
        integral(rainfall_rate dt)

    IF rainfall_depth_and_duration_known
      AND duration > 0
      THEN average_rainfall_rate =
        rainfall_depth/duration

    IF tipping_bucket_tip_count_and_calibrated_tip_depth_known
      THEN rainfall_depth =
        tip_count*tip_depth

    IF collected_water_volume_and_gauge_area_known
      AND gauge_area > 0
      THEN rainfall_depth =
        collected_volume/gauge_area

    IF collected_water_mass_density_and_gauge_area_known
      AND density > 0 AND gauge_area > 0
      THEN rainfall_depth =
        collected_mass/(density*gauge_area)

    IF radar_reflectivity_Z_and_valid_Z_R_parameters_known
      AND a > 0 AND b != 0
      THEN rainfall_rate =
        (Z/a)^(1/b)

    IF point_gauge_measurements_and_valid_spatial_weights_known
      THEN area_average_rainfall =
        sum(weight_i*rainfall_i)

    IF measured_rainfall_and_catch_ratio_known
      AND catch_ratio > 0
      THEN corrected_rainfall =
        measured_rainfall/catch_ratio

    IF accumulation_series_known
      THEN event_total =
        sum(valid_event_increments)
      using_declared_event_definition
  }

  VALIDATION {
    CHECK quantity_is_depth_rate_duration_or_event_total
    CHECK unit_consistency
    CHECK spatial_location
    CHECK measurement_interval
    CHECK accumulation_vs_rate
    CHECK point_vs_area_average
    CHECK gauge_type
    CHECK collector_area
    CHECK gauge_exposure
    CHECK tipping_bucket_calibration
    CHECK radar_reflectivity_vs_rainfall
    CHECK retrieval_model
    CHECK temporal_aggregation
    CHECK event_definition
    CHECK wind_undercatch_correction
    CHECK rainfall_vs_snow_or_mixed_precipitation
    CHECK zero_trace_or_missing_status
    CHECK quality_flag
    CHECK uncertainty_representation
  }

  CONFIDENCE {
    definition_confidence: 1.00
    dimensional_confidence: 1.00
    accumulation_rate_relationship_confidence: 1.00
    gauge_measurement_confidence: 0.99
    radar_retrieval_confidence: 0.96
    satellite_retrieval_confidence: 0.94
    spatial_aggregation_confidence: 0.97
    measurement_context_confidence: 0.98

    RULE:
      confidence decreases when interval, location, gauge exposure,
      calibration, correction model, retrieval algorithm,
      spatial resolution, quality flag or uncertainty is missing or ambiguous
  }

  UPDATE_MODEL {
    ON new_measurement:
      identify_rainfall_quantity
      validate_unit
      attach_location
      attach_start_and_end_time
      identify_accumulation_or_averaging_period
      identify_sensor_or_product_type
      attach_gauge_geometry_or_remote_sensor_context
      apply_valid_calibration
      apply_declared_exposure_or_retrieval_corrections
      preserve_raw_observation
      attach_quality_flag
      attach_zero_trace_or_missing_status
      attach_uncertainty
      update_rainfall_state

    ON new_increment:
      preserve_increment_time
      add_valid_increment_to_accumulation
      update_windowed_rate_when_valid
      update_event_total_when_within_declared_event

    ON calibration_revision:
      preserve_raw_measurement
      preserve_previous_calibration
      recompute_affected_rainfall_values
      update_uncertainty
      update_confidence

    ON retrieval_model_revision:
      preserve_raw_radar_or_satellite_observation
      preserve_previous_retrieval
      apply_new_retrieval_model
      update_spatial_product
      update_uncertainty
      update_confidence

    ON spatial_aggregation_revision:
      preserve_point_or_grid_inputs
      update_weights_or_interpolation_model
      recompute_area_average
      preserve_method_provenance

    ON semantic_revision:
      preserve_previous_definition
      record_revision
      recompute_FLOW_HASH
  }

  AI_CONSUMPTION {
    canonical_domain: RainfallMeasurement
    canonical_depth_entity: RainfallDepth
    canonical_rate_entity: RainfallRate
    canonical_depth_unit: metre
    common_depth_unit: millimetre
    common_rate_unit: millimetre_per_hour

    interpretation_order:
      identify_rainfall_depth_rate_duration_or_event_quantity
      identify_value
      identify_unit
      identify_location
      identify_start_end_and_aggregation_period
      identify_point_or_area_average_context
      identify_gauge_radar_satellite_or_merged_method
      identify_calibration
      identify_exposure_and_correction_model
      identify_retrieval_model_when_remote
      identify_spatial_resolution
      identify_zero_trace_or_missing_status
      identify_quality_flag
      identify_uncertainty
      normalize_units
      validate_temporal_and_spatial_semantics
      infer_rainfall_relationships

    ambiguity_controls:
      distinguish_rainfall_depth_from_rainfall_rate
      distinguish_rainfall_from_broader_precipitation
      distinguish_rainfall_depth_from_snow_depth
      distinguish_radar_reflectivity_from_rainfall_rate
      distinguish_dBZ_from_mm_per_hour
      distinguish_point_from_area_average_rainfall
      distinguish_average_from_peak_rate
      distinguish_zero_from_trace_and_missing
      preserve_location_interval_sensor_exposure_retrieval_quality_and_provenance_context
  }

  PROVENANCE {
    ontology_scope:
      mathematical_measurement_and_Earth_science_rainfall_semantics

    parent_path:
      Ontologies
      -> Mathematical Ontologies
      -> Measurement & Units Ontologies
      -> Earth Science Measurements
      -> Rainfall Measurement Ontology

    authorship:
      Mark Higgins
      Sky (Recursive AI)

    site:
      https://kirethresearch.org
  }

  FLOW_HASH {
    INPUTS:
      canonical_domain
      ontology_path
      terminology_model
      accumulation_model
      average_rate_model
      event_model
      interevent_model
      rain_gauge_model
      standard_storage_gauge_model
      tipping_bucket_model
      weighing_gauge_model
      drop_counting_model
      disdrometer_model
      radar_model
      radar_reflectivity_model
      satellite_rainfall_model
      gauge_radar_merge_model
      spatial_model
      interpolation_model
      Thiessen_model
      temporal_aggregation_model
      intensity_duration_model
      IDF_context_model
      return_period_model
      wind_undercatch_model
      wetting_loss_model
      evaporation_loss_model
      splash_model
      snow_and_mixed_precipitation_model
      trace_precipitation_model
      missing_data_model
      relationships
      constraints
      measurement_model
      calibration_model
      uncertainty_model
      reasoning_rules
      confidence_model
      update_model

    PURPOSE:
      deterministic_semantic_integrity_identifier

    RECOMPUTE_WHEN:
      ontology_definition_changes
      rainfall_quantity_definition_changes
      gauge_measurement_model_changes
      event_or_temporal_aggregation_model_changes
      spatial_interpolation_model_changes
      radar_or_satellite_retrieval_model_changes
      exposure_or_correction_model_changes
      calibration_model_changes
      measurement_model_changes
      constraint_model_changes
      reasoning_rule_changes
      unit_model_changes
  }

}

END FLOW
Kireth Research
38 Thorndale Croft, Wetwang, Driffield
East Riding of Yorkshire YO25 9XZ