Example PRD

Series-hybrid lift+cruise VTOL (F3)

Propulsion code 3 with lift+cruise VTOL; synthetic fixture values.

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

# =============================================================================
#  MADETOOL - Product Requirements Document (PRD)                  format 1.5
# =============================================================================
#  INTEGRATION TEST FIXTURE F3 (decision R6-05, Stage 3): series-hybrid lift+cruise VTOL
#  (propulsion code 3 x VTOL code 1, vtol.lift_energy = GENERATOR: the lift motors are on
#  the series-hybrid bus), Group 2 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 relaxed starter
#  fixture PRD_LPC20_relaxed.txt (same airframe class). The engine-generator sustains
#  cruise and loiter and charges the pack; the pack covers hover and transition peaks.
#  Propulsion data: components_serhyb_vtol.txt is PE's WO-PE-16 file
#  (data/propulsion/examples/SYNTHETIC_F3_series_hybrid_vtol_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-F3-SERHYB-VTOL (series-hybrid lift+cruise VTOL; integration fixture F3)"
mission_role     = "ISR - EO/IR gimbal, day and night"
description      = "Integration test fixture F3 for propulsion code 3 and VTOL code 1. Not a requirement set."
propulsion_code  = 3                     # 1..7  (docs/03_CODES.md)
propulsion_label = SERIES_HYBRID         # optional cross-check of the code
vtol_code        = 1                     # 0..5
vtol_label       = LIFT_PLUS_CRUISE      # 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              = SKIDS

[payload]
mass_max    >= 3.0 kg          | type = MINIMUM | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05"
mass_normal =  3.0 kg          | src = "test fixture (synthetic)" | note = "R6-05"
volume      >= TBD             | type = MINIMUM | prio = 3 | src = "test fixture (synthetic)"
dims        =  [250 180 160] mm  | src = "test fixture (synthetic)"
power_avg   =  30 W            | src = "test fixture (synthetic)"
power_peak  =  60 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       >= 4.0 h       | type = MINIMUM | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05"
range           >= 150 km      | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)" | note = "R6-05"
speed_max_level >= 32 m/s TAS  | alt = CRUISE | isa_dev = 0 K | type = MINIMUM | prio = 2 | src = "test fixture (synthetic)" | note = "R6-05"
speed_cruise    =  25 m/s TAS  | alt = CRUISE | isa_dev = 0 K | type = TARGET | tol = 5 % | prio = 2 | src = "test fixture (synthetic)" | note = "R6-05"
speed_stall     <= 16 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          <= 55 lb             | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05, R7-15: DoD Group 2 upper weight 55 lb = 24.95 kg (25 kg would allow Group 3 by weight)"
wingspan      <= 4.0 m             | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05"
length        <= 2.5 m             | type = PREFERENCE | prio = 4 | src = "test fixture (synthetic)"
height        <= NONE              | type = PREFERENCE | prio = 5 | src = "test fixture (synthetic)"

[launch_recovery]
takeoff_method  = VTOL               # VTOL RUNWAY HAND CATAPULT BUNGEE ROCKET_ASSIST VEHICLE_ROOF
recovery_method = VTOL               # VTOL RUNWAY BELLY PARACHUTE NET DEEP_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   = NONE
runway_surface  = NONE

[vtol]
lift_energy         = GENERATOR       # SHARED_BATTERY DEDICATED_BATTERY GENERATOR (R6-05: lift motors on the series-hybrid bus)
n_lift_rotors       = 4
lift_rotor_diameter = 0.56 m     | src = "test fixture (synthetic)" | note = "22 in; AUTO = largest rotor that fits (rotor_clearance) or the rotor at disk_loading_max"
rotor_clearance     = 0.05 m     | src = "test fixture (synthetic)" | note = "plan-view clearance of the rotor disks (rotor-fit rule); AERO 0.3.1 has no built-in value (R3-11, CR-AERO-09)"
hover_tw_min        >= 1.5      | type = HARD_LIMIT | prio = 1 | src = "test fixture (synthetic)" | note = "R6-05; max lift thrust / weight, site hot day"
disk_loading_max    <= NONE     | type = PREFERENCE | prio = 5 | src = "test fixture (synthetic)"

[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)"
vertical_climb_rate   = 2.0 m/s         | src = "test fixture (synthetic)"
vertical_descent_rate = 1.0 m/s         | src = "test fixture (synthetic)"
headwind             = 0 m/s            # 0 = still-air range
warmup_time          = 3 min            | src = "test fixture (synthetic)" | note = "engine-generator warm-up before the vertical take-off"
hover_time_takeoff   = 30 s             | src = "test fixture (synthetic)"
hover_time_landing   = 45 s             | src = "test fixture (synthetic)"
hover_height         = 20 m AGL         | src = "test fixture (synthetic)"
transition_time_fwd  = 15 s             | src = "test fixture (synthetic)"
transition_time_back = 20 s             | 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      = 30 s          | src = "test fixture (synthetic)"
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]
# Code 3: the engine of the engine-generator set (PE engine.*, generator.*).
mass         = AUTO               # components file: engine.spec_power_Wkg
power_max_sl = AUTO               # PE: sustains the cruise-point bus power at cruise altitude (PROP_HYBRID_LOAD_FOLLOWING)
bsfc         = 600 g/kWh          | src = "test fixture (synthetic)" | note = "small two-stroke class value"

[component.battery]
# High-power pack: hover and transition peaks above the generator rating, 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)"
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]
mass           = AUTO
power_max_cont = AUTO
kv             = AUTO
efficiency_max = AUTO

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

[component.lift_motor]
mass           = AUTO
power_max_cont = AUTO
kv             = AUTO
efficiency_max = AUTO

[component.lift_rotor]
blades          = 2
figure_of_merit = 0.60          | src = "test fixture (synthetic)"
mass            = AUTO

[component.esc]
efficiency = AUTO

[component.avionics]
mass  = 0.8 kg                  | src = "test fixture (synthetic)"
power = 25 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_serhyb_vtol.txt"   # PE format; SYNTHETIC test values
aero_data             = "aero_serhyb_vtol.txt"         # AERO format; SYNTHETIC test values
layout                = "layout_serhyb_vtol.txt"       # MSC format; SYNTHETIC test values

[design_choices]
mtow_guess      = 22 kg         | note = "iteration start value only"
wing_loading    = AUTO
aspect_ratio    = AUTO
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    <= 2.1 m     | type = HARD_LIMIT | prio = 2 | src = "test fixture (synthetic)" | note = "mould / oven size; 2.1 m so that a 4 m wing is built in two halves"

[classification]
dod_group          <= 2         | 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
Series-hybrid lift+cruise VTOL (F3) | MADETOOL by ALATES