Example PRD

Parallel-hybrid runway UAV (F4)

Propulsion code 4 with runway operations; synthetic fixture values.

Source (read-only): MADETOOL/tests/fixtures/PRD_parhyb_rwy.txt

# =============================================================================
#  MADETOOL - Product Requirements Document (PRD)                  format 1.5
# =============================================================================
#  INTEGRATION TEST FIXTURE F4 (decision R6-05, Stage 3): parallel hybrid (propulsion
#  code 4) with runway take-off and landing (VTOL code 0), Group 3 class UAV.
#  Every number is a SYNTHETIC test value (src = "test fixture (synthetic)"): it is NOT
#  customer, manufacturer or flight data, and the results are conceptual estimates only.
#  Derived from the piston fixture PRD_piston_rwy.txt (same airframe class). Changes:
#  format 1.5, propulsion code 4, endurance 6 h (R6-05), battery data (the electric
#  machine boosts take-off and climb and, as a generator, charges the pack in cruise
#  and loiter: see components_parhyb_rwy.txt). Propulsion data: components_parhyb_rwy.txt
#  is PE's WO-PE-16 file (data/propulsion/examples/
#  SYNTHETIC_F4_parallel_hybrid_runway_components.txt, PE 1.2.0); the PRD values its
#  header names are set here, once (P-05).
#
#  HOW TO WRITE THIS FILE
#  ----------------------
#  [section]                                  groups keys
#  key  = value unit REF | attr = value ...   fixed value / target
#  key >= value unit REF | ...                requirement: must be AT LEAST
#  key <= value unit REF | ...                requirement: must NOT EXCEED
#  # ...                                      comment (to end of line)
#
#  value   : 12.5   3e-4   [300 200 150]   "quoted text"   WORD
#  unit    : case-sensitive, e.g. m km ft kg lb s min h m/s kt km/h W kW hp
#            Wh Wh/kg K degC deg % (full list: docs/02_PRD_SCHEMA.md)
#  REF     : airspeeds MUST state TAS | EAS | CAS | IAS
#            altitudes MUST state AGL | MSL (AGL is from site_elevation)
#  keyword : TBD  = not known yet (never treated as zero)
#            NONE = no limit / not applicable
#            AUTO = the tool sizes/estimates it
#            DEFAULT = use the model default (model options only)
#
#  Requirement attributes (after "|"):
#    type = HARD_LIMIT  must never be violated
#           MINIMUM     minimum acceptable capability; FAIL if not met
#           TARGET      desired value; deviation reported (tol = allowed deviation)
#           PREFERENCE  nice to have; ranks trade-study options
#    prio = 1 (highest) .. 5        src = where the number comes from
#    id   = "customer ID"           note = "free text"
#    Operating condition: alt = 1000 m MSL | CRUISE | SITE
#                         isa_dev = 15 K   or   oat = 35 degC
#                         config = CLEAN | TAKEOFF | LANDING
#    If no isa_dev/oat is given: alt = SITE uses site_isa_dev,
#    every other condition uses enroute_isa_dev.
#
#  Author: Syed Yasir Rehan Ali <yasir@alates.tr> | WhatsApp: +90-551-681-9256
# =============================================================================

[prd]
format_version = 1.5
revision       = "A"
date           = "2026-10-29"
author         = "TBD"
status         = DRAFT

[aircraft]
name             = "TEST-F4-PARHYB-RWY (parallel-hybrid pusher, runway; integration fixture F4)"
mission_role     = "ISR - EO/IR gimbal, day and night"
description      = "Integration test fixture F4 for propulsion code 4 and VTOL code 0. Not a requirement set."
propulsion_code  = 4                     # 1..7  (docs/03_CODES.md)
propulsion_label = PARALLEL_HYBRID       # optional cross-check of the code
vtol_code        = 0                     # 0..5
vtol_label       = NONE                  # optional cross-check of the code

[configuration]
layout                    = CONVENTIONAL
tail                      = V_TAIL
wing_position             = HIGH
fuselage                  = POD_AND_BOOM
cruise_propulsor_position = PUSHER
n_cruise_propulsors       = 1
landing_gear              = FIXED_TRICYCLE

