Configuration API Reference¶
XML configuration loading and engine/entity configuration.
Header: jaguar/interface/config.h
EngineConfig¶
Engine-wide configuration settings.
struct EngineConfig {
// Simulation
Real time_step{0.01}; // Integration step (s)
SizeT max_entities{10000}; // Maximum entities
CoordinateFrame coordinate_frame{CoordinateFrame::ECEF};
// Threading
int physics_threads{-1}; // -1 = auto-detect
int io_threads{2};
bool work_stealing{true};
// Terrain
bool terrain_enabled{true};
SizeT terrain_cache_mb{2048};
int terrain_tile_size{256};
std::vector<std::string> terrain_data_paths;
// Atmosphere
std::string atmosphere_model{"us_standard_1976"};
bool weather_enabled{true};
// Network (DIS)
bool dis_enabled{false};
int dis_port{3000};
int dis_site_id{1};
int dis_app_id{1};
std::string dis_address{"239.1.2.3"};
// Network (HLA)
bool hla_enabled{false};
std::string hla_federation;
std::string hla_federate;
std::string hla_fom_path;
// Static methods
static EngineConfig load(const std::string& path);
static EngineConfig defaults();
bool save(const std::string& path) const;
bool validate() const;
};
XML Format¶
<?xml version="1.0" encoding="UTF-8"?>
<engine_config version="1.0">
<simulation>
<time_step>0.01</time_step>
<max_entities>10000</max_entities>
<coordinate_frame>ECEF</coordinate_frame>
</simulation>
<threading>
<physics_threads>-1</physics_threads>
<io_threads>2</io_threads>
<work_stealing>true</work_stealing>
</threading>
<terrain enabled="true">
<cache_mb>2048</cache_mb>
<tile_size>256</tile_size>
<data_path>/data/dted/</data_path>
<data_path>/data/srtm/</data_path>
</terrain>
<atmosphere>
<model>us_standard_1976</model>
<weather_enabled>true</weather_enabled>
</atmosphere>
<network>
<dis enabled="false">
<port>3000</port>
<site_id>1</site_id>
<app_id>1</app_id>
</dis>
<hla enabled="false">
<federation>MyFederation</federation>
<federate>JaguarEngine</federate>
</hla>
</network>
</engine_config>
Example¶
// Load from file
auto cfg = config::EngineConfig::load("config/engine.xml");
// Or create programmatically
config::EngineConfig cfg;
cfg.time_step = 0.005; // 200 Hz
cfg.physics_threads = 8;
cfg.terrain_enabled = true;
cfg.terrain_cache_mb = 4096;
cfg.terrain_data_paths.push_back("/data/terrain/");
// Validate
if (!cfg.validate()) {
std::cerr << "Invalid configuration\n";
}
// Initialize engine
Engine engine;
engine.initialize(cfg);
// Save for later
cfg.save("config/my_config.xml");
EntityConfig¶
Entity definition configuration.
struct EntityConfig {
std::string name;
Domain domain{Domain::Generic};
// Mass properties
Real empty_mass{0.0}; // kg
Real fuel_capacity{0.0}; // kg
Vec3 cg_location{0, 0, 0}; // m
Mat3x3 inertia{}; // kg·m²
// Geometry
Real wingspan{0.0}; // m
Real length{0.0}; // m
Real height{0.0}; // m
Real reference_area{0.0}; // m²
Real reference_chord{0.0}; // m
// Component flags
ComponentMask components{0};
// Path to aerodynamics data (if any)
std::string aero_data_path;
// Path to propulsion data (if any)
std::string propulsion_data_path;
// Static methods
static EntityConfig load(const std::string& path);
};
Aircraft XML¶
<?xml version="1.0" encoding="UTF-8"?>
<entity type="aircraft" name="F-16C">
<description>General Dynamics F-16C</description>
<metrics>
<wingspan unit="ft">32.8</wingspan>
<length unit="ft">49.5</length>
<height unit="ft">16.7</height>
<wing_area unit="ft2">300.0</wing_area>
<wing_chord unit="ft">11.32</wing_chord>
</metrics>
<mass_balance>
<empty_weight unit="lbs">19700</empty_weight>
<fuel_capacity unit="lbs">6972</fuel_capacity>
<center_of_gravity unit="in">
<x>180.0</x>
<y>0.0</y>
<z>0.0</z>
</center_of_gravity>
<inertia unit="slug*ft2">
<ixx>9496</ixx>
<iyy>55814</iyy>
<izz>63100</izz>
<ixz>982</ixz>
</inertia>
</mass_balance>
<aerodynamics>
<!-- Aerodynamic tables -->
</aerodynamics>
<propulsion>
<engine type="turbofan" name="F110-GE-129">
<max_thrust unit="lbf">17000</max_thrust>
<afterburner_thrust unit="lbf">29000</afterburner_thrust>
</engine>
</propulsion>
<flight_control>
<!-- FCS definition -->
</flight_control>
</entity>
Ground Vehicle XML¶
<?xml version="1.0" encoding="UTF-8"?>
<entity type="ground_vehicle" name="M1A2">
<metrics>
<length unit="m">9.77</length>
<width unit="m">3.66</width>
<height unit="m">2.44</height>
</metrics>
<mass_balance>
<combat_weight unit="kg">62000</combat_weight>
<fuel_capacity unit="L">1900</fuel_capacity>
<inertia unit="kg*m2">
<ixx>50000</ixx>
<iyy>200000</iyy>
<izz>220000</izz>
</inertia>
</mass_balance>
<tracks>
<track_width unit="m">0.63</track_width>
<track_length unit="m">4.6</track_length>
<sprocket_radius unit="m">0.33</sprocket_radius>
</tracks>
<suspension type="torsion_bar">
<road_wheels_per_side>7</road_wheels_per_side>
<spring_rate unit="N/m">300000</spring_rate>
<damping_rate unit="N*s/m">30000</damping_rate>
</suspension>
</entity>
Ship XML¶
<?xml version="1.0" encoding="UTF-8"?>
<entity type="surface_ship" name="DDG-51">
<metrics>
<length unit="m">154.0</length>
<beam unit="m">20.0</beam>
<draft unit="m">9.4</draft>
</metrics>
<mass_balance>
<displacement unit="tonnes">8600</displacement>
<metacentric_height unit="m">2.5</metacentric_height>
</mass_balance>
<hydrodynamics>
<hull_coefficients>
<x_vv>-0.04</x_vv>
<y_v>-0.4</y_v>
<n_v>-0.1</n_v>
</hull_coefficients>
<rudder>
<area unit="m2">18.0</area>
<max_angle unit="deg">35</max_angle>
</rudder>
<propeller>
<diameter unit="m">5.2</diameter>
<max_rpm>180</max_rpm>
</propeller>
</hydrodynamics>
</entity>
Spacecraft XML¶
<?xml version="1.0" encoding="UTF-8"?>
<entity type="spacecraft" name="GPS-IIR">
<mass_balance>
<dry_mass unit="kg">1080</dry_mass>
<fuel_mass unit="kg">350</fuel_mass>
</mass_balance>
<aerodynamics>
<drag_coefficient>2.2</drag_coefficient>
<cross_section unit="m2">10.0</cross_section>
</aerodynamics>
<srp>
<reflectivity>0.8</reflectivity>
<area unit="m2">15.0</area>
</srp>
<orbit>
<semi_major_axis unit="km">26560</semi_major_axis>
<eccentricity>0.0</eccentricity>
<inclination unit="deg">55.0</inclination>
</orbit>
</entity>
ConfigLoader¶
Configuration file loading and path management.
class ConfigLoader {
public:
// Add search paths
void add_search_path(const std::string& path);
void clear_search_paths();
// Find file in search paths
std::string find_file(const std::string& filename) const;
bool file_exists(const std::string& filename) const;
// Load configurations
EngineConfig load_engine_config(const std::string& path);
EntityConfig load_entity_config(const std::string& path);
// Load aerodynamic tables
std::unique_ptr<domain::air::AeroTable> load_aero_table(
const std::string& path);
// Load material database
std::vector<domain::land::SoilProperties> load_soil_database(
const std::string& path);
};
Example¶
config::ConfigLoader loader;
// Add search paths
loader.add_search_path("/opt/jaguar/data/");
loader.add_search_path("./data/");
loader.add_search_path(std::getenv("JAGUAR_DATA"));
// Load engine config
auto engine_cfg = loader.load_engine_config("config/engine.xml");
// Load entity configs
auto f16_cfg = loader.load_entity_config("aircraft/f16.xml");
auto tank_cfg = loader.load_entity_config("vehicles/m1a2.xml");
// Create entities from config
EntityId f16 = engine.create_entity_from_config(f16_cfg);
EntityId tank = engine.create_entity_from_config(tank_cfg);
Unit System¶
Configuration files support multiple units with automatic conversion.
| Quantity | Supported Units |
|---|---|
| Length | m, ft, in, cm, mm, km, nm (nautical mile) |
| Mass | kg, lbs, slug, g |
| Force | N, lbf, kN |
| Angle | rad, deg |
| Area | m2, ft2, in2 |
| Velocity | m/s, ft/s, kts, km/h, mph |
| Inertia | kg*m2, slug*ft2 |
| Pressure | Pa, psi, atm, bar, hPa |
| Temperature | K, C, F |
| Time | s, ms, min, hr |
Example¶
<!-- All internally converted to SI -->
<wingspan unit="ft">32.8</wingspan> <!-- → 10.0 m -->
<mass unit="lbs">19700</mass> <!-- → 8936 kg -->
<angle unit="deg">45.0</angle> <!-- → 0.785 rad -->
<velocity unit="kts">250</velocity> <!-- → 128.6 m/s -->
See Also¶
- API Overview - Complete API index
- Getting Started - Quick start guide
- Engine Setup - First simulation