sysand add ode4hera/architecture-design 2.0.0
2.0.0.
The latest stable version is
2.0.1.
This library adds concepts for modeling architecture design problems to enable the automatic generation, evaluation and optimization of system architectures.
Following concepts are added:
This library has been developed as part of the ODE4HERA project: https://www.ode4hera.eu/
An architecture design space might look like this:
private import ArchitectureDesign::*;
#architectureDesignSpace part def PropulsionSystemDesignSpace {
// System-level objective
#minObj attribute mass :> ISQ::mass
= turboprop.mass + fuelSystem.fuelTank.mass;
action generateThrust :> boundaryFunctions {
// Static input
attribute seaLevelthrust :> ISQ::force = 150e3[SI::N]; }
// Part instantiation choice: between 2 and 4 times
part turboprop[2..4] {
// Function performance: this part can be used to fulfill the function
perform generateThrust;
// Function induction: if this part is selected,
// the following functions also are selected and need to be fulfilled
#needsAction ::> provideFuel;
// Design variables
#intX attribute nrStages { :>> lowerBound = 1; :>> upperBound = 3; }
#catX attribute bladeManufacturer { :>> values = ("MT", "Sensenich"); }
#contX attribute pressureRatio { :>> lowerBound = 10; :>> upperBound = 30; }
// Objective, constraint and output metric
#minObj attribute tsfc;
#con attribute turbineTemp {
assert constraint { that <= 1500[SI::'°C_abs'] }
}
attribute mass :> ISQ::mass;
}
action provideFuel;
// Subsystem instantiation choice: 1 or 2 times
#subsystem part fuelSystem[1..2] {
// Independent part instantiation choice
part fuelTank[1..2] {
perform provideFuel;
attribute mass :> ISQ::mass; }
}
}
An architecture instance generated from this design space might then look like this:
#architecture part def SimpleArchitecture :> PropulsionSystemDesignSpace {
// Output parameters have no value initially:
// the values should be assigned by the architecture evaluation
attribute :>> mass;
action :>> generateThrust[1];
part :>> turboprop[2] = (turboprop_1, turboprop_2);
part turboprop_1 :> turboprop {
perform generateThrust;
#needsAction ::> provideFuel;
attribute :>> nrStages = 2;
attribute :>> bladeManufacturer = "MT";
attribute :>> pressureRatio = 25;
attribute :>> tsfc;
attribute :>> turbineTemp;
attribute :>> mass;
}
part turboprop_2 :> turboprop {
perform generateThrust;
#needsAction ::> provideFuel;
attribute :>> nrStages = 3;
attribute :>> bladeManufacturer = "MT";
attribute :>> pressureRatio = 15;
attribute :>> tsfc;
attribute :>> turbineTemp;
attribute :>> mass;
}
action :>> provideFuel[1];
#subsystem part :>> fuelSystem[1] {
part :>> fuelTank[1] {
perform provideFuel;
attribute :>> mass;
}
}
}
For more examples, have a look at the models in the examples folder.
A more complete example, including optimization results, can be found here: https://github.com/jbussemaker/GNC-SysML-v2-Demo
If you use this library and/or if you want to know more about the background, please refer to and cite:
Bussemaker, J.H. et al., 2026, April. System Architecture Optimization Using SysML v2: Language Extension and Implementation. IEEE SysCon 2026, Halifax, Canada. doi: 10.1109/SysCon66367.2026.11503593