[payload]
mass_max    >= 5.0 kg          | type = MINIMUM | prio = 1 | src = "test fixture (synthetic)"
mass_normal =  4.0 kg          | src = "test fixture (synthetic)"
volume      >= TBD             | type = MINIMUM | prio = 3 | src = "test fixture (synthetic)"
dims        =  [250 180 160] mm  | src = "test fixture (synthetic)"
power_avg   =  40 W            | src = "test fixture (synthetic)"
power_peak  =  80 W            | src = "test fixture (synthetic)"
cg_offset   =  TBD
mount       =  BELLY_GIMBAL
interface   =  "12 V power, Ethernet video, UART control (example)"
droppable   =  NO

[performance]
# Endurance / range: normal payload, take-off to landing, reserves EXCLUDED.
endurance       >= 6.0 h       | type = MINIMUM | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05"
range           >= 250 km      | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)"
speed_max_level >= 38 m/s TAS  | alt = CRUISE | isa_dev = 0 K | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)"
speed_cruise    =  28 m/s TAS  | alt = CRUISE | isa_dev = 0 K | type = TARGET | tol = 5 % | prio = 2 | src = "test fixture (synthetic)"
speed_stall     <= 18 m/s EAS  | config = CLEAN | type = TARGET | tol = 1 m/s | prio = 3 | src = "test fixture (synthetic)"
altitude_max    >= 3000 m MSL  | isa_dev = 0 K | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)"
altitude_cruise =  800 m AGL   | isa_dev = 0 K | type = TARGET | tol = 100 m | prio = 2 | src = "test fixture (synthetic)"
climb_rate      >= 2.5 m/s     | alt = SITE | type = MINIMUM | prio = 3 | src = "test fixture (synthetic)"

[constraints]
mtow          <= 60 kg             | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05"
wingspan      <= 4.5 m             | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)"
length        <= 3.0 m             | type = PREFERENCE | prio = 4 | src = "test fixture (synthetic)"
height        <= NONE              | type = PREFERENCE | prio = 5 | src = "test fixture (synthetic)"
transport_box =  [2000 600 500] mm   | src = "test fixture (synthetic)"
assembly_time <= 10 min            | type = PREFERENCE | prio = 4 | src = "test fixture (synthetic)"

[launch_recovery]
takeoff_distance <= 150 m          | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)"
landing_distance <= 300 m          | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)" | note = "R6-05; = runway_length"
takeoff_method  = RUNWAY             # VTOL RUNWAY HAND CATAPULT BUNGEE ROCKET_ASSIST VEHICLE_ROOF
recovery_method = RUNWAY             # VTOL RUNWAY BELLY PARACHUTE NET DEEP_STALL
# runway landing model inputs (PRD format 1.3/1.4; required with RUNWAY recovery)
approach_angle   = 5 deg            | src = "test fixture (synthetic)"
braking_friction = 0.3              | src = "test fixture (synthetic)" | note = "wheel brakes on"
free_roll_time   = 1 s              | src = "test fixture (synthetic)"
landing_speed_schedule = MILITARY   | src = "user decision 2026-10-28 (D-22)" | note = "approach 1.2, flare 1.15, touchdown 1.1 x V_stall"

[environment]
site_elevation  = 100 m MSL     | src = "test fixture (synthetic)"
site_isa_dev    = 20 K          | src = "test fixture (synthetic)" | note = "hot day: ISA+20 K = 35 degC at sea level"
enroute_isa_dev = 0 K           | src = "test fixture (synthetic)"
wind_mean       = 8 m/s         | src = "test fixture (synthetic)"
wind_gust       = 12 m/s        | src = "test fixture (synthetic)"
crosswind       = 6 m/s         | src = "test fixture (synthetic)" | note = "if omitted, wind_mean is used as crosswind"
runway_length   = 300 m         | src = "test fixture (synthetic)"
runway_surface  = PAVED
obstacle_height = 15 m          | src = "test fixture (synthetic)"

[vtol]
# not used: vtol_code = 0

[mission]
name                 = "ISR endurance / range"
cruise_speed_policy  = FIXED            # FIXED uses performance.speed_cruise
loiter_speed_policy  = BEST_ENDURANCE
climb_rate           = 2.5 m/s          | src = "test fixture (synthetic)"
descent_rate         = 2.0 m/s          | src = "test fixture (synthetic)"
headwind             = 0 m/s            # 0 = still-air range
warmup_time          = 3 min            | src = "test fixture (synthetic)"
custom_profile       = NO
# custom_payload     = NORMAL           # NORMAL | MAX - required when custom_profile = YES

[mission.custom]
# Read only when mission.custom_profile = YES. Example profile:
# seg01 = VTOL_TAKEOFF    | time = 30 s | height = 20 m AGL   (climb at vertical_climb_rate, then hover)
# seg02 = TRANSITION_FWD  | time = 15 s
# seg03 = CLIMB           | to = CRUISE | rate = 2.5 m/s
# seg04 = CRUISE          | distance = 30 km | speed = CRUISE
# seg05 = LOITER          | time = 90 min | speed = BEST_ENDURANCE
# seg06 = CRUISE          | distance = 30 km | speed = BEST_RANGE
# seg07 = DESCENT         | to = 20 m AGL | rate = 2 m/s
# seg08 = TRANSITION_BACK | time = 20 s
# seg09 = VTOL_LANDING    | time = 45 s | height = 20 m AGL   (hover, then vertical descent)

[reserves]
# All components are added: loiter time + divert distance + extra hover
# (flown level at the reserve altitude / hover height from the trip-end state)
# + contingency_fraction of the trip energy/fuel; then energy_fraction of the
# usable energy/fuel must still remain at landing.
time            = 10 min        | src = "test fixture (synthetic)"
altitude        = 100 m AGL     | src = "test fixture (synthetic)"
distance        = 0 km          | src = "test fixture (synthetic)"
hover_time      = 0 s
energy_fraction      = 10 %     | src = "test fixture (synthetic)"
contingency_fraction = 5 %      | src = "test fixture (synthetic)"

[component.fuel]
type              = MOGAS
density           = 0.74 kg/L     | src = "test fixture (synthetic)"
lhv               = 43.4 MJ/kg    | src = "test fixture (synthetic)" | note = "PE 1.2.0 component-file header (WO-PE-16)"
unusable_fraction = 3 %           | src = "test fixture (synthetic)"

[component.engine]
mass         = AUTO
power_max_sl = AUTO               # sized by PE: cruise-point shaft power at cruise altitude (PROP_HYBRID_LOAD_FOLLOWING)
bsfc         = 550 g/kWh          | src = "test fixture (synthetic)" | note = "small two-stroke; PE 1.2.0 component-file header (WO-PE-16)"

[component.battery]
# Pack of the electric machine (boost, hotel load on the bus, in-flight charging).
chemistry            = LI_PO
pack_specific_energy = 150 Wh/kg  | src = "test fixture (synthetic)"
usable_fraction      = 90 %       | src = "test fixture (synthetic)" | note = "PE 1.2.0 component-file header (WO-PE-16)"
eol_factor           = 90 %       | src = "test fixture (synthetic)"
cell_voltage_nominal = 3.7 V      | src = "test fixture (synthetic)"
series_cells         = 12         | src = "test fixture (synthetic)" | note = "44.4 V bus; PE 1.2.0 component-file header (WO-PE-16)"
capacity             = AUTO
max_c_rate_cont      = AUTO       # components file: battery.p_spec_cont_Wkg
max_c_rate_peak      = AUTO       # components file: battery.p_spec_peak_Wkg

[component.cruise_motor]
# Code 4: the electric machine on the propeller shaft (PE em.*).
mass           = AUTO             # em.spec_power_Wkg in the components file
power_max_cont = AUTO             # PE: design-point shaft power minus the engine power at SL ISA
kv             = AUTO
efficiency_max = AUTO             # components file: em.eta

[component.cruise_prop]
diameter          = AUTO
pitch             = AUTO
blades            = 2
efficiency_cruise = AUTO

[component.lift_motor]
# not used

[component.lift_rotor]
# not used

[component.esc]
efficiency = AUTO                 # code 4: the inverter of the electric machine, components file em.inverter.eta

[component.avionics]
mass  = 1.5 kg                  | src = "test fixture (synthetic)"
power = 40 W                    | src = "test fixture (synthetic)"

[component.airfoil_wing]
name            = "NACA 4412"   | src = "test fixture (synthetic)"
data_file       = ""
cl_max_2d       = AUTO
cd_min_2d       = AUTO
cm_ac           = AUTO
alpha_zero_lift = AUTO

[data_files]
# External data files owned by the specialist modules; paths are relative to
# this PRD's folder. "" = not used. A value may be given in a data file OR in
# [component.*], not both.
propulsion_components = "components_parhyb_rwy.txt"   # PE format; SYNTHETIC test values
aero_data             = "aero_parhyb_rwy.txt"         # AERO format; SYNTHETIC test values
layout                = "layout_parhyb_rwy.txt"       # MSC format; SYNTHETIC test values

[design_choices]
mtow_guess      = 28 kg         | note = "iteration start value only"
wing_loading    = AUTO
aspect_ratio    = 14            | src = "test fixture (synthetic)" | note = "user-fixed, as the piston fixture"
taper_ratio     = 0.6           | src = "test fixture (synthetic)"
sweep_c4        = 0 deg
dihedral        = 2 deg         | src = "test fixture (synthetic)"
thickness_ratio = 12 %          | note = "consistent with NACA 4412"
tail_volume_h   = AUTO
tail_volume_v   = AUTO
power_loading   = AUTO

[stability]
static_margin_min >= 5 %        | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)"
static_margin_max <= 20 %       | type = PREFERENCE | prio = 4 | src = "test fixture (synthetic)"

[loads]
# PART23_PRE_A64 = 14 CFR Part 23 normal category before Amendment 23-64: public
# reference values only, NOT a UAS airworthiness requirement. For STANAG 4671 /
# STANAG 4703 / USER, enter every value (AUTO is not allowed).
basis            = PART23_PRE_A64
n_limit_pos      = AUTO
n_limit_neg      = AUTO
factor_of_safety = 1.5          | src = "test fixture (synthetic)" | note = "14 CFR 23.303 (pre-Amdt 23-64) uses 1.5 for manned aircraft; confirm for this UAS"
gust_ude_vc      = AUTO
gust_ude_vd      = AUTO

[manufacturing]
structure_material = CFRP_GFRP
process            = VACUUM_INFUSION
max_part_length    <= 1.8 m     | type = HARD_LIMIT | prio = 2 | src = "test fixture (synthetic)" | note = "mould / oven size"

[classification]
dod_group          <= 3         | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)"
dod_table          = DOD_UAS_GROUPS
civil_jurisdiction = "Turkey (SHGM) - informational only; civil rules are separate inputs"

[model]
sizing_mode             = SIZE_TO_MISSION   # or FIXED_MTOW (uses constraints.mtow)
fidelity_default        = 2                 # 1 statistical, 2 semi-empirical, 3 user/external data
fidelity_sizing         = DEFAULT
fidelity_aero           = DEFAULT
fidelity_drag           = DEFAULT
fidelity_propulsion     = DEFAULT
fidelity_mass           = DEFAULT
fidelity_stability      = DEFAULT
fidelity_performance    = DEFAULT
allow_fidelity_fallback = NO
allow_generic_estimates = NO           # YES = labelled generic estimates when component data are missing
iter_max                = 50
iter_tol                = 1e-4
iter_relax              = 0.5
mass_margin             = 10 %         | src = "test fixture (synthetic)" | note = "empty-mass growth margin"
ceiling_roc_min         = 100 ft/min   | note = "service-ceiling definition; confirm convention"
report_units            = SI_PLUS_US
output_dir              = "out"
make_plots              = NO
timestamp_outputs       = YES
debug                   = NO

[trade]
enable    = NO
parameter = "design_choices.aspect_ratio"
values    = [10 12 14 16]
metric    = MTOW
Parallel-hybrid runway UAV (F4) | MADETOOL by ALATES