From 8f6a67782ee63486dee48b389ba0d47aa2f20482 Mon Sep 17 00:00:00 2001 From: JKRT Date: Mon, 12 Oct 2026 16:50:44 +0200 Subject: [PATCH 1/2] MSL 4.1.0: experiment list, registry, reference data and the installed library - models/experiments_Modelica_4.1.0.txt: the 534 experiment models, from omc. - models/models_4.1.0.toml: seeded from the 3.2.3 registry (solver and tolerance settings of the models with the same name, no status marks). - reference/download_refs.sh --msl 4.1.0: MAP-LIB v4.1.0 into reference/4.1.0/. - default_models_path(version), reference_dir(models_path, version): 3.2.3 keeps the top-level files, another version has its own. - run_coverage and the rerun/report helpers: the library version follows msl_version; the workers get the version's reference data. - Workers: an MSL OMFrontend does not bundle is the installed library (OM.loadInstalledLibrary). Assisted-by: Claude Opus 5.5 --- .gitignore | 2 + models/experiments_Modelica_4.1.0.txt | 534 ++++++++++++++++++ models/models_4.1.0.toml | 774 ++++++++++++++++++++++++++ reference/download_refs.sh | 34 +- scripts/run_full_coverage.jl | 9 +- src/registry.jl | 34 ++ src/report.jl | 4 +- src/rerun_failed.jl | 19 +- src/runner.jl | 35 +- test/registryTests.jl | 25 +- 10 files changed, 1442 insertions(+), 28 deletions(-) create mode 100644 models/experiments_Modelica_4.1.0.txt create mode 100644 models/models_4.1.0.toml diff --git a/.gitignore b/.gitignore index f0746b3..ca314c4 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ logs/ # Reference CSVs and signals (large binary/text data, fetched by download_refs.sh) reference/csv/ reference/signals/ +reference/*/csv/ +reference/*/signals/ # Editor and OS artifacts .DS_Store diff --git a/models/experiments_Modelica_4.1.0.txt b/models/experiments_Modelica_4.1.0.txt new file mode 100644 index 0000000..9717d10 --- /dev/null +++ b/models/experiments_Modelica_4.1.0.txt @@ -0,0 +1,534 @@ +Modelica.Blocks.Examples.BooleanNetwork1|10|1e-06 +Modelica.Blocks.Examples.BusUsage|2|1e-06 +Modelica.Blocks.Examples.CompareSincExpSine|1|1e-06 +Modelica.Blocks.Examples.DemoSignalCharacteristic|0.5|1e-06 +Modelica.Blocks.Examples.DemonstrateContinuousSignalExtrema|1|1e-06 +Modelica.Blocks.Examples.DemonstrateSignalExtrema|1.5|1e-06 +Modelica.Blocks.Examples.FilterWithDifferentiation|0.9|1e-06 +Modelica.Blocks.Examples.FilterWithRiseTime|4|1e-06 +Modelica.Blocks.Examples.Filter|0.9|1e-06 +Modelica.Blocks.Examples.IntegerNetwork1|10|1e-06 +Modelica.Blocks.Examples.Interaction1|10|1e-06 +Modelica.Blocks.Examples.InverseModel|1|1e-06 +Modelica.Blocks.Examples.LogicalNetwork1|10|1e-06 +Modelica.Blocks.Examples.Modulation|1|1e-06 +Modelica.Blocks.Examples.Noise.ActuatorWithNoise|8|1e-05 +Modelica.Blocks.Examples.Noise.AutomaticSeed|2|1e-06 +Modelica.Blocks.Examples.Noise.Densities|20|1e-06 +Modelica.Blocks.Examples.Noise.Distributions|2|1e-06 +Modelica.Blocks.Examples.Noise.DrydenContinuousTurbulence|100|1e-06 +Modelica.Blocks.Examples.Noise.ImpureGenerator|2|1e-06 +Modelica.Blocks.Examples.Noise.NormalNoiseProperties|20|1e-09 +Modelica.Blocks.Examples.Noise.UniformNoiseProperties|20|1e-09 +Modelica.Blocks.Examples.Noise.UniformNoise|2|1e-06 +Modelica.Blocks.Examples.PID_Controller|4|1e-06 +Modelica.Blocks.Examples.RealNetwork1|10|1e-06 +Modelica.Blocks.Examples.Rectifier12pulseFFT|0.25|1e-06 +Modelica.Blocks.Examples.Rectifier6pulseFFT|0.25|1e-06 +Modelica.Blocks.Examples.ShowLogicalSources|10|1e-06 +Modelica.Blocks.Examples.SinCosEncoder|1|1e-05 +Modelica.Blocks.Examples.SlewRateLimiter|1|1e-06 +Modelica.Blocks.Examples.TotalHarmonicDistortion|0.1|1e-06 +Modelica.Clocked.Examples.CascadeControlledDrive.AbsoluteClocks|4|1e-06 +Modelica.Clocked.Examples.CascadeControlledDrive.Continuous|4|1e-06 +Modelica.Clocked.Examples.CascadeControlledDrive.SubClocked|4|1e-06 +Modelica.Clocked.Examples.CascadeControlledDrive.SuperSampled|4|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.AssignClockVectorized|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.AssignClock|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.BackSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.Hold|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.Sample1|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.Sample2|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.SampleClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.SampleVectorizedAndClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.ShiftSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.SubSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.SuperSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.TickBasedPulse|1|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.TickBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.TimeBasedPulse|1|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.TimeBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.BooleanSignals.UpSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.ClockSignals.LogicalSample|2|1e-06 +Modelica.Clocked.Examples.Elementary.ClockSignals.RotationalSample|2|1e-06 +Modelica.Clocked.Examples.Elementary.ClockSignals.ShiftSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.ClockSignals.SubSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.ClockSignals.SuperSample|0.08|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.AssignClockVectorized|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.AssignClock|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.BackSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.Hold|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.Sample1|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.Sample2|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.SampleClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.SampleVectorizedAndClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.ShiftSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.SubSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.SuperSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.TickBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.TimeBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.IntegerSignals.UpSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.AssignClockToSquareWaveHold|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.AssignClockToTriggerHold|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.AssignClockVectorized|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.AssignClock|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.BackSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.FractionalDelay|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.HoldWithDAeffects1|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.HoldWithDAeffects2|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.Hold|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.Sample1|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.Sample2|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.Sample3|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SampleClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SampleVectorizedAndClocked|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SampleWithADeffects|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.ShiftSample|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SubSample|0.2|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SuperSampleInterpolated|0.06|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.SuperSample|0.08|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TickBasedRamp|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TickBasedSine|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TickBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TimeBasedRamp|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TimeBasedSine|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.TimeBasedStep|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.UniformNoiseXorshift64star|1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.UniformNoise|1.1|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.UpSample1|0.09|1e-06 +Modelica.Clocked.Examples.Elementary.RealSignals.UpSample2|0.06|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.ClockedWithDiscreteController|3|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.ClockedWithDiscreteTextbookController|5|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.ClockedWithDiscretizedContinuousController|5|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.ClockedWith_AD_DA_Effects|5|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.Continuous|5|1e-06 +Modelica.Clocked.Examples.SimpleControlledDrive.ExactlyClockedWithDiscreteController|5|1e-06 +Modelica.Clocked.Examples.Systems.ControlledMixingUnit|300|1e-06 +Modelica.Clocked.Examples.Systems.EngineThrottleControl|1.1|1e-06 +Modelica.Clocked.Examples.Systems.Utilities.ComponentsMixingUnit.MixingUnitWithContinuousControl|500|1e-06 +Modelica.ComplexBlocks.Examples.ShowTransferFunction|1|1e-06 +Modelica.ComplexBlocks.Examples.TestConversionBlock|1.01|1e-06 +Modelica.Electrical.Analog.Examples.AD_DA_conversion|0.2|1e-06 +Modelica.Electrical.Analog.Examples.AmplifierWithOpAmpDetailed|0.003|2e-07 +Modelica.Electrical.Analog.Examples.CauerLowPassAnalog|60|1e-06 +Modelica.Electrical.Analog.Examples.CauerLowPassOPV|60|1e-06 +Modelica.Electrical.Analog.Examples.CauerLowPassSC|60|1e-06 +Modelica.Electrical.Analog.Examples.CharacteristicIdealDiodes|1|1e-06 +Modelica.Electrical.Analog.Examples.CharacteristicThyristors|6|1e-06 +Modelica.Electrical.Analog.Examples.ChuaCircuit|50000|1e-06 +Modelica.Electrical.Analog.Examples.CompareTransformers|50|1e-06 +Modelica.Electrical.Analog.Examples.ControlledSwitchWithArc|6|1e-06 +Modelica.Electrical.Analog.Examples.DemoPowerSupplyWithBuffer|1|1e-06 +Modelica.Electrical.Analog.Examples.DemoPowerSupply|1|1e-06 +Modelica.Electrical.Analog.Examples.DemonstrateLightning|0.001|1e-06 +Modelica.Electrical.Analog.Examples.DifferenceAmplifier|1e-08|1e-06 +Modelica.Electrical.Analog.Examples.GenerationOfFMUs|1|1e-06 +Modelica.Electrical.Analog.Examples.HeatingMOSInverter|5|1e-06 +Modelica.Electrical.Analog.Examples.HeatingNPN_NORGate|200|1e-06 +Modelica.Electrical.Analog.Examples.HeatingPNP_NORGate|200|1e-06 +Modelica.Electrical.Analog.Examples.HeatingRectifier|5|1e-06 +Modelica.Electrical.Analog.Examples.IdealTriacCircuit|2|1e-06 +Modelica.Electrical.Analog.Examples.InvertingAmp|1|1e-06 +Modelica.Electrical.Analog.Examples.Lines.CompareLineTrunks|0.004|1e-06 +Modelica.Electrical.Analog.Examples.Lines.CompareLosslessLines|2e-08|1e-06 +Modelica.Electrical.Analog.Examples.Lines.LightningLosslessTransmissionLine|0.025|1e-06 +Modelica.Electrical.Analog.Examples.Lines.LightningSegmentedTransmissionLine|0.025|1e-06 +Modelica.Electrical.Analog.Examples.Lines.SmoothStep|0.003|1e-06 +Modelica.Electrical.Analog.Examples.NandGate|1e-07|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Adder|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Comparator|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.ControlCircuit|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.DifferentialAmplifier|0.2|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Differentiator|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.HighPass|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Integrator|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.InvertingAmplifier|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.InvertingSchmittTrigger|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.LCOscillator|0.01|0.0001 +Modelica.Electrical.Analog.Examples.OpAmps.LowPass|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Multivibrator|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.NonInvertingAmplifier|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.SchmittTrigger|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.SignalGenerator|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.Subtracter|1|1e-06 +Modelica.Electrical.Analog.Examples.OpAmps.VoltageFollower|1|1e-06 +Modelica.Electrical.Analog.Examples.OvervoltageProtection|0.4|1e-06 +Modelica.Electrical.Analog.Examples.ParallelResonance|1|1e-06 +Modelica.Electrical.Analog.Examples.Rectifier|0.1|1e-06 +Modelica.Electrical.Analog.Examples.Resistor|5|1e-06 +Modelica.Electrical.Analog.Examples.ResonanceCircuits|1|1e-06 +Modelica.Electrical.Analog.Examples.SeriesResonance|1|1e-06 +Modelica.Electrical.Analog.Examples.ShowSaturatingInductor|6.2832|1e-06 +Modelica.Electrical.Analog.Examples.ShowVariableResistor|1|1e-06 +Modelica.Electrical.Analog.Examples.SimpleTriacCircuit|0.001|1e-12 +Modelica.Electrical.Analog.Examples.SwitchWithArc|2|1e-06 +Modelica.Electrical.Analog.Examples.ThyristorBehaviourTest|0.0002|1e-06 +Modelica.Electrical.Batteries.Examples.BatteryDischargeCharge|3600|1e-06 +Modelica.Electrical.Batteries.Examples.CCCV_CellRC|1200|1e-06 +Modelica.Electrical.Batteries.Examples.CCCV_Cell|1200|1e-06 +Modelica.Electrical.Batteries.Examples.CCCV_StackRC|1200|1e-06 +Modelica.Electrical.Batteries.Examples.CCCV_Stack|1200|1e-06 +Modelica.Electrical.Batteries.Examples.CCCVcharging|1200|1e-06 +Modelica.Electrical.Batteries.Examples.ShowImpedance|1|1e-06 +Modelica.Electrical.Batteries.Examples.SuperCapDischargeCharge|720|1e-06 +Modelica.Electrical.Digital.Examples.Adder4|5|1e-06 +Modelica.Electrical.Digital.Examples.BUF3S|12|1e-06 +Modelica.Electrical.Digital.Examples.Counter3|10|1e-06 +Modelica.Electrical.Digital.Examples.Counter|100|1e-06 +Modelica.Electrical.Digital.Examples.DFFREGL|25|1e-06 +Modelica.Electrical.Digital.Examples.DFFREGSRH|15|1e-06 +Modelica.Electrical.Digital.Examples.DFFREGSRL|15|1e-06 +Modelica.Electrical.Digital.Examples.DFFREG|25|1e-06 +Modelica.Electrical.Digital.Examples.DLATREGL|25|1e-06 +Modelica.Electrical.Digital.Examples.DLATREGSRH|25|1e-06 +Modelica.Electrical.Digital.Examples.DLATREGSRL|25|1e-06 +Modelica.Electrical.Digital.Examples.DLATREG|25|1e-06 +Modelica.Electrical.Digital.Examples.FlipFlop|250|1e-06 +Modelica.Electrical.Digital.Examples.FullAdder|10|1e-06 +Modelica.Electrical.Digital.Examples.HalfAdder|5|1e-06 +Modelica.Electrical.Digital.Examples.INV3S|12|1e-06 +Modelica.Electrical.Digital.Examples.MUX2x1|15|1e-06 +Modelica.Electrical.Digital.Examples.Multiplexer|250|1e-06 +Modelica.Electrical.Digital.Examples.NRXFER|12|1e-06 +Modelica.Electrical.Digital.Examples.NXFER|12|1e-06 +Modelica.Electrical.Digital.Examples.RAM|400|1e-06 +Modelica.Electrical.Digital.Examples.VectorDelay|10|1e-06 +Modelica.Electrical.Digital.Examples.WiredX|12|1e-06 +Modelica.Electrical.Machines.Examples.ControlledDCDrives.CurrentControlledDCPM|2|1e-06 +Modelica.Electrical.Machines.Examples.ControlledDCDrives.PositionControlledDCPM|2.5|1e-06 +Modelica.Electrical.Machines.Examples.ControlledDCDrives.SpeedControlledDCPM|1|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCEE_Start|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Cooling|25|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_CurrentControlled|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Drive|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_QuasiStatic|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Start|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Temperature|3|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCPM_withLosses|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCSE_SinglePhase|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DCSE_Start|2|1e-06 +Modelica.Electrical.Machines.Examples.DCMachines.DC_CompareCharacteristics|6|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_Conveyor|20|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_DCBraking|25|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_DOL|1.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_Initialize|1.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_InverterDrive|1.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_Inverter|1.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_Steinmetz|1|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_Transformer|2.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_YDarc|2.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_YD|2.5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMC_withLosses|5|1e-06 +Modelica.Electrical.Machines.Examples.InductionMachines.IMS_Start|1.5|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMEE_DOL|3|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMEE_Generator|30|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMEE_LoadDump|10|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMEE_Rectifier|1.1|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_Braking|0.8|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_CurrentSource|2|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_Inverter|1.5|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_NoLoad|0.32|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_ResistiveBraking|1|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMPM_VoltageSource|2|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMR_DOL|2.5|1e-06 +Modelica.Electrical.Machines.Examples.SynchronousMachines.SMR_Inverter|1.5|1e-06 +Modelica.Electrical.Machines.Examples.Transformers.AsymmetricalLoad|0.1|1e-06 +Modelica.Electrical.Machines.Examples.Transformers.IMC_Transformer|2.5|1e-06 +Modelica.Electrical.Machines.Examples.Transformers.Rectifier12pulse|0.1|1e-06 +Modelica.Electrical.Machines.Examples.Transformers.Rectifier6pulse|0.1|1e-06 +Modelica.Electrical.Machines.Examples.Transformers.TransformerTestbench|0.1|1e-06 +Modelica.Electrical.Polyphase.Examples.PolyphaseRectifier|0.2|1e-06 +Modelica.Electrical.Polyphase.Examples.Rectifier|0.1|1e-06 +Modelica.Electrical.Polyphase.Examples.TestSensors|0.1|1e-06 +Modelica.Electrical.Polyphase.Examples.TransformerYD|1|1e-06 +Modelica.Electrical.Polyphase.Examples.TransformerYY|1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACAC.Dimmer_RL|8|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACAC.Dimmer_R|8|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACAC.SoftStarter|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.Rectifier1Pulse.Thyristor1Pulse_R_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.Rectifier1Pulse.Thyristor1Pulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.DiodeBridge2Pulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.HalfControlledBridge2Pulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.ThyristorBridge2Pulse_DC_Drive|15|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.ThyristorBridge2Pulse_RLV_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.ThyristorBridge2Pulse_RLV|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.ThyristorBridge2Pulse_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2Pulse.ThyristorBridge2Pulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.DiodeBridge2mPulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.HalfControlledBridge2mPulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_DC_Drive|15|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_RLV_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_RLV|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2Pulse.DiodeCenterTap2Pulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2Pulse.ThyristorCenterTap2Pulse_RLV_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2Pulse.ThyristorCenterTap2Pulse_RLV|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2Pulse.ThyristorCenterTap2Pulse_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2Pulse.ThyristorCenterTap2Pulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2mPulse.DiodeCenterTap2mPulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2mPulse.ThyristorCenterTap2mPulse_RLV_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2mPulse.ThyristorCenterTap2mPulse_RLV|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2mPulse.ThyristorCenterTap2mPulse_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTap2mPulse.ThyristorCenterTap2mPulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTapmPulse.DiodeCenterTapmPulse|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTapmPulse.ThyristorCenterTapmPulse_RLV_Characteristic|10|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTapmPulse.ThyristorCenterTapmPulse_RLV|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTapmPulse.ThyristorCenterTapmPulse_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.ACDC.RectifierCenterTapmPulse.ThyristorCenterTapmPulse_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.PolyphaseTwoLevel_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.PolyphaseTwoLevel_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.ThreePhaseTwoLevel_PWM|2|1e-05 +Modelica.Electrical.PowerConverters.Examples.DCAC.SinglePhaseTwoLevel.SinglePhaseTwoLevel_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCAC.SinglePhaseTwoLevel.SinglePhaseTwoLevel_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.ChopperBuckBoost.ChopperBuckBoost_DutyCycle|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.ChopperStepDown.ChopperStepDown_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.ChopperStepDown.ChopperStepDown_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.ChopperStepUp.ChopperStepUp_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_DC_Drive|24|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_RL|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_R|0.1|1e-06 +Modelica.Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_TrianglePWM_RL|0.1|1e-06 +Modelica.Electrical.QuasiStatic.Machines.Examples.TransformerTestbench|0.1|1e-06 +Modelica.Electrical.QuasiStatic.Polyphase.Examples.BalancingDelta|1|1e-06 +Modelica.Electrical.QuasiStatic.Polyphase.Examples.BalancingStar|1|1e-06 +Modelica.Electrical.QuasiStatic.Polyphase.Examples.TestSensors|0.1|1e-06 +Modelica.Electrical.QuasiStatic.Polyphase.Examples.UnsymmetricalLoad|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.MultipleResonance|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.ParallelResonance|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.Rectifier|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.SeriesBode|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.SeriesResonance|1|1e-06 +Modelica.Electrical.QuasiStatic.SinglePhase.Examples.Transformer|1|1e-06 +Modelica.Electrical.Spice3.Examples.CascodeCircuit|0.2|1e-07 +Modelica.Electrical.Spice3.Examples.CoupledInductors|0.2|1e-06 +Modelica.Electrical.Spice3.Examples.FourInverters|5|1e-06 +Modelica.Electrical.Spice3.Examples.Graetz|0.025|1e-06 +Modelica.Electrical.Spice3.Examples.InvertersApartRecord|5|1e-06 +Modelica.Electrical.Spice3.Examples.InvertersExtendedModel|5|1e-06 +Modelica.Electrical.Spice3.Examples.Inverter|1e-11|1e-07 +Modelica.Electrical.Spice3.Examples.Nand|2e-07|1e-06 +Modelica.Electrical.Spice3.Examples.Nor|5|1e-06 +Modelica.Electrical.Spice3.Examples.Oscillator|0.025|1e-06 +Modelica.Electrical.Spice3.Examples.Spice3BenchmarkDifferentialPair|1|1e-05 +Modelica.Electrical.Spice3.Examples.Spice3BenchmarkFourBitBinaryAdder|1e-06|1e-06 +Modelica.Electrical.Spice3.Examples.Spice3BenchmarkMosfetCharacterization|1e-07|1e-06 +Modelica.Electrical.Spice3.Examples.Spice3BenchmarkRtlInverter|1e-07|1e-08 +Modelica.Fluid.Examples.AST_BatchPlant.BatchPlant_StandardWater|3600|1e-06 +Modelica.Fluid.Examples.AST_BatchPlant.Test.OneTank|100|1e-06 +Modelica.Fluid.Examples.AST_BatchPlant.Test.TankWithEmptyingPipe1|35|1e-07 +Modelica.Fluid.Examples.AST_BatchPlant.Test.TankWithEmptyingPipe2|120|1e-06 +Modelica.Fluid.Examples.AST_BatchPlant.Test.TanksWithEmptyingPipe1|120|1e-06 +Modelica.Fluid.Examples.AST_BatchPlant.Test.TanksWithEmptyingPipe2|120|1e-06 +Modelica.Fluid.Examples.AST_BatchPlant.Test.TwoTanks|100|1e-06 +Modelica.Fluid.Examples.BranchingDynamicPipes|10|1e-06 +Modelica.Fluid.Examples.ControlledTankSystem.ControlledTanks|900|1e-06 +Modelica.Fluid.Examples.DrumBoiler.DrumBoiler|5400|1e-06 +Modelica.Fluid.Examples.Explanatory.MeasuringTemperature|1.1|1e-06 +Modelica.Fluid.Examples.Explanatory.MomentumBalanceFittings|1.1|1e-06 +Modelica.Fluid.Examples.HeatExchanger.HeatExchangerSimulation|200|1e-05 +Modelica.Fluid.Examples.HeatingSystem|6000|1e-06 +Modelica.Fluid.Examples.IncompressibleFluidNetwork|200|1e-06 +Modelica.Fluid.Examples.InverseParameterization|10|1e-06 +Modelica.Fluid.Examples.NonCircularPipes|1|1e-06 +Modelica.Fluid.Examples.PumpingSystem|2000|1e-06 +Modelica.Fluid.Examples.Tanks.EmptyTanks|50|1e-06 +Modelica.Fluid.Examples.Tanks.TanksWithOverflow|25000|1e-06 +Modelica.Fluid.Examples.Tanks.ThreeTanks|200|1e-06 +Modelica.Fluid.Examples.TraceSubstances.RoomCO2WithControls|86400|1e-06 +Modelica.Fluid.Examples.TraceSubstances.RoomCO2|3600|1e-06 +Modelica.Magnetic.FluxTubes.Examples.BasicExamples.QuadraticCoreAirgap|0.05|1e-06 +Modelica.Magnetic.FluxTubes.Examples.BasicExamples.SaturatedInductor|0.1|1e-07 +Modelica.Magnetic.FluxTubes.Examples.BasicExamples.ToroidalCoreAirgap|0.05|1e-06 +Modelica.Magnetic.FluxTubes.Examples.BasicExamples.ToroidalCoreQuadraticCrossSection|0.05|1e-06 +Modelica.Magnetic.FluxTubes.Examples.Hysteresis.HysteresisModelComparison|14|1e-05 +Modelica.Magnetic.FluxTubes.Examples.Hysteresis.InductorWithHysteresis|0.02|0.0001 +Modelica.Magnetic.FluxTubes.Examples.Hysteresis.SinglePhaseTransformerWithHysteresis1|0.02|1e-06 +Modelica.Magnetic.FluxTubes.Examples.Hysteresis.SinglePhaseTransformerWithHysteresis2|0.1|0.0001 +Modelica.Magnetic.FluxTubes.Examples.Hysteresis.ThreePhaseTransformerWithRectifier|0.2|1e-06 +Modelica.Magnetic.FluxTubes.Examples.MovingCoilActuator.ArmatureStroke|0.05|1e-07 +Modelica.Magnetic.FluxTubes.Examples.MovingCoilActuator.ForceCurrentBehaviour|6|1e-07 +Modelica.Magnetic.FluxTubes.Examples.MovingCoilActuator.ForceStrokeBehaviour|4|1e-07 +Modelica.Magnetic.FluxTubes.Examples.SolenoidActuator.ComparisonPullInStroke|0.05|1e-07 +Modelica.Magnetic.FluxTubes.Examples.SolenoidActuator.ComparisonQuasiStatic|10|1e-07 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.ComparisonPolyphase.IMC_DOL_CommonLeakage|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.ComparisonPolyphase.IMC_DOL_Polyphase|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.ComparisonPolyphase.IMS_Start_Polyphase|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Conveyor|20|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_DOL|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Initialize|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Inverter|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Steinmetz|1|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Transformer|2.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_YD|2.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_withLosses|5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMS_Start|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.ComparisonPolyphase.SMEE_Generator_Polyphase|30|1e-07 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.ComparisonPolyphase.SMPM_Inverter_Polyphase|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.ComparisonPolyphase.SMR_Inverter_Polyphase|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_DOL|3|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_Generator|30|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_LoadDump|10|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_Rectifier|1.1|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_Braking|0.8|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_CurrentSource|2|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_Inverter|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_VoltageSource|2|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMR_Inverter|1.5|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.Components.EddyCurrentLosses|40|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.Components.PolyphaseInductance|100|1e-06 +Modelica.Magnetic.FundamentalWave.Examples.Components.SinglePhaseInductance|100|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.BasicExamples.QuadraticCoreAirgap|0.05|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.BasicExamples.ToroidalCoreAirgap|0.05|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.BasicExamples.ToroidalCoreQuadraticCrossSection|0.05|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.FixedShapes.CuboidSections|1|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.FixedShapes.CylinderSections|1|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.Leakage.CylinderLeakage|1|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.Leakage.GeneralLeakage|1|1e-06 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.LinearInductor|0.2|1e-07 +Modelica.Magnetic.QuasiStatic.FluxTubes.Examples.NonLinearInductor|0.2|1e-07 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Characteristics|1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Conveyor|20|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_DOL|1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Initialize|1.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Inverter|1.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_Transformer|2.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_YD|2.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMC_withLosses|10|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMS_Characteristics|1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.InductionMachines.IMS_Start|1.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_Generator|30|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_CurrentSource|2|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_FieldWeakening|2.5|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_MTPA|1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_Mains|1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_OpenCircuit|0.1|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMR_CurrentSource|2|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.Components.EddyCurrentLosses|40|1e-06 +Modelica.Magnetic.QuasiStatic.FundamentalWave.Examples.Components.PolyphaseInductance|100|1e-06 +Modelica.Math.FastFourierTransform.Examples.RealFFT1|6|1e-06 +Modelica.Math.FastFourierTransform.Examples.RealFFT2|6|1e-06 +Modelica.Math.Nonlinear.Examples.QuadratureLobatto3|5|1e-06 +Modelica.Math.Random.Examples.GenerateRandomNumbers|2|1e-06 +Modelica.Mechanics.MultiBody.Examples.Constraints.PrismaticConstraint|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Constraints.RevoluteConstraint|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Constraints.SphericalConstraint|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Constraints.UniversalConstraint|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.DoublePendulumInitTip|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.DoublePendulum|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.ForceAndTorque|1.01|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.FreeBody|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.HeatLosses|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.InitSpringConstant|1.01|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.LineForceWithTwoMasses|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.PendulumWithSpringDamper|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.Pendulum|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.PointGravityWithPointMasses2|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.PointGravityWithPointMasses|2|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.PointGravity|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.RollingWheelSetDriving|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.RollingWheelSetPulling|3|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.RollingWheel|4|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.SpringDamperSystem|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.SpringMassSystem|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.SpringWithMass|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.Surfaces|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.ThreeSprings|10|1e-06 +Modelica.Mechanics.MultiBody.Examples.Elementary.UserDefinedGravityField|10|1e-08 +Modelica.Mechanics.MultiBody.Examples.Loops.Engine1a|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.Engine1b_analytic|0.5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.Engine1b|0.5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.EngineV6_analytic|1.01|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.EngineV6|1.01|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.Fourbar1|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.Fourbar2|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.Fourbar_analytic|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.PlanarFourbar|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Loops.PlanarLoops_analytic|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.ActuatedDrive|1.1|1e-06 +Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.BevelGear1D|1|1e-06 +Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.GearConstraint|5|1e-06 +Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.GyroscopicEffects|5|1e-08 +Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.MovingActuatedDrive|1.1|1e-06 +Modelica.Mechanics.MultiBody.Examples.Systems.RobotR3.FullRobot|2|1e-06 +Modelica.Mechanics.MultiBody.Examples.Systems.RobotR3.OneAxis|1.6|1e-06 +Modelica.Mechanics.Rotational.Examples.Backlash|1|1e-06 +Modelica.Mechanics.Rotational.Examples.CompareBrakingTorque|5|1e-06 +Modelica.Mechanics.Rotational.Examples.CoupledClutches|1.5|1e-06 +Modelica.Mechanics.Rotational.Examples.EddyCurrentBrake|1|1e-06 +Modelica.Mechanics.Rotational.Examples.ElasticBearing|10|1e-06 +Modelica.Mechanics.Rotational.Examples.FirstGrounded|1|1e-06 +Modelica.Mechanics.Rotational.Examples.First|1|1e-06 +Modelica.Mechanics.Rotational.Examples.Friction|3|1e-06 +Modelica.Mechanics.Rotational.Examples.GenerationOfFMUs|1|1e-06 +Modelica.Mechanics.Rotational.Examples.HeatLosses|1|1e-06 +Modelica.Mechanics.Rotational.Examples.LossyGearDemo1|0.5|1e-06 +Modelica.Mechanics.Rotational.Examples.LossyGearDemo2|0.5|1e-06 +Modelica.Mechanics.Rotational.Examples.LossyGearDemo3|1|1e-06 +Modelica.Mechanics.Rotational.Examples.OneWayClutchDisengaged|2|1e-06 +Modelica.Mechanics.Rotational.Examples.OneWayClutch|2|1e-06 +Modelica.Mechanics.Rotational.Examples.RollingWheel|5|1e-06 +Modelica.Mechanics.Rotational.Examples.SimpleGearShift|5|1e-06 +Modelica.Mechanics.Translational.Examples.Accelerate|1|1e-06 +Modelica.Mechanics.Translational.Examples.Brake|2|1e-06 +Modelica.Mechanics.Translational.Examples.CompareBrakingForce|5|1e-06 +Modelica.Mechanics.Translational.Examples.Damper|1|1e-06 +Modelica.Mechanics.Translational.Examples.EddyCurrentBrake|1|1e-06 +Modelica.Mechanics.Translational.Examples.ElastoGap|5|1e-06 +Modelica.Mechanics.Translational.Examples.Friction|5|1e-06 +Modelica.Mechanics.Translational.Examples.GenerationOfFMUs|1|1e-06 +Modelica.Mechanics.Translational.Examples.HeatLosses|2|1e-06 +Modelica.Mechanics.Translational.Examples.InitialConditions|5|1e-06 +Modelica.Mechanics.Translational.Examples.Oscillator|1|1e-06 +Modelica.Mechanics.Translational.Examples.PreLoad|100|1e-06 +Modelica.Mechanics.Translational.Examples.Sensors|1|1e-06 +Modelica.Mechanics.Translational.Examples.SignConvention|1|1e-06 +Modelica.Mechanics.Translational.Examples.Vehicle|60|1e-06 +Modelica.Mechanics.Translational.Examples.WhyArrows|1|1e-06 +Modelica.Media.Examples.IdealGasH2O|1|1e-06 +Modelica.Media.Examples.MixtureGases|1|1e-06 +Modelica.Media.Examples.MoistAir|1|1e-05 +Modelica.Media.Examples.PsychrometricData|1|1e-06 +Modelica.Media.Examples.R134a.R134a1|1.01|1e-06 +Modelica.Media.Examples.R134a.R134a2|1.01|1e-06 +Modelica.Media.Examples.ReferenceAir.DryAir1|1.01|1e-06 +Modelica.Media.Examples.ReferenceAir.DryAir2|1.01|1e-06 +Modelica.Media.Examples.ReferenceAir.Inverse_sh_TX|1|1e-06 +Modelica.Media.Examples.ReferenceAir.Inverse_sh_T|1|1e-06 +Modelica.Media.Examples.ReferenceAir.MoistAir1|1.01|1e-06 +Modelica.Media.Examples.ReferenceAir.MoistAir2|1.01|1e-06 +Modelica.Media.Examples.ReferenceAir.MoistAir|1|1e-05 +Modelica.Media.Examples.SimpleLiquidWater|100|1e-06 +Modelica.Media.Examples.SolveOneNonlinearEquation.InverseIncompressible_sh_T|1|1e-06 +Modelica.Media.Examples.SolveOneNonlinearEquation.Inverse_sh_TX|1|1e-06 +Modelica.Media.Examples.SolveOneNonlinearEquation.Inverse_sh_T|1|1e-06 +Modelica.Media.Examples.SolveOneNonlinearEquation.Inverse_sine|0|1e-06 +Modelica.Media.Examples.TwoPhaseWater.TestTwoPhaseStates|22|1e-06 +Modelica.Media.Examples.WaterIF97|1|1e-06 +Modelica.Media.Incompressible.Examples.TestGlycol|1.01|1e-06 +Modelica.StateGraph.Examples.ControlledTanks|100|1e-06 +Modelica.StateGraph.Examples.ExecutionPaths|15.5|1e-06 +Modelica.StateGraph.Examples.FirstExample_Variant2|5.5|1e-06 +Modelica.StateGraph.Examples.FirstExample_Variant3|5.5|1e-06 +Modelica.StateGraph.Examples.FirstExample|5.5|1e-06 +Modelica.StateGraph.Examples.ShowCompositeStep|15|1e-06 +Modelica.StateGraph.Examples.ShowExceptions|20|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.IndirectCooling|1.5|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.OneMass|1|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.ParallelCooling|1|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.ParallelPumpDropOut|2|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.PumpAndValve|2|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.PumpDropOut|2|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.SimpleCooling|1|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.TestCylinder|2|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.TestOpenTank|1.5|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.TwoMass|1|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.TwoTanks|1.5|1e-06 +Modelica.Thermal.FluidHeatFlow.Examples.WaterPump|2|1e-06 +Modelica.Thermal.HeatTransfer.Examples.ControlledTemperature|10|1e-06 +Modelica.Thermal.HeatTransfer.Examples.GenerationOfFMUs|1|1e-06 +Modelica.Thermal.HeatTransfer.Examples.Motor|7200|1e-06 +Modelica.Thermal.HeatTransfer.Examples.TwoMasses|1|1e-06 +Modelica.Utilities.Examples.ReadRealMatrixFromFile|0.1|1e-06 +Modelica.Utilities.Examples.WriteRealMatrixToFile|0.1|1e-06 +Modelica.Utilities.Examples.readRealParameterModel|1.01|1e-06 diff --git a/models/models_4.1.0.toml b/models/models_4.1.0.toml new file mode 100644 index 0000000..1e88c46 --- /dev/null +++ b/models/models_4.1.0.toml @@ -0,0 +1,774 @@ +# OM.jl MSL 4.1.0 coverage model registry: per-model overrides, as models/models.toml for 3.2.3. +# The model list comes from omc (models/experiments_Modelica_4.1.0.txt), the reference data from +# MAP-LIB_ReferenceResults v4.1.0 (reference/download_refs.sh --msl 4.1.0, into reference/4.1.0/). +# +# Seeded 2026-10-12 from models/models.toml: for the 4.1.0 models with a 3.2.3 entry of the same +# name, its solver and tolerance settings, inline reference and a stopTime shortened below the +# experiment's. Status marks (expected, skipPhases, issue) are left out: they describe 3.2.3 runs. +# The fields are documented in models/models.toml. + +[meta] +description = "OM.jl MSL 4.1.0 coverage model registry" +msl_version = "MSL:4.1.0" +reference_source = "MAP-LIB_ReferenceResults (Dymola, branch v4.1.0)" + +[models.Apr25_Blocks_Examples_BusUsage] +atol = 2.0 +domain = "Blocks" +name = "Modelica.Blocks.Examples.BusUsage" +reltol = 0.1 + +[models.Apr25_Blocks_Examples_FilterWithDifferentiation] +atol = 0.1 +domain = "Blocks" +name = "Modelica.Blocks.Examples.FilterWithDifferentiation" +reltol = 0.05 +solver = "IDA" +stopTime = 0.01 + +[models.Apr25_Blocks_Examples_FilterWithRiseTime] +atol = 0.1 +domain = "Blocks" +name = "Modelica.Blocks.Examples.FilterWithRiseTime" +reltol = 0.1 +stopTime = 0.9 + +[models.Apr25_Blocks_Examples_SlewRateLimiter] +domain = "Blocks" +name = "Modelica.Blocks.Examples.SlewRateLimiter" +solver = "IDA" +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_HeatingPNP_NORGate] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.HeatingPNP_NORGate" +reltol = 0.01 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_InvertingAmp] +atol = 0.1 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.InvertingAmp" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_Comparator] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.Comparator" +reltol = 0.01 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_Differentiator] +atol = 0.5 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.Differentiator" +reltol = 0.05 +solver = "FBDF" +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_HighPass] +atol = 0.5 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.HighPass" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_Integrator] +atol = 0.5 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.Integrator" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_LowPass] +atol = 0.5 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.LowPass" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_Multivibrator] +atol = 4.0 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.Multivibrator" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_SchmittTrigger] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.SchmittTrigger" +reltol = 0.01 +stopTime = 0.01 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_SignalGenerator] +atol = 12.0 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.SignalGenerator" +reltol = 0.05 +stopTime = 0.5 + +[models.Apr25_Electrical_Analog_Examples_OpAmps_VoltageFollower] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.VoltageFollower" +reltol = 0.05 +stopTime = 0.01 + +[models.Apr25_Electrical_Digital_Examples_Adder4] +atol = 0.5 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.Adder4" +reltol = 0.05 + +[models.Apr25_Electrical_Digital_Examples_BUF3S] +atol = 8.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.BUF3S" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_Counter3] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.Counter3" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_DFFREG] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DFFREG" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DFFREGL] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DFFREGL" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DFFREGSRH] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DFFREGSRH" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DFFREGSRL] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DFFREGSRL" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DLATREG] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DLATREG" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DLATREGL] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DLATREGL" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DLATREGSRH] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DLATREGSRH" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_DLATREGSRL] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.DLATREGSRL" +reltol = 0.5 + +[models.Apr25_Electrical_Digital_Examples_HalfAdder] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.HalfAdder" +reltol = 0.5 +solver = "Rosenbrock23" +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_INV3S] +atol = 2.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.INV3S" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_MUX2x1] +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.MUX2x1" +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_NRXFER] +atol = 2.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.NRXFER" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_NXFER] +atol = 2.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.NXFER" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Digital_Examples_RAM] +atol = 1.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.RAM" +reltol = 0.1 + +[models.Apr25_Electrical_Digital_Examples_WiredX] +atol = 5.0 +domain = "Electrical.Digital" +name = "Modelica.Electrical.Digital.Examples.WiredX" +reltol = 0.5 +stopTime = 1.0 + +[models.Apr25_Electrical_Machines_Examples_ControlledDCDrives_CurrentControlledDCPM] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.ControlledDCDrives.CurrentControlledDCPM" +reltol = 0.1 + +[models.Apr25_Electrical_Machines_Examples_ControlledDCDrives_SpeedControlledDCPM] +atol = 12.0 +domain = "Electrical.Machines" +dtmax = 0.0001 +name = "Modelica.Electrical.Machines.Examples.ControlledDCDrives.SpeedControlledDCPM" +reltol = 0.1 +stopTime = 0.5 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCEE_Start] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCEE_Start" +reltol = 0.05 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCPM_CurrentControlled] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCPM_CurrentControlled" +reltol = 0.1 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCPM_Start] +atol = 12.0 +domain = "Electrical.Machines" +dtmax = 0.0001 +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Start" +reltol = 0.05 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCPM_Temperature] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCPM_Temperature" +reltol = 0.1 +stopTime = 2.0 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCPM_withLosses] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCPM_withLosses" +reltol = 0.1 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCSE_SinglePhase] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCSE_SinglePhase" +reltol = 0.05 + +[models.Apr25_Electrical_Machines_Examples_DCMachines_DCSE_Start] +atol = 12.0 +domain = "Electrical.Machines" +name = "Modelica.Electrical.Machines.Examples.DCMachines.DCSE_Start" +reltol = 0.1 + +[models.Apr25_Electrical_Spice3_Examples_CoupledInductors] +atol = 0.2 +domain = "Electrical.Spice3" +name = "Modelica.Electrical.Spice3.Examples.CoupledInductors" +reltol = 0.05 + +[models.Apr25_Magnetic_FluxTubes_Examples_MovingCoilActuator_ForceCurrentBehaviour] +atol = 0.5 +domain = "Magnetic.FluxTubes" +name = "Modelica.Magnetic.FluxTubes.Examples.MovingCoilActuator.ForceCurrentBehaviour" +reltol = 0.05 +stopTime = 0.5 + +[models.Apr25_Magnetic_FluxTubes_Examples_MovingCoilActuator_ForceStrokeBehaviour] +atol = 0.5 +domain = "Magnetic.FluxTubes" +name = "Modelica.Magnetic.FluxTubes.Examples.MovingCoilActuator.ForceStrokeBehaviour" +reltol = 0.05 +stopTime = 0.5 + +[models.Apr25_Mechanics_MultiBody_Examples_Elementary_DoublePendulumInitTip] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.DoublePendulumInitTip" +reltol = 0.3 + +[models.Apr25_Mechanics_MultiBody_Examples_Elementary_PointGravity] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.PointGravity" +reltol = 0.05 +stopTime = 1.0 + +[models.Apr25_Mechanics_MultiBody_Examples_Elementary_SpringDamperSystem] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.SpringDamperSystem" +reltol = 0.05 + +[models.Apr25_Mechanics_MultiBody_Examples_Elementary_SpringWithMass] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.SpringWithMass" +reltol = 0.05 + +[models.Apr25_Mechanics_MultiBody_Examples_Elementary_UserDefinedGravityField] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.UserDefinedGravityField" +reltol = 0.05 +stopTime = 1.1 + +[models.Apr25_Mechanics_MultiBody_Examples_Loops_Engine1b] +atol = 0.1 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.Engine1b" +reltol = 0.05 + +[models.Apr25_Mechanics_MultiBody_Examples_Loops_Engine1b_analytic] +atol = 0.1 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.Engine1b_analytic" +reltol = 0.05 + +[models.Apr25_Mechanics_MultiBody_Examples_Loops_PlanarFourbar] +atol = 0.1 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.PlanarFourbar" +reltol = 0.05 + +[models.Blocks_RealNetwork1] +domain = "Blocks" +name = "Modelica.Blocks.Examples.RealNetwork1" +stopTime = 2.0 + +[models.Blocks_Rectifier12pulseFFT] +domain = "Blocks" +name = "Modelica.Blocks.Examples.Rectifier12pulseFFT" +stopTime = 0.1 + +[models.CharacteristicIdealDiodes] +atol = 1.0 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.CharacteristicIdealDiodes" +reltol = 0.05 +solver = "FBDF" + +[models.ChuaCircuit] +atol = 5.0 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.ChuaCircuit" +reltol = 0.5 +stopTime = 5.0 + +[models.CompareTransformers] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.CompareTransformers" +reltol = 0.01 + +[models.DifferenceAmplifier] +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.DifferenceAmplifier" +solver = "QNDF" +solverAtol = 0.01 +solverReltol = 0.01 + +[models.DoublePendulum] +atol = 0.05 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.DoublePendulum" +reltol = 0.01 +stopTime = 1.0 + +[models.Engine1a] +atol = 0.1 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.Engine1a" +reltol = 0.05 +stopTime = 0.72 + +[models.Filter] +atol = 2.0 +domain = "Blocks" +name = "Modelica.Blocks.Examples.Filter" +reltol = 0.1 + +[models.FluidHeatFlow_OneMass] +atol = 0.5 +domain = "Thermal.FluidHeatFlow" +name = "Modelica.Thermal.FluidHeatFlow.Examples.OneMass" +reltol = 0.05 +stopTime = 0.2 + +[models.FluidHeatFlow_ParallelPumpDropOut] +atol = 0.5 +domain = "Thermal.FluidHeatFlow" +name = "Modelica.Thermal.FluidHeatFlow.Examples.ParallelPumpDropOut" +reltol = 0.05 +stopTime = 0.3 + +[models.FluidHeatFlow_PumpAndValve] +atol = 0.5 +domain = "Thermal.FluidHeatFlow" +name = "Modelica.Thermal.FluidHeatFlow.Examples.PumpAndValve" +reltol = 0.05 + +[models.FluidHeatFlow_PumpDropOut] +atol = 0.5 +domain = "Thermal.FluidHeatFlow" +name = "Modelica.Thermal.FluidHeatFlow.Examples.PumpDropOut" +reltol = 0.05 +stopTime = 0.3 + +[models.Fluid_HeatExchangerSimulation] +domain = "Fluid" +name = "Modelica.Fluid.Examples.HeatExchanger.HeatExchangerSimulation" +stopTime = 1.0 + +[models.FreeBody] +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.FreeBody" +stopTime = 1.0 + +[models.HeatingRectifier] +atol = 2.5 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.HeatingRectifier" +reltol = 0.1 + +[models.IdealTriacCircuit] +atol = 5.0 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.IdealTriacCircuit" +reltol = 0.1 + +[models.InverseModel] +atol = 0.01 +domain = "Blocks" +name = "Modelica.Blocks.Examples.InverseModel" +reltol = 0.01 + +[models.Magnetic_HysteresisModelComparison] +domain = "Magnetic.FluxTubes" +name = "Modelica.Magnetic.FluxTubes.Examples.Hysteresis.HysteresisModelComparison" +stopTime = 1.0 + +[models.May2026_Analog_CauerLowPassAnalog] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.CauerLowPassAnalog" +reltol = 0.01 + +[models.May2026_Analog_GenerationOfFMUs] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.GenerationOfFMUs" +reltol = 0.01 + +[models.May2026_Analog_ResonanceCircuits] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.ResonanceCircuits" +reltol = 0.01 + +[models.May2026_Electrical_Analog_Examples_OpAmps_LCOscillator] +atol = 0.05 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OpAmps.LCOscillator" +reltol = 0.05 + +[models.May2026_Magnetic_FundamentalWave_SinglePhaseInductance] +atol = 0.5 +domain = "Magnetic.FundamentalWave" +name = "Modelica.Magnetic.FundamentalWave.Examples.Components.SinglePhaseInductance" +reltol = 0.1 +stopTime = 1.0 + +[models.May2026_Math_FastFourierTransform_RealFFT1] +atol = 0.5 +domain = "Math.FastFourierTransform" +name = "Modelica.Math.FastFourierTransform.Examples.RealFFT1" +reltol = 0.1 + +[models.May2026_Math_FastFourierTransform_RealFFT2] +atol = 0.5 +domain = "Math.FastFourierTransform" +name = "Modelica.Math.FastFourierTransform.Examples.RealFFT2" +reltol = 0.1 + +[models.May2026_Math_Random_GenerateRandomNumbers] +atol = 5.0 +domain = "Math.Random" +name = "Modelica.Math.Random.Examples.GenerateRandomNumbers" +reltol = 0.3 +stopTime = 1.0 + +[models.May2026_MultiBody_Surfaces] +atol = 0.5 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.Surfaces" +reltol = 0.1 +stopTime = 0.5 + +[models.May2026_Translational_Sensors] +atol = 0.01 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.Sensors" +reltol = 0.01 + +[models.May2026_Utilities_WriteRealMatrixToFile] +atol = 0.1 +domain = "Utilities" +name = "Modelica.Utilities.Examples.WriteRealMatrixToFile" +reltol = 0.05 + +[models.Mechanics_Rotational_Examples_Backlash] +atol = 50.0 +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.Backlash" +reltol = 0.3 + +[models.Media_DryAir1] +domain = "Media" +name = "Modelica.Media.Examples.ReferenceAir.DryAir1" +stopTime = 1.0 + +[models.Media_DryAir2] +domain = "Media" +name = "Modelica.Media.Examples.ReferenceAir.DryAir2" +stopTime = 1.0 + +[models.Media_TestGlycol] +domain = "Media" +name = "Modelica.Media.Incompressible.Examples.TestGlycol" +stopTime = 1.0 + +[models.Media_TestTwoPhaseStates] +domain = "Media" +name = "Modelica.Media.Examples.TwoPhaseWater.TestTwoPhaseStates" +stopTime = 1.0 + +[models.MultiBody_EngineV6] +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.EngineV6" +stopTime = 1.0 + +[models.MultiBody_EngineV6_analytic] +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.EngineV6_analytic" +stopTime = 1.0 + +[models.MultiBody_PlanarLoops_analytic] +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Loops.PlanarLoops_analytic" +stopTime = 1.0 + +[models.Oscillator] +atol = 0.01 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.Oscillator" +reltol = 0.01 + +[models.OvervoltageProtection] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.OvervoltageProtection" +reltol = 0.01 + +[models.PID_Controller] +atol = 0.1 +domain = "Blocks" +name = "Modelica.Blocks.Examples.PID_Controller" +reltol = 0.05 +solver = "FBDF" + +[models.Pendulum] +atol = 0.01 +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.Pendulum" +reltol = 0.01 +stopTime = 1.0 + +[models.Rotational_ElasticBearing] +atol = 0.5 +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.ElasticBearing" +reltol = 0.1 + +[models.Rotational_First] +atol = 0.01 +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.First" +reltol = 0.01 + +[models.Rotational_HeatLosses] +atol = 1.0 +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.HeatLosses" +reltol = 0.05 + +[models.Rotational_LossyGearDemo1] +atol = 1.0 +domain = "Mechanics.Rotational" +initializealg = "BrownFullBasicInit" +name = "Modelica.Mechanics.Rotational.Examples.LossyGearDemo1" +reltol = 0.1 + +[models.Rotational_OneWayClutchDisengaged] +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.OneWayClutchDisengaged" +solverReltol = 1.0e-8 + +[models.Rotational_RollingWheel] +atol = 5.0 +domain = "Mechanics.Rotational" +name = "Modelica.Mechanics.Rotational.Examples.RollingWheel" +reltol = 0.05 +stopTime = 1.0 + +[models.ShowSaturatingInductor] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.ShowSaturatingInductor" +reltol = 0.01 + +[models.ShowVariableResistor] +atol = 0.01 +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.ShowVariableResistor" +reltol = 0.01 + +[models.SignConvention] +atol = 0.01 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.SignConvention" +reltol = 0.01 + +[models.SimpleTriacCircuit] +domain = "Electrical.Analog" +name = "Modelica.Electrical.Analog.Examples.SimpleTriacCircuit" +solver = "IDA" + +[models.StateGraph_ExecutionPaths] +domain = "StateGraph" +name = "Modelica.StateGraph.Examples.ExecutionPaths" +stopTime = 15.0 + +[models.StateGraph_FirstExample] +domain = "StateGraph" +name = "Modelica.StateGraph.Examples.FirstExample" +stopTime = 5.0 + +[models.StateGraph_FirstExample_Variant2] +domain = "StateGraph" +name = "Modelica.StateGraph.Examples.FirstExample_Variant2" +stopTime = 5.0 + +[models.StateGraph_FirstExample_Variant3] +domain = "StateGraph" +name = "Modelica.StateGraph.Examples.FirstExample_Variant3" +stopTime = 5.0 + +[models.StateGraph_ShowCompositeStep] +domain = "StateGraph" +name = "Modelica.StateGraph.Examples.ShowCompositeStep" +stopTime = 5.0 + +[models.Thermal_ControlledTemperature] +atol = 2.0 +domain = "Thermal.HeatTransfer" +name = "Modelica.Thermal.HeatTransfer.Examples.ControlledTemperature" +reltol = 0.2 +stopTime = 0.5 + +[models.Thermal_GenerationOfFMUs] +atol = 0.5 +domain = "Thermal.HeatTransfer" +name = "Modelica.Thermal.HeatTransfer.Examples.GenerationOfFMUs" +reltol = 0.05 + +[models.Thermal_Motor] +atol = 2.0 +domain = "Thermal.HeatTransfer" +name = "Modelica.Thermal.HeatTransfer.Examples.Motor" +stopTime = 2000.0 + + [models.Thermal_Motor.reference] + core_T = 323.766 + winding_T = 358.742 + +[models.ThreeSprings] +domain = "Mechanics.MultiBody" +name = "Modelica.Mechanics.MultiBody.Examples.Elementary.ThreeSprings" +stopTime = 1.0 + +[models.Translational_Brake] +domain = "Mechanics.Translational" +dtmax = 0.02 +name = "Modelica.Mechanics.Translational.Examples.Brake" + +[models.Translational_Damper] +atol = 0.01 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.Damper" +reltol = 0.01 + +[models.Translational_ElastoGap] +atol = 5.0 +domain = "Mechanics.Translational" +dtmax = 0.0001 +name = "Modelica.Mechanics.Translational.Examples.ElastoGap" +reltol = 0.1 +stopTime = 1.0 + +[models.Translational_InitialConditions] +atol = 30.0 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.InitialConditions" +reltol = 0.2 + +[models.Translational_PreLoad] +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.PreLoad" +solver = "IDA" + +[models.Translational_WhyArrows] +atol = 0.01 +domain = "Mechanics.Translational" +name = "Modelica.Mechanics.Translational.Examples.WhyArrows" +reltol = 0.01 + +[models.TwoMasses] +atol = 0.1 +domain = "Thermal.HeatTransfer" +name = "Modelica.Thermal.HeatTransfer.Examples.TwoMasses" +reltol = 0.01 + +[models.Utilities_readRealParameterModel] +domain = "Utilities" +name = "Modelica.Utilities.Examples.readRealParameterModel" +stopTime = 0.0 diff --git a/reference/download_refs.sh b/reference/download_refs.sh index 47904de..7e2927e 100755 --- a/reference/download_refs.sh +++ b/reference/download_refs.sh @@ -1,16 +1,29 @@ #!/usr/bin/env bash # Download Dymola-generated reference CSV files from MAP-LIB_ReferenceResults. -# These are the official Modelica Association reference results for MSL 3.2.3. -# Source: https://github.com/modelica/MAP-LIB_ReferenceResults (branch v3.2.3) +# These are the official Modelica Association reference results of the MSL. +# Source: https://github.com/modelica/MAP-LIB_ReferenceResults (branch v) # -# Usage: cd OMLibraryTesting.jl/reference && bash download_refs.sh [SHORT_NAME...] +# Usage: cd OMLibraryTesting.jl/reference && bash download_refs.sh [--msl VERSION] [SHORT_NAME...] +# Without --msl: MSL 3.2.3 into csv/ and signals/. +# --msl VERSION (e.g. 4.1.0): that version into VERSION/csv/ and VERSION/signals/, for the +# models in ../models/experiments_Modelica_VERSION.txt (record_experiments). # With names (e.g. Blocks_Examples_InverseModel), download only those models. set -euo pipefail -BASE_URL="https://raw.githubusercontent.com/modelica/MAP-LIB_ReferenceResults/v3.2.3" +MSL_VERSION="3.2.3" +if [ "${1:-}" = "--msl" ]; then + MSL_VERSION="${2:?--msl needs a version}" + shift 2 +fi + +BASE_URL="https://raw.githubusercontent.com/modelica/MAP-LIB_ReferenceResults/v$MSL_VERSION" CSV_DIR="csv" SIGNALS_DIR="signals" +if [ "$MSL_VERSION" != "3.2.3" ]; then + CSV_DIR="$MSL_VERSION/csv" + SIGNALS_DIR="$MSL_VERSION/signals" +fi mkdir -p "$CSV_DIR" "$SIGNALS_DIR" @@ -434,6 +447,19 @@ MODELS=( "Utilities_Examples_readRealParameterModel|Modelica/Utilities/Examples/readRealParameterModel/readRealParameterModel" ) +# Other versions: the recorded experiment models, by MAP-LIB's layout +# (Modelica.A.B.M -> A_B_M|Modelica/A/B/M/M), which the list above follows too. +if [ "$MSL_VERSION" != "3.2.3" ]; then + EXPERIMENTS="../models/experiments_Modelica_$MSL_VERSION.txt" + [ -f "$EXPERIMENTS" ] || { echo "No $EXPERIMENTS: record it with record_experiments first" >&2; exit 1; } + MODELS=() + while IFS='|' read -r model _; do + [ -n "$model" ] || continue + short="${model#Modelica.}" + MODELS+=("${short//./_}|${model//.//}/${model##*.}") + done < "$EXPERIMENTS" +fi + # Only the models named on the command line, if any. if [ $# -gt 0 ]; then selected=() diff --git a/scripts/run_full_coverage.jl b/scripts/run_full_coverage.jl index 5a12ef8..45042dc 100644 --- a/scripts/run_full_coverage.jl +++ b/scripts/run_full_coverage.jl @@ -7,7 +7,9 @@ Invoked from a fresh tmux via: Environment variables: OMJL_COVERAGE_TAG Human-readable tag (default: "full_msl"). - OMJL_COVERAGE_MSL MSL version (default: "MSL:3.2.3"). + OMJL_COVERAGE_MSL MSL version (default: "MSL:3.2.3"). Its experiment list, registry and reference data + (models/experiments_Modelica_.txt, default_models_path(version), reference_dir); + a version OMFrontend does not bundle (e.g. "MSL:4.1.0") is the installed library. OMJL_COVERAGE_TIMEOUT Per-model timeout seconds (default: 1500). OMJL_COVERAGE_DOMAIN Optional domain regex filter. OMJL_COVERAGE_MODEL Optional single model name. @@ -28,6 +30,7 @@ using OMLibraryTesting: FRONTEND, BACKEND, SIMULATE, VALIDATE, phase_from_string const TAG = get(ENV, "OMJL_COVERAGE_TAG", "full_msl") const MSL = get(ENV, "OMJL_COVERAGE_MSL", "MSL:3.2.3") +const LIBRARY_VERSION = OMLibraryTesting.msl_library_version(MSL) const TIMEOUT = parse(Float64, get(ENV, "OMJL_COVERAGE_TIMEOUT", "1500")) const DOMAIN = get(ENV, "OMJL_COVERAGE_DOMAIN", "") const MODEL = get(ENV, "OMJL_COVERAGE_MODEL", "") @@ -49,7 +52,7 @@ mkpath(LOG_DIR) #= A copy of the registry without skips and broken marks, next to a link to the reference data (run_coverage reads the reference beside the registry it is given). =# function noskip_registry()::String - local reg = TOML.parsefile(OMLibraryTesting.default_models_path()) + local reg = TOML.parsefile(OMLibraryTesting.default_models_path(LIBRARY_VERSION)) for table in (get(reg, "models", Dict()), get(reg, "domain_overrides", Dict())), (_, e) in table delete!(e, "skipPhases") get(e, "expected", "") == "broken" && delete!(e, "expected") @@ -62,7 +65,7 @@ function noskip_registry()::String open(io -> TOML.print(io, reg), path, "w") return path end -const OVERRIDES = NOSKIP ? noskip_registry() : OMLibraryTesting.default_models_path() +const OVERRIDES = NOSKIP ? noskip_registry() : OMLibraryTesting.default_models_path(LIBRARY_VERSION) @info "Coverage run starting" tag=TAG msl=MSL timeout=TIMEOUT ts=RUN_TS from=FROMPHASE to=TOPHASE workers=WORKERS noskip=NOSKIP @info "Report directory: $REPORT_DIR" diff --git a/src/registry.jl b/src/registry.jl index b9d834b..90dd748 100644 --- a/src/registry.jl +++ b/src/registry.jl @@ -33,6 +33,40 @@ function default_models_path() joinpath(@__DIR__, "..", "models", "models.toml") end +#= MSL 3.2.3, the version covered first, has the top-level registry and reference data + (models/models.toml, reference/csv, reference/signals); another version has its own + (models/models_.toml, reference//csv, reference//signals). =# +const TOP_LEVEL_MSL_VERSION = "3.2.3" + +""" + default_models_path(version) -> String + +The registry of MSL `version`: `models/models.toml` for 3.2.3, else `models/models_.toml`. +""" +function default_models_path(version::String)::String + version == TOP_LEVEL_MSL_VERSION && return default_models_path() + return joinpath(@__DIR__, "..", "models", "models_$(version).toml") +end + +""" + reference_dir(models_path, version) -> String + +The reference data of MSL `version` for the registry at `models_path`: `reference/` beside the +registry's folder, its subfolder `version` for a version other than 3.2.3. +""" +function reference_dir(models_path::String, version::String)::String + local dir = joinpath(dirname(models_path), "..", "reference") + version == TOP_LEVEL_MSL_VERSION || (dir = joinpath(dir, version)) + return abspath(dir) +end + +""" + msl_library_version(msl_version) -> String + +The library version of an `MSL_Version` string: `"MSL:4.1.0"` -> `"4.1.0"`. +""" +msl_library_version(msl_version::String)::String = replace(msl_version, "MSL:" => "") + """ load_registry_meta(path) -> Dict{String, Any} diff --git a/src/report.jl b/src/report.jl index cc5f1fd..2e477a9 100644 --- a/src/report.jl +++ b/src/report.jl @@ -396,12 +396,12 @@ Runs `run_coverage` with the given arguments, then automatically saves both an HTML and a Markdown coverage report via `generate_report`. Returns the results vector. """ function run_coverage_and_report(; library::String = "Modelica", - version::String = "3.2.3", msl_version::String = "MSL:3.2.3", + version::String = msl_library_version(msl_version), domain::String = "", model::String = "", filter::Regex = r"", - overrides::String = default_models_path(), + overrides::String = default_models_path(version), timeout::Float64 = 1000.0, phases::Vector{Phase} = PHASE_ORDER, from_phase::Phase = FRONTEND, diff --git a/src/rerun_failed.jl b/src/rerun_failed.jl index 7cacc8a..cdc7a88 100644 --- a/src/rerun_failed.jl +++ b/src/rerun_failed.jl @@ -61,9 +61,9 @@ end from_phase = BACKEND, include_broken = false, library = "Modelica", - version = "3.2.3", msl_version = "MSL:3.2.3", - overrides = default_models_path(), + version = msl_library_version(msl_version), + overrides = default_models_path(version), timeout = 1000.0, phases = PHASE_ORDER, run_from_phase = FRONTEND, @@ -95,9 +95,9 @@ function run_failed_from_report(; report_path::String = "", from_phase::Phase = BACKEND, include_broken::Bool = false, library::String = "Modelica", - version::String = "3.2.3", msl_version::String = "MSL:3.2.3", - overrides::String = default_models_path(), + version::String = msl_library_version(msl_version), + overrides::String = default_models_path(version), timeout::Float64 = 1000.0, phases::Vector{Phase} = PHASE_ORDER, run_from_phase::Phase = FRONTEND, @@ -121,7 +121,7 @@ function run_failed_from_report(; report_path::String = "", # then keep only the entries whose name is in the failed set. specs = discover_experiments(; library = library, version = version, filter = r"") specs = merge_overrides!(specs, overrides) - ref_dir = joinpath(dirname(overrides), "..", "reference") |> abspath + ref_dir = reference_dir(overrides, version) specs = auto_detect_references!(specs, ref_dir) fail_set = Set{String}(failed_names) @@ -137,6 +137,7 @@ function run_failed_from_report(; report_path::String = "", return _run_specs(rerun_specs; msl_version = msl_version, + ref_dir = ref_dir, timeout = timeout, phases = phases, from_phase = run_from_phase, @@ -160,9 +161,9 @@ function run_failed_and_report(; report_path::String = "", from_phase::Phase = BACKEND, include_broken::Bool = false, library::String = "Modelica", - version::String = "3.2.3", msl_version::String = "MSL:3.2.3", - overrides::String = default_models_path(), + version::String = msl_library_version(msl_version), + overrides::String = default_models_path(version), timeout::Float64 = 1000.0, phases::Vector{Phase} = PHASE_ORDER, run_from_phase::Phase = FRONTEND, @@ -212,6 +213,8 @@ needs to drive an explicit subset can share the worker-pool wiring. """ function _run_specs(specs::Vector{ModelSpec}; msl_version::String = "MSL:3.2.3", + ref_dir::String = reference_dir(default_models_path(msl_library_version(msl_version)), + msl_library_version(msl_version)), timeout::Float64 = 1000.0, phases::Vector{Phase} = PHASE_ORDER, from_phase::Phase = FRONTEND, @@ -229,7 +232,7 @@ function _run_specs(specs::Vector{ModelSpec}; @info "Rerunning $n_active models ($n_broken known broken, $total_models total) phases=[$phase_names] n_workers=$n_workers timeout=$(round(Int, timeout))s" effective_workers = min(n_workers, total_models) - pool = WorkerPool(effective_workers; msl_version = msl_version) + pool = WorkerPool(effective_workers; msl_version = msl_version, ref_dir = ref_dir) ensure_pool!(pool) indexed_results = Vector{Union{Nothing, ModelResult}}(nothing, total_models) diff --git a/src/runner.jl b/src/runner.jl index decd876..8e857ea 100644 --- a/src/runner.jl +++ b/src/runner.jl @@ -350,6 +350,20 @@ function _bounded_showerror(@nospecialize(e), cap::Int = 500)::String return capped ? s * "..." : s end +""" + _msl_kwargs(msl_version) -> NamedTuple + +How OM loads the MSL of `msl_version`: a version bundled with OMFrontend +(`lib/Modelica/MSL___.mo`) by `MSL_Version`, any other from the installed +libraries (`OM.loadInstalledLibrary`, which brings ModelicaServices and Complex along). +""" +function _msl_kwargs(msl_version::String)::NamedTuple + local bundled = joinpath(pkgdir(OMFrontend), "lib", "Modelica", + replace(msl_version, r"[.:]" => "_") * ".mo") + isfile(bundled) && return (; MSL_Version = msl_version) + return (; libraries = [OM.loadInstalledLibrary("Modelica"; version = msl_library_version(msl_version))]) +end + """ _run_model_phases(model_name, msl_version, stop_time, reference_file, reference, atol, reltol, signal_mapping, ref_dir, @@ -395,10 +409,11 @@ function _run_model_phases(model_name::String, t0 = time() try + local msl = _msl_kwargs(msl_version) if phase_int == Int(FRONTEND) - OM.flatten(model_name; MSL_Version = msl_version) + OM.flatten(model_name; msl...) elseif phase_int == Int(BACKEND) - OM.translate(model_name; MSL_Version = msl_version, + OM.translate(model_name; msl..., checkSimCode = check_sim_code) elseif phase_int == Int(SIMULATE) # Build kwargs: solver + dtmax (if non-zero) + initializealg (if specified). @@ -415,7 +430,7 @@ function _run_model_phases(model_name::String, if solver_atol > 0.0 _tol = (; _tol..., abstol = solver_atol) end - sol = OM.simulate(model_name; stopTime = stop_time, _sa..., _extra..., _ia..., _of..., _mi..., _tol...) + sol = OM.simulate(model_name; msl..., stopTime = stop_time, _sa..., _extra..., _ia..., _of..., _mi..., _tol...) #= Terminated is a successful end per Modelica semantics: a model calling terminate() completed its intended scenario. =# if sol.retcode != ReturnCode.Success && sol.retcode != ReturnCode.Terminated @@ -701,6 +716,12 @@ Run the full MSL coverage suite. Models are discovered automatically via omc. TOML overrides (reference files, known broken, signal mappings) are merged in. Each model runs on an isolated worker process with an enforced timeout. +`msl_version` (e.g. `"MSL:4.1.0"`) selects the MSL: a version bundled with OMFrontend +(3.2.3, 4.0.0) is loaded from there, any other from the installed libraries +(`OM.loadInstalledLibrary`). `version` (its library version by default) selects the +experiment list, `overrides` the registry and, beside it, the reference data +(`default_models_path(version)`, `reference_dir`). + Optionally filter by `domain` regex, single `model` name, or general `filter` regex. Use `from_phase` and `to_phase` to restrict which phases are run. For example, @@ -718,12 +739,12 @@ pre-added workers via `addprocs(N)`, the pool adopts them; otherwise the pool spawns a single worker and runs serially. """ function run_coverage(; library::String = "Modelica", - version::String = "3.2.3", msl_version::String = "MSL:3.2.3", + version::String = msl_library_version(msl_version), domain::String = "", model::String = "", filter::Regex = r"", - overrides::String = default_models_path(), + overrides::String = default_models_path(version), timeout::Float64 = 1000.0, phases::Vector{Phase} = PHASE_ORDER, from_phase::Phase = FRONTEND, @@ -737,7 +758,7 @@ function run_coverage(; library::String = "Modelica", @info "Starting coverage run (phases: $phase_names, n_workers: $n_workers)" specs = discover_experiments(; library = library, version = version, filter = filter) specs = merge_overrides!(specs, overrides) - ref_dir = joinpath(dirname(overrides), "..", "reference") |> abspath + ref_dir = reference_dir(overrides, version) specs = auto_detect_references!(specs, ref_dir) if !isempty(model) specs = Base.filter(s -> s.name == model, specs) @@ -758,7 +779,7 @@ function run_coverage(; library::String = "Modelica", @info "Running $n_active models ($n_broken known broken, $total_models total), timeout=$(round(Int, timeout))s" effective_workers = min(n_workers, total_models) - pool = WorkerPool(effective_workers; msl_version = msl_version) + pool = WorkerPool(effective_workers; msl_version = msl_version, ref_dir = ref_dir) ensure_pool!(pool) indexed_results = Vector{Union{Nothing, ModelResult}}(nothing, total_models) diff --git a/test/registryTests.jl b/test/registryTests.jl index 6ea9060..913369a 100644 --- a/test/registryTests.jl +++ b/test/registryTests.jl @@ -9,9 +9,9 @@ one depend on Dict order. import OMLibraryTesting as OLT -@testset "registry: stopTimes within the reference data, one entry per model" begin - local root = joinpath(@__DIR__, "..") - local reg = OLT.TOML.parsefile(joinpath(root, "models", "models.toml"))["models"] +@testset "registry $version: stopTimes within the reference data, one entry per model" for version in ("3.2.3", "4.1.0") + local path = OLT.default_models_path(version) + local reg = OLT.TOML.parsefile(path)["models"] local names = [s["name"] for s in values(reg)] local dups = sort!(unique!([n for n in names if count(==(n), names) > 1])) @test isempty(dups) @@ -24,9 +24,26 @@ import OMLibraryTesting as OLT haskey(s, "stopTime") || continue local rf = get(s, "referenceFile", "") isempty(rf) && (rf = OLT._model_name_to_ref_key(s["name"])) - local f = joinpath(root, "reference", "csv", rf * ".csv") + local f = joinpath(OLT.reference_dir(path, version), "csv", rf * ".csv") isfile(f) || continue OLT.stoptime_within_reference(s["stopTime"], refEnd(f)) || push!(past, key) end @test isempty(past) end + +@testset "per-version registry, reference data and MSL loading" begin + local models = normpath(joinpath(@__DIR__, "..", "models")) + local reference = normpath(joinpath(@__DIR__, "..", "reference")) + @test OLT.msl_library_version("MSL:4.1.0") == "4.1.0" + @test normpath(OLT.default_models_path("3.2.3")) == joinpath(models, "models.toml") + @test normpath(OLT.default_models_path("4.1.0")) == joinpath(models, "models_4.1.0.toml") + @test OLT.reference_dir(OLT.default_models_path("3.2.3"), "3.2.3") == reference + @test OLT.reference_dir(OLT.default_models_path("4.1.0"), "4.1.0") == joinpath(reference, "4.1.0") + @test OLT.load_registry_meta(OLT.default_models_path("4.1.0"))["msl_version"] == "MSL:4.1.0" + #= Every 4.1.0 entry is an experiment of 4.1.0. =# + local experiments = Set(first(split(l, '|')) for l in eachline(joinpath(models, "experiments_Modelica_4.1.0.txt"))) + @test all(e -> e["name"] in experiments, values(OLT.TOML.parsefile(OLT.default_models_path("4.1.0"))["models"])) + #= Bundled versions by MSL_Version; others are installed libraries (not loaded here). =# + @test OLT._msl_kwargs("MSL:3.2.3") == (; MSL_Version = "MSL:3.2.3") + @test OLT._msl_kwargs("MSL:4.0.0") == (; MSL_Version = "MSL:4.0.0") +end From 2388e4e0887a7f0431cccd179e2ac481f702e921 Mon Sep 17 00:00:00 2001 From: JKRT Date: Mon, 12 Oct 2026 17:55:36 +0200 Subject: [PATCH 2/2] MSL 4.1.0 coverage every third day, published next to 3.2.3 - coverage.yml: input `msl` (3.2.3, 4.1.0) and a second schedule (every third day, 14:00 UTC) for 4.1.0; MSL 4.1.0 installed on the runner from the MSL repository (Modelica, ModelicaServices, Complex into ~/.openmodelica/libraries); the references cached per version. - publish_coverage.jl (OMJL_COVERAGE_MSL): another version writes docs/COVERAGE_.md and its own README section. - publish_site / publish_site.jl: another version's runs, history and badges in msl-/ of the site; the indexes link the versions. - docs/COVERAGE_4.1.0.md and the README's 4.1.0 section: the first run (2026-10-12, local, 3 workers). Assisted-by: Claude Opus 5.5 --- .github/workflows/coverage.yml | 79 ++++++++++++++---- Project.toml | 2 +- README.md | 34 ++++++-- docs/COVERAGE_4.1.0.md | 145 +++++++++++++++++++++++++++++++++ scripts/publish_coverage.jl | 23 ++++-- scripts/publish_site.jl | 6 +- src/site.jl | 81 ++++++++++++++---- test/siteTests.jl | 15 ++++ 8 files changed, 330 insertions(+), 55 deletions(-) create mode 100644 docs/COVERAGE_4.1.0.md diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f240343..9ec77cc 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,19 +11,30 @@ name: MSL coverage # skipPhases and broken marks are removed, so every model goes through every # phase and the documentation shows what really stops each one. # +# Two MSL versions: 3.2.3 weekly (docs/COVERAGE.md, the README's coverage +# section, the site's root) and 4.1.0 every third day (docs/COVERAGE_4.1.0.md, +# its own README section, the site's msl-4.1.0/). OMFrontend bundles 3.2.3; +# 4.1.0 is installed on the runner from the MSL repository, as OpenModelica's +# package manager lays it out (~/.openmodelica/libraries). +# # OM.jl and the sibling packages are checked out at the branch this workflow # runs on (or `line`), as in OM.jl's omjl-ci.yml. The models' experiment -# settings come from models/experiments_Modelica_3.2.3.txt (there is no omc -# on the runner; record_experiments() refreshes the file). +# settings come from models/experiments_Modelica_.txt (there is no +# omc on the runner; record_experiments() refreshes the file). # # Manual runs (Actions > MSL coverage > Run workflow) commit the documentation -# back and publish the run on the site when `commit` is set; the weekly run -# always does. A schedule only fires +# back and publish the run on the site when `commit` is set; the scheduled +# runs always do. A schedule only fires # from the default branch, so it measures that branch's line. on: workflow_dispatch: inputs: + msl: + description: MSL version + type: choice + options: ["3.2.3", "4.1.0"] + default: "3.2.3" line: description: OM.jl line to measure (empty for the branch the workflow runs on) required: false @@ -46,7 +57,8 @@ on: required: false default: false schedule: - - cron: "0 2 * * 0" # Sundays 02:00 UTC + - cron: "0 2 * * 0" # MSL 3.2.3: Sundays 02:00 UTC + - cron: "0 14 */3 * *" # MSL 4.1.0: every third day of the month (1st, 4th, ...), 14:00 UTC permissions: contents: write # the documentation commit @@ -58,12 +70,15 @@ concurrency: jobs: coverage: - name: MSL coverage, Julia ${{ inputs.julia || '1.13' }} + name: MSL ${{ inputs.msl || (github.event.schedule == '0 14 */3 * *' && '4.1.0') || '3.2.3' }} coverage, Julia ${{ inputs.julia || '1.13' }} runs-on: ubuntu-latest timeout-minutes: 360 env: JULIA_PKG_PRECOMPILE_AUTO: "0" LD_LIBRARY_PATH: ${{ github.workspace }}/OM.jl/OMRuntimeExternalC.jl/lib/ext/shared/x86_64-linux-gnu + # The MSL version: the input, 4.1.0 for the every-third-day schedule, else 3.2.3. + MSL: ${{ inputs.msl || (github.event.schedule == '0 14 */3 * *' && '4.1.0') || '3.2.3' }} + OMJL_COVERAGE_MSL: MSL:${{ inputs.msl || (github.event.schedule == '0 14 */3 * *' && '4.1.0') || '3.2.3' }} steps: - name: Check out OM.jl uses: JKRT/OM.jl/.github/actions/checkout-siblings@master @@ -106,7 +121,31 @@ jobs: - name: Set up OMLibraryTesting run: julia --color=yes --project=OM.jl/OMLibraryTesting.jl -e 'using Pkg; Pkg.instantiate(); Pkg.precompile()' - # The MAP-LIB reference results (1.3 GB) change with download_refs.sh only. + - name: The version's documentation + run: | + doc=docs/COVERAGE.md + [ "$MSL" = 3.2.3 ] || doc="docs/COVERAGE_$MSL.md" + echo "COVERAGE_MD=$doc" >> "$GITHUB_ENV" + + # OMFrontend bundles MSL 3.2.3 and 4.0.0; another version is the installed + # library: Modelica, ModelicaServices and Complex (a single file in the + # repository, a folder with its package.mo when installed). + - name: Install MSL ${{ env.MSL }} + if: env.MSL != '3.2.3' && env.MSL != '4.0.0' + run: | + src="$RUNNER_TEMP/msl" + git clone -q --depth 1 --branch "v$MSL" --filter=blob:none --sparse \ + https://github.com/modelica/ModelicaStandardLibrary.git "$src" + git -C "$src" sparse-checkout set Modelica ModelicaServices + libs="$HOME/.openmodelica/libraries" + mkdir -p "$libs/Complex $MSL" + cp -r "$src/Modelica" "$libs/Modelica $MSL" + cp -r "$src/ModelicaServices" "$libs/ModelicaServices $MSL" + cp "$src/Complex.mo" "$libs/Complex $MSL/package.mo" + ls "$libs" + + # The MAP-LIB reference results (1.3 GB for 3.2.3, 2 GB for 4.1.0) change with + # download_refs.sh and the experiment lists only. - name: Cache the reference results id: refs uses: actions/cache@v4 @@ -114,12 +153,14 @@ jobs: path: | OM.jl/OMLibraryTesting.jl/reference/csv OM.jl/OMLibraryTesting.jl/reference/signals - key: msl-refs-3.2.3-${{ hashFiles('OM.jl/OMLibraryTesting.jl/reference/download_refs.sh') }} + OM.jl/OMLibraryTesting.jl/reference/${{ env.MSL }} + key: msl-refs-${{ env.MSL }}-${{ hashFiles('OM.jl/OMLibraryTesting.jl/reference/download_refs.sh', 'OM.jl/OMLibraryTesting.jl/models/experiments_Modelica_*.txt') }} - name: Download the reference results if: steps.refs.outputs.cache-hit != 'true' working-directory: OM.jl/OMLibraryTesting.jl/reference - run: bash download_refs.sh + run: | + if [ "$MSL" = 3.2.3 ]; then bash download_refs.sh; else bash download_refs.sh --msl "$MSL"; fi - name: Commits measured run: | @@ -148,18 +189,18 @@ jobs: run: | results=$(ls -t logs/partial_ci_*.jls | head -1) julia --color=yes --project=. scripts/publish_coverage.jl "$results" "$GITHUB_WORKSPACE/commits.txt" "$NOTE" - cat docs/COVERAGE.md >> "$GITHUB_STEP_SUMMARY" + cat "$COVERAGE_MD" >> "$GITHUB_STEP_SUMMARY" - name: Upload the reports if: ${{ !cancelled() }} uses: actions/upload-artifact@v4 with: - name: msl-coverage + name: msl-coverage-${{ env.MSL }} path: | commits.txt OM.jl/OMLibraryTesting.jl/reports/ OM.jl/OMLibraryTesting.jl/logs/partial_ci_*.jls - OM.jl/OMLibraryTesting.jl/docs/COVERAGE.md + OM.jl/OMLibraryTesting.jl/${{ env.COVERAGE_MD }} if-no-files-found: warn - name: Commit the documentation @@ -168,13 +209,14 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add README.md docs/COVERAGE.md + git add README.md "$COVERAGE_MD" if git diff --cached --quiet; then echo "Coverage unchanged"; exit 0; fi - git commit -m "Coverage of $(date -u +%Y-%m-%d) [skip ci]" + git commit -m "Coverage of $(date -u +%Y-%m-%d), MSL $MSL [skip ci]" git push origin "HEAD:${GITHUB_REF_NAME}" # The run on the coverage site: runs//, the index and the badges on - # the gh-pages branch (created on the first run), which Pages serves. + # the gh-pages branch (created on the first run), which Pages serves; the + # root for MSL 3.2.3, msl-/ for another (site_folder). - name: Publish the coverage site if: steps.publish.outcome == 'success' && (github.event_name == 'schedule' || inputs.commit) working-directory: OM.jl/OMLibraryTesting.jl @@ -192,11 +234,12 @@ jobs: fi results=$(ls -t logs/partial_ci_*.jls | head -1) report=$(ls -t reports/coverage_ci_*.html | head -1) - julia --color=yes --project=. scripts/publish_site.jl "$site" "$results" "$report" docs/COVERAGE.md "$GITHUB_WORKSPACE/commits.txt" "$NOTE" + julia --color=yes --project=. scripts/publish_site.jl "$site" "$results" "$report" "$COVERAGE_MD" "$GITHUB_WORKSPACE/commits.txt" "$NOTE" cd "$site" git add -A if git diff --cached --quiet; then echo "Site unchanged"; exit 0; fi git -c user.name="github-actions[bot]" -c user.email="41898282+github-actions[bot]@users.noreply.github.com" \ - commit -q -m "Coverage of $(date -u +%Y-%m-%d)" + commit -q -m "Coverage of $(date -u +%Y-%m-%d), MSL $MSL" git push origin gh-pages - echo "Coverage site: $OMJL_SITE_URL" >> "$GITHUB_STEP_SUMMARY" + folder=""; [ "$MSL" = 3.2.3 ] || folder="msl-$MSL/" + echo "Coverage site: $OMJL_SITE_URL$folder" >> "$GITHUB_STEP_SUMMARY" diff --git a/Project.toml b/Project.toml index 447363a..795073c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "OMLibraryTesting" uuid = "4866894a-ca78-4bef-9a5c-0d35f2f81ce1" -version = "0.1.2" +version = "0.2.0" authors = ["John Tinnerholm "] [deps] diff --git a/README.md b/README.md index 5f45579..d7ea5ee 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # OMLibraryTesting.jl [![MSL coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Fopenmodelica.github.io%2FOMLibraryTesting.jl%2Fbadge.json)](https://openmodelica.github.io/OMLibraryTesting.jl/) +[![MSL 4.1.0 coverage](https://img.shields.io/endpoint?url=https%3A%2F%2Fopenmodelica.github.io%2FOMLibraryTesting.jl%2Fmsl-4.1.0%2Fbadge.json)](https://openmodelica.github.io/OMLibraryTesting.jl/msl-4.1.0/) A Julia package for running MSL (Modelica Standard Library) coverage tests against [OM.jl](https://github.com/OpenModelica/OM.jl). It auto-discovers all experiment models in the MSL using `omc`, runs each through the OM.jl pipeline (flatten -> translate -> simulate -> validate), and generates HTML coverage reports. @@ -23,7 +24,11 @@ Results are compared against Dymola-generated reference trajectories from the MA Measured 2026-10-11 on 425 MSL example models: frontend 424 (99.8 %), backend 408 (96.0 %), simulate 340 (80.0 %), validate 314 (73.9 %). Per domain and what stops the rest: [docs/COVERAGE.md](docs/COVERAGE.md). -Every published run, by date, with the trend: the [coverage site](https://openmodelica.github.io/OMLibraryTesting.jl/). + +Measured 2026-10-12 on 534 MSL 4.1.0 example models: frontend 534 (100.0 %), backend 438 (82.0 %), simulate 339 (63.5 %), validate 312 (58.4 %). Per domain and what stops the rest: [docs/COVERAGE_4.1.0.md](docs/COVERAGE_4.1.0.md). + + +Every published run, by date, with the trend: the [coverage site](https://openmodelica.github.io/OMLibraryTesting.jl/) (MSL 3.2.3; MSL 4.1.0 in [msl-4.1.0/](https://openmodelica.github.io/OMLibraryTesting.jl/msl-4.1.0/)). ## Directory Structure @@ -41,14 +46,18 @@ OMLibraryTesting.jl/ │ ├── site.jl # Coverage site: one page per run, index, badges │ └── testsuite.jl # Fetch + run the upstream OpenModelica testsuite (rtest / OM.jl modes) ├── models/ -│ └── models.toml # Per-model overrides (atol, reltol, expected phase, signal mapping) +│ ├── models.toml # Per-model overrides (atol, reltol, expected phase, signal mapping), MSL 3.2.3 +│ ├── models_4.1.0.toml # The same for MSL 4.1.0 +│ └── experiments_Modelica_.txt # The experiment models omc lists (record_experiments) ├── reference/ │ ├── csv/ # Dymola reference CSVs (MAP-LIB, MSL 3.2.3) │ ├── signals/ # Per-model comparisonSignals.txt files +│ ├── 4.1.0/ # The same for MSL 4.1.0 (csv/, signals/) │ ├── download_refs.sh # Script to fetch/refresh reference files from GitHub │ └── generate_refs.mos # OpenModelica script to generate reference results ├── docs/ -│ └── COVERAGE.md # The latest published coverage (scripts/publish_coverage.jl) +│ ├── COVERAGE.md # The latest published MSL 3.2.3 coverage (scripts/publish_coverage.jl) +│ └── COVERAGE_4.1.0.md # The same for MSL 4.1.0 ├── results/ # Runtime output (ignored by git) └── reports/ # Generated coverage reports (ignored by git) ``` @@ -70,6 +79,11 @@ results = OMLibraryTesting.run_coverage(domain = "Thermal", msl_version = "MSL:3 # Run a single model results = OMLibraryTesting.run_coverage(model = "Modelica.Thermal.HeatTransfer.Examples.TwoMasses") +# MSL 4.1.0: its experiment list, registry (models/models_4.1.0.toml) and reference data +# (reference/4.1.0/); OMFrontend bundles 3.2.3 and 4.0.0, so 4.1.0 is the installed library +# (~/.openmodelica/libraries: Modelica, ModelicaServices and Complex 4.1.0) +results = OMLibraryTesting.run_coverage(msl_version = "MSL:4.1.0") + # Generate an HTML report OMLibraryTesting.generate_report(results) @@ -81,11 +95,13 @@ OMLibraryTesting.print_error_analysis(results) ``` The "Latest coverage" section above and docs/COVERAGE.md are published by the `MSL coverage` workflow -(.github/workflows/coverage.yml: weekly, or by hand from the Actions tab with `commit` set). It runs -`scripts/run_full_coverage.jl` with `OMJL_COVERAGE_NOSKIP=1` (every model through every phase) and passes the -serialized results to the publisher. It also adds the run to the coverage site, served by GitHub Pages from -the `gh-pages` branch (`scripts/publish_site.jl`): `runs//` with the analysis and the per-model report, an -index over all runs, and the badges (`badge.json`, models that validate; `badges/.json`). The same by hand: +(.github/workflows/coverage.yml: MSL 3.2.3 weekly, MSL 4.1.0 every third day, or by hand from the Actions +tab with `msl` and `commit` set). It runs `scripts/run_full_coverage.jl` with `OMJL_COVERAGE_NOSKIP=1` (every +model through every phase) and passes the serialized results to the publisher. It also adds the run to the +coverage site, served by GitHub Pages from the `gh-pages` branch (`scripts/publish_site.jl`): `runs//` with +the analysis and the per-model report, an index over all runs, and the badges (`badge.json`, models that +validate; `badges/.json`); MSL 4.1.0 has the same in `msl-4.1.0/`, docs/COVERAGE_4.1.0.md and its own +section above. The same by hand (`OMJL_COVERAGE_MSL`, default `MSL:3.2.3`, selects the version for all three): ```bash OMJL_COVERAGE_NOSKIP=1 julia --project=. scripts/run_full_coverage.jl @@ -201,7 +217,7 @@ Reference CSVs use Modelica dot notation (e.g., `rev.phi`). OM.jl uses underscor ## Reference Data -Reference trajectories come from the MAP-LIB Dymola reference results (MSL 3.2.3 branch). Run `reference/download_refs.sh` to fetch or refresh them. +Reference trajectories come from the MAP-LIB Dymola reference results (branch v3.2.3, and v4.1.0 for MSL 4.1.0). Run `reference/download_refs.sh` (MSL 3.2.3) or `reference/download_refs.sh --msl 4.1.0` to fetch or refresh them. ## License diff --git a/docs/COVERAGE_4.1.0.md b/docs/COVERAGE_4.1.0.md new file mode 100644 index 0000000..b5c4533 --- /dev/null +++ b/docs/COVERAGE_4.1.0.md @@ -0,0 +1,145 @@ +# MSL 4.1.0 coverage of OM.jl + +Measured 2026-10-12: 534 example models of the Modelica Standard Library 4.1.0, each run through OM.jl's pipeline (flatten, translate, simulate) and validated against the reference trajectories. No-skip run on macOS (local, Apple silicon), 3 workers, 600 s per model. + +Commits: OM.jl `372e60d`, Absyn.jl `690c071`, ArrayUtil.jl `45ec370`, DAE.jl `29da583`, DoubleEnded.jl `3955cc5`, ImmutableList.jl `132055a`, ListUtil.jl `3d2d0c3`, MetaModelica.jl `3814d38`, OMBackend.jl `7ff85a9`, OMFrontend.jl `bcc72a3`, OMLibraryTesting.jl `95a74ba`, OMParser.jl `2415184`, OMRuntimeExternalC.jl `53e1c85`, SCode.jl `86e7838`. + +Generated by `scripts/publish_coverage.jl` from the run's results; do not edit by hand. + +## Summary + +| Phase reached | Models | Share | +|---|---|---| +| frontend | 534 | 100.0 % | +| backend | 438 | 82.0 % | +| simulate | 339 | 63.5 % | +| validate | 312 | 58.4 % | +| total | 534 | | + +## Per domain + +| Domain | Models | Validate | Simulate only | Backend only | Frontend only | None | +|---|---|---|---|---|---|---| +| Blocks | 31 | 19 | 1 | 7 | 4 | 0 | +| Clocked | 77 | 2 | 1 | 0 | 74 | 0 | +| ComplexBlocks | 2 | 2 | 0 | 0 | 0 | 0 | +| Electrical.Analog | 55 | 43 | 2 | 7 | 3 | 0 | +| Electrical.Batteries | 8 | 1 | 1 | 4 | 2 | 0 | +| Electrical.Digital | 23 | 21 | 0 | 2 | 0 | 0 | +| Electrical.Machines | 43 | 31 | 7 | 5 | 0 | 0 | +| Electrical.Polyphase | 5 | 5 | 0 | 0 | 0 | 0 | +| Electrical.PowerConverters | 47 | 38 | 4 | 4 | 1 | 0 | +| Electrical.QuasiStatic | 11 | 11 | 0 | 0 | 0 | 0 | +| Electrical.Spice3 | 14 | 4 | 5 | 3 | 2 | 0 | +| Fluid | 23 | 6 | 0 | 17 | 0 | 0 | +| Magnetic.FluxTubes | 14 | 4 | 1 | 9 | 0 | 0 | +| Magnetic.FundamentalWave | 27 | 21 | 2 | 4 | 0 | 0 | +| Magnetic.QuasiStatic | 28 | 23 | 1 | 4 | 0 | 0 | +| Math.FastFourierTransform | 2 | 2 | 0 | 0 | 0 | 0 | +| Math.Nonlinear | 1 | 1 | 0 | 0 | 0 | 0 | +| Math.Random | 1 | 1 | 0 | 0 | 0 | 0 | +| Mechanics.MultiBody | 42 | 27 | 1 | 11 | 3 | 0 | +| Mechanics.Rotational | 17 | 8 | 0 | 9 | 0 | 0 | +| Mechanics.Translational | 16 | 12 | 0 | 4 | 0 | 0 | +| Media | 20 | 10 | 0 | 3 | 7 | 0 | +| Media.Incompressible | 1 | 1 | 0 | 0 | 0 | 0 | +| StateGraph | 7 | 6 | 0 | 1 | 0 | 0 | +| Thermal.FluidHeatFlow | 12 | 8 | 0 | 4 | 0 | 0 | +| Thermal.HeatTransfer | 4 | 3 | 0 | 1 | 0 | 0 | +| Utilities | 3 | 2 | 1 | 0 | 0 | 0 | + +## What stops the models that do not validate + +Grouped by the last phase a model reached and its first error (names and numbers blanked). + +| Stops after | Models | First error | Examples | +|---|---|---|---| +| frontend | 77 | UndefVarError: `…` not defined in `…` | Blocks.Examples.DemonstrateContinuousSignalExtrema, Clocked.Examples.CascadeControlledDrive.AbsoluteClocks | +| backend | 45 | UndefVarError: `…` not defined in `…` | Blocks.Examples.Interaction1, Blocks.Examples.LogicalNetwork1 | +| backend | 14 | Simulation retcode: Unstable | Blocks.Examples.Noise.NormalNoiseProperties, Blocks.Examples.Noise.UniformNoiseProperties | +| backend | 9 | Simulation retcode: InitialFailure | Electrical.Spice3.Examples.Inverter, Electrical.Spice3.Examples.Spice3BenchmarkDifferentialPair | +| frontend | 4 | UnsupportedLowering: a record assignment from this expression: r_N[N] | Media.Examples.ReferenceAir.Inverse_sh_TX, Media.Examples.ReferenceAir.MoistAir | +| backend | 3 | InvalidSystemException: The system is structurally singular! Here are the problematic vari | Electrical.Analog.Examples.HeatingNPN_NORGate, Electrical.Analog.Examples.HeatingPNP_NORGate | +| backend | 3 | Simulation retcode: MaxIters | Electrical.Analog.Examples.CharacteristicIdealDiodes, Electrical.Analog.Examples.SimpleTriacCircuit | +| backend | 3 | UnsupportedLowering: fixed start values or initial equations that the initialization canno | Blocks.Examples.Noise.ImpureGenerator, Electrical.Analog.Examples.DemoPowerSupplyWithBuffer | +| frontend | 3 | AssertionError: Non-numeric start attributes are not currently supported | Electrical.Analog.Examples.DemonstrateLightning, Electrical.Analog.Examples.Lines.LightningLosslessTransmissionLine | +| frontend | 3 | InterruptException: | Blocks.Examples.Rectifier12pulseFFT, Blocks.Examples.Rectifier6pulseFFT | +| backend | 2 | Derivative of Modelica_Media_Water_IFN_Utilities_rho_ph(N, | Fluid.Examples.AST_BatchPlant.BatchPlant_StandardWater, Fluid.Examples.Explanatory.MeasuringTemperature | +| backend | 2 | DAE init: residual N exceeds threshold N; refusing inconsistent ICs. Worst: | Magnetic.FluxTubes.Examples.BasicExamples.QuadraticCoreAirgap, Magnetic.QuasiStatic.FluxTubes.Examples.BasicExamples.QuadraticCoreAirgap | +| backend | 2 | DomainError with -N: | Media.Examples.ReferenceAir.DryAir1, Media.Examples.ReferenceAir.DryAir2 | +| backend | 2 | InterruptException: | Electrical.Machines.Examples.InductionMachines.IMC_InverterDrive, Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_DC_Drive | +| backend | 2 | UnsupportedLowering: derivative initial equations on algebraic or observed variables witho | Fluid.Examples.HeatExchanger.HeatExchangerSimulation, Fluid.Examples.HeatingSystem | +| frontend | 2 | Error: | Electrical.Spice3.Examples.Graetz, Electrical.Spice3.Examples.Spice3BenchmarkFourBitBinaryAdder | +| frontend | 2 | UndefVarError: `…` not defined in local scope | Media.Examples.R134a.R134a1, Media.Examples.R134a.R134a2 | +| simulate | 2 | Validation failed for signals: capacitorN.v, capacitorN.v, filter.x[N], filter.x[N], smee. | Electrical.Machines.Examples.SynchronousMachines.SMEE_Rectifier, Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_Rectifier | +| simulate | 2 | Validation failed for signals: mpN.S.v, mpN.S.v | Electrical.Spice3.Examples.InvertersApartRecord, Electrical.Spice3.Examples.InvertersExtendedModel | +| backend | 1 | ArgumentError: The equations have at least one cycle. | Mechanics.MultiBody.Examples.Elementary.RollingWheel | +| backend | 1 | ArgumentError: invalid index: N of type FloatN | Electrical.Digital.Examples.RAM | +| backend | 1 | BoundsError: attempt to access N-element Vector{Matrix{IntN}} at index [N, N, N] | Electrical.Digital.Examples.MUX2x1 | +| backend | 1 | BoundsError: attempt to access Num at index [N] | Mechanics.MultiBody.Examples.Loops.PlanarLoops_analytic | +| backend | 1 | DirectRHS: structural imbalance in reduced system: N full_equations vs N unknowns. The mod | Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.PolyphaseTwoLevel_RL | +| backend | 1 | Error in region computation of IFN steam tables(p = N, h = N) | Fluid.Examples.Explanatory.MomentumBalanceFittings | +| backend | 1 | IFN medium function tsat called with too low pressure\np = -N Pa <= N Pa (triple point pre | Fluid.Examples.DrumBoiler.DrumBoiler | +| backend | 1 | ModelicaAssertionError: assertion violated at time N: | Mechanics.MultiBody.Examples.Constraints.UniversalConstraint | +| backend | 1 | ModelicaAssertionError: assertion violated at time N: Tank starts to overflow (level = hei | Fluid.Examples.AST_BatchPlant.Test.TankWithEmptyingPipe2 | +| backend | 1 | OverflowError: -N * -N overflowed for type IntN | Fluid.Examples.BranchingDynamicPipes | +| backend | 1 | The arguments u_min and u_max provided in the function call\n solveOneNonlinearEquation(f, | Media.Examples.PsychrometricData | +| backend | 1 | UnsupportedLowering: initialization equations that give a variable two values: N = N and N | Electrical.Machines.Examples.SynchronousMachines.SMPM_ResistiveBraking | +| frontend | 1 | FieldError: type OMBackend.SimulationCode.INLINE_IF_EQUATION has no field `…`, available f | Electrical.PowerConverters.Examples.ACAC.SoftStarter | +| frontend | 1 | UnsupportedLowering: a partial application of a function with a record input: data | Media.Examples.SolveOneNonlinearEquation.Inverse_sh_T | +| frontend | 1 | UnsupportedLowering: not a constant: (! rSFlipFlop_Qini) | Blocks.Examples.BooleanNetwork1 | +| frontend | 1 | UnsupportedLowering: not a constant: stack_cell[N][N]_SOCN | Electrical.Batteries.Examples.CCCV_Stack | +| frontend | 1 | generateInitialEquations: unexpected unexpanded OMBackend.SimulationCode.ARRAY_EQUATION in | Electrical.Batteries.Examples.CCCV_StackRC | +| simulate | 1 | Validation compared no signal: none of the N reference signals is in the solution | Utilities.Examples.readRealParameterModel | +| simulate | 1 | Validation failed for signals: // aimc.i_N_s, aimc.idq_rr[N], aimc.idq_rr[N], aimc.idq_sr[ | Electrical.Machines.Examples.InductionMachines.IMC_YDarc | +| simulate | 1 | Validation failed for signals: // smpm.stator.zeroInductor.iN, smpm.is[N] | Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_Braking | +| simulate | 1 | Validation failed for signals: Hw.x_scaled[N], Hw.x_scaled[N] | Blocks.Examples.Noise.DrydenContinuousTurbulence | +| simulate | 1 | Validation failed for signals: JN.D.v | Electrical.Spice3.Examples.CascodeCircuit | +| simulate | 1 | Validation failed for signals: PI.y | Clocked.Examples.CascadeControlledDrive.Continuous | +| simulate | 1 | Validation failed for signals: aimc.idq_rr[N], aimc.idq_rr[N], aimc.idq_sr[N], aimc.idq_sr | Electrical.Machines.Examples.InductionMachines.IMC_YD | +| simulate | 1 | Validation failed for signals: aimc.idq_sr[N] | Electrical.Machines.Examples.InductionMachines.IMC_Steinmetz | +| simulate | 1 | Validation failed for signals: energy.y, superCap.capacitor.v | Electrical.Batteries.Examples.SuperCapDischargeCharge | +| simulate | 1 | Validation failed for signals: fieldWeakeningController.vs, fieldWeakeningController.is, f | Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_FieldWeakening | +| simulate | 1 | Validation failed for signals: filter[N].x[N], filter[N].x[N], filter[N].x[N], filter[N].x | Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.ThreePhaseTwoLevel_PWM | +| simulate | 1 | Validation failed for signals: hbridge.iDCN | Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_RL | +| simulate | 1 | Validation failed for signals: imc.idq_rr[N], imc.idq_rr[N], imc.idq_sr[N], imc.idq_sr[N] | Electrical.Machines.Examples.InductionMachines.IMC_DCBraking | +| simulate | 1 | Validation failed for signals: inverter.ac.v, inverter.ac.i | Electrical.PowerConverters.Examples.DCAC.SinglePhaseTwoLevel.SinglePhaseTwoLevel_R | +| simulate | 1 | Validation failed for signals: lineN.vN, lineN.vN, lineN.iN, lineN.vN, lineN.vN, lineN.iN, | Electrical.Analog.Examples.Lines.CompareLosslessLines | +| simulate | 1 | Validation failed for signals: mnN.Dinternal, mnN.Dinternal, mpN.Dinternal, mpN.Sinternal, | Electrical.Spice3.Examples.Nor | +| simulate | 1 | Validation failed for signals: mpN.S.v, mpN.S.v, mpN.S.v, mpN.S.v | Electrical.Spice3.Examples.FourInverters | +| simulate | 1 | Validation failed for signals: r_mFe.mu_r, r_mFe.H | Magnetic.FluxTubes.Examples.BasicExamples.SaturatedInductor | +| simulate | 1 | Validation failed for signals: rectifier.pre_n[N].u, rectifier.pre_n[N].u, rectifier.pre_n | Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_DC_Drive | +| simulate | 1 | Validation failed for signals: smr.idq_rr[N] | Electrical.Machines.Examples.SynchronousMachines.SMR_DOL | +| simulate | 1 | stopTime N is past the end of reference Electrical_Analog_Examples_DifferenceAmplifier (N) | Electrical.Analog.Examples.DifferenceAmplifier | +| simulate | 1 | stopTime N is past the end of reference Electrical_Machines_Examples_SynchronousMachines_S | Electrical.Machines.Examples.SynchronousMachines.SMPM_NoLoad | +| simulate | 1 | stopTime N is past the end of reference Mechanics_MultiBody_Examples_RotationalNDEffects_B | Mechanics.MultiBody.Examples.Rotational3DEffects.BevelGear1D | + +## Models that simulate but do not validate + +- Blocks.Examples.Noise.DrydenContinuousTurbulence: Validation failed for signals: Hw.x_scaled[1], Hw.x_scaled[2] +- Clocked.Examples.CascadeControlledDrive.Continuous: Validation failed for signals: PI.y +- Electrical.Analog.Examples.DifferenceAmplifier: stopTime 1.0e-8 is past the end of reference Electrical_Analog_Examples_DifferenceAmplifier (9.9999999e-9) +- Electrical.Analog.Examples.Lines.CompareLosslessLines: Validation failed for signals: line1.v1, line1.v2, line1.i1, line2.v1, line2.v2, line2.i1, line2.i2, line3.v1, +- Electrical.Batteries.Examples.SuperCapDischargeCharge: Validation failed for signals: energy.y, superCap.capacitor.v +- Electrical.Machines.Examples.InductionMachines.IMC_DCBraking: Validation failed for signals: imc.idq_rr[1], imc.idq_rr[2], imc.idq_sr[1], imc.idq_sr[2] +- Electrical.Machines.Examples.InductionMachines.IMC_Steinmetz: Validation failed for signals: aimc.idq_sr[1] +- Electrical.Machines.Examples.InductionMachines.IMC_YD: Validation failed for signals: aimc.idq_rr[1], aimc.idq_rr[2], aimc.idq_sr[1], aimc.idq_sr[2] +- Electrical.Machines.Examples.InductionMachines.IMC_YDarc: Validation failed for signals: // aimc.i_0_s, aimc.idq_rr[1], aimc.idq_rr[2], aimc.idq_sr[1], aimc.idq_sr[2] +- Electrical.Machines.Examples.SynchronousMachines.SMEE_Rectifier: Validation failed for signals: capacitor1.v, capacitor2.v, filter.x[1], filter.x[2], smee.is[1], smee.is[2], s +- Electrical.Machines.Examples.SynchronousMachines.SMPM_NoLoad: stopTime 0.32 is past the end of reference Electrical_Machines_Examples_SynchronousMachines_SMPM_NoLoad (0.319 +- Electrical.Machines.Examples.SynchronousMachines.SMR_DOL: Validation failed for signals: smr.idq_rr[2] +- Electrical.PowerConverters.Examples.ACDC.RectifierBridge2mPulse.ThyristorBridge2mPulse_DC_Drive: Validation failed for signals: rectifier.pre_n[1].u, rectifier.pre_n[2].u, rectifier.pre_n[3].u, rectifier.pre +- Electrical.PowerConverters.Examples.DCAC.PolyphaseTwoLevel.ThreePhaseTwoLevel_PWM: Validation failed for signals: filter[1].x[1], filter[1].x[2], filter[2].x[1], filter[2].x[2], toPolar.y[1], t +- Electrical.PowerConverters.Examples.DCAC.SinglePhaseTwoLevel.SinglePhaseTwoLevel_R: Validation failed for signals: inverter.ac.v, inverter.ac.i +- Electrical.PowerConverters.Examples.DCDC.HBridge.HBridge_RL: Validation failed for signals: hbridge.iDC1 +- Electrical.Spice3.Examples.CascodeCircuit: Validation failed for signals: J2.D.v +- Electrical.Spice3.Examples.FourInverters: Validation failed for signals: mp1.S.v, mp2.S.v, mp3.S.v, mp4.S.v +- Electrical.Spice3.Examples.InvertersApartRecord: Validation failed for signals: mp1.S.v, mp2.S.v +- Electrical.Spice3.Examples.InvertersExtendedModel: Validation failed for signals: mp1.S.v, mp2.S.v +- Electrical.Spice3.Examples.Nor: Validation failed for signals: mn1.Dinternal, mn2.Dinternal, mp1.Dinternal, mp1.Sinternal, mp2.Dinternal, mp2. +- Magnetic.FluxTubes.Examples.BasicExamples.SaturatedInductor: Validation failed for signals: r_mFe.mu_r, r_mFe.H +- Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMEE_Rectifier: Validation failed for signals: capacitor1.v, capacitor2.v, filter.x[1], filter.x[2], smee.is[1], smee.is[2], s +- Magnetic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_Braking: Validation failed for signals: // smpm.stator.zeroInductor.i0, smpm.is[1] +- Magnetic.QuasiStatic.FundamentalWave.Examples.BasicMachines.SynchronousMachines.SMPM_FieldWeakening: Validation failed for signals: fieldWeakeningController.vs, fieldWeakeningController.is, fieldWeakeningControl +- Mechanics.MultiBody.Examples.Rotational3DEffects.BevelGear1D: stopTime 1.0 is past the end of reference Mechanics_MultiBody_Examples_Rotational3DEffects_BevelGear1D (0.4000 +- Utilities.Examples.readRealParameterModel: Validation compared no signal: none of the 3 reference signals is in the solution diff --git a/scripts/publish_coverage.jl b/scripts/publish_coverage.jl index 101426a..fb8f2ba 100644 --- a/scripts/publish_coverage.jl +++ b/scripts/publish_coverage.jl @@ -9,6 +9,9 @@ section of README.md (between its coverage markers). or results_noskip.jls of a no-skip run (every model through every phase, the registry's skips removed). [commits.txt] lists " " lines, one per package, as recorded when the run started; [note] is one line on how the run was made (e.g. "no-skip, 3 workers, 600 s per model"). +OMJL_COVERAGE_MSL (default "MSL:3.2.3", as scripts/run_full_coverage.jl) is the run's MSL version: +3.2.3 writes docs/COVERAGE.md and the README section between the coverage markers, another version +docs/COVERAGE_.md and the section between its own markers (coverage-:begin/end). =# using Dates @@ -25,6 +28,9 @@ const COMMITS = length(ARGS) >= 2 && isfile(ARGS[2]) ? const NOTE = length(ARGS) >= 3 ? ARGS[3] : "" const ROOT = joinpath(@__DIR__, "..") |> abspath const MEASURED = Dates.format(Dates.unix2datetime(mtime(ARGS[1])), "yyyy-mm-dd") +const VERSION_MSL = OLT.msl_library_version(get(ENV, "OMJL_COVERAGE_MSL", "MSL:3.2.3")) +const TOP_LEVEL = VERSION_MSL == OLT.TOP_LEVEL_MSL_VERSION +const COVERAGE_MD = TOP_LEVEL ? "COVERAGE.md" : "COVERAGE_$(VERSION_MSL).md" const ok = OLT.coverage_ok # the definitions the coverage site uses (src/site.jl) const reached = OLT.coverage_reached @@ -47,8 +53,8 @@ const FUNNEL = [(OLT.PHASE_NAMES[p], count(r -> reached(r, p), RESULTS)) for p i pct(n) = @sprintf("%.1f %%", 100n / N) function write_coverage(io) - println(io, "# MSL coverage of OM.jl\n") - println(io, "Measured $MEASURED: $N example models of the Modelica Standard Library, each run through OM.jl's ", + println(io, "# MSL $VERSION_MSL coverage of OM.jl\n") + println(io, "Measured $MEASURED: $N example models of the Modelica Standard Library $VERSION_MSL, each run through OM.jl's ", "pipeline (flatten, translate, simulate) and validated against the reference trajectories.", isempty(NOTE) ? "" : " $NOTE.", "\n") if !isempty(COMMITS) @@ -87,17 +93,18 @@ function write_coverage(io) end mkpath(joinpath(ROOT, "docs")) -open(write_coverage, joinpath(ROOT, "docs", "COVERAGE.md"), "w") +open(write_coverage, joinpath(ROOT, "docs", COVERAGE_MD), "w") #= The README's section between the markers: the headline numbers and a link. =# -const BEGIN_MARK = "" -const END_MARK = "" +const MARK = TOP_LEVEL ? "coverage" : "coverage-$VERSION_MSL" +const BEGIN_MARK = "" +const END_MARK = "" const readme_path = joinpath(ROOT, "README.md") const readme = read(readme_path, String) const section = string(BEGIN_MARK, "\n", - "Measured $MEASURED on $N MSL example models: ", + "Measured $MEASURED on $N MSL $VERSION_MSL example models: ", join(("$(lowercase(p)) $c ($(pct(c)))" for (p, c) in FUNNEL), ", "), - ". Per domain and what stops the rest: [docs/COVERAGE.md](docs/COVERAGE.md).\n", END_MARK) + ". Per domain and what stops the rest: [docs/$COVERAGE_MD](docs/$COVERAGE_MD).\n", END_MARK) occursin(BEGIN_MARK, readme) || error("README.md has no coverage markers ($BEGIN_MARK … $END_MARK)") write(readme_path, replace(readme, Regex("\\Q$BEGIN_MARK\\E.*?\\Q$END_MARK\\E", "s") => section)) -@info "Published" coverage = joinpath(ROOT, "docs", "COVERAGE.md") funnel = FUNNEL +@info "Published" coverage = joinpath(ROOT, "docs", COVERAGE_MD) funnel = FUNNEL diff --git a/scripts/publish_site.jl b/scripts/publish_site.jl index 982bdcf..846f121 100644 --- a/scripts/publish_site.jl +++ b/scripts/publish_site.jl @@ -9,7 +9,8 @@ the date is the one in its name (partial___.jls), else it [report.html] is the run's generate_report output, [COVERAGE.md] the analysis of scripts/publish_coverage.jl, [commits.txt] " " lines, [note] one line on how the run was made. An empty argument skips that part. OMJL_SITE_URL (optional) is the site's address, -shown in the badge snippet. +shown in the badge snippet. OMJL_COVERAGE_MSL (default "MSL:3.2.3", as scripts/run_full_coverage.jl) +is the run's MSL version: its runs go to its folder of the site (site_folder). =# using Dates @@ -24,9 +25,10 @@ const RESULTS_PATH = ARGS[2] const RESULTS = deserialize(RESULTS_PATH)::Vector{OLT.ModelResult} const NAMED = match(r"_(\d{4}-\d{2}-\d{2})_\d{4}\.jls$", RESULTS_PATH) const DATE = NAMED === nothing ? Date(Dates.unix2datetime(mtime(RESULTS_PATH))) : Date(NAMED[1]) +const VERSION_MSL = OLT.msl_library_version(get(ENV, "OMJL_COVERAGE_MSL", "MSL:3.2.3")) const COMMITS = isfile(arg(5)) ? [String(strip(l)) for l in eachline(arg(5)) if occursin(r"^\S+\.jl \S+$", strip(l))] : String[] -dir = OLT.publish_site(ARGS[1], RESULTS; date = DATE, report = arg(3), analysis = arg(4), +dir = OLT.publish_site(ARGS[1], RESULTS; version = VERSION_MSL, date = DATE, report = arg(3), analysis = arg(4), commits = COMMITS, note = arg(6), url = get(ENV, "OMJL_SITE_URL", "")) @info "Coverage site updated" run = dir funnel = OLT.coverage_funnel(RESULTS) diff --git a/src/site.jl b/src/site.jl index 754f35b..9691345 100644 --- a/src/site.jl +++ b/src/site.jl @@ -58,38 +58,77 @@ coverage_funnel(results::Vector{ModelResult}) = [PHASE_NAMES[p] => count(r -> coverage_reached(r, p), results) for p in SITE_PHASES] """ - publish_site(site, results; date = today(), report = "", analysis = "", commits = String[], - note = "", library = "MSL 3.2.3", url = "") -> String + site_folder(version) -> String -Add a coverage run to the static site in the directory `site` (created if missing) and rebuild -the index, the badges and the `latest` redirect. Runs are keyed by `date`: a second run of the -same date replaces the first. `report` is the HTML report of `generate_report`, `analysis` the -Markdown of scripts/publish_coverage.jl (docs/COVERAGE.md), `commits` lines such as +The folder of MSL `version`'s runs on the coverage site: the root (`""`) for 3.2.3, the version +covered first, `msl-` for another. +""" +site_folder(version::AbstractString)::String = + version == TOP_LEVEL_MSL_VERSION ? "" : "msl-$version" + +""" + publish_site(site, results; version = "3.2.3", date = today(), report = "", analysis = "", + commits = String[], note = "", library = "MSL ", url = "") -> String + +Add a coverage run of MSL `version` to the static site in the directory `site` (created if +missing), in the version's folder (`site_folder`), and rebuild that folder's index, badges and +`latest` redirect; every version's index links to the other versions. Runs are keyed by `date`: a +second run of the same date replaces the first. `report` is the HTML report of `generate_report`, +`analysis` the Markdown of scripts/publish_coverage.jl (docs/COVERAGE.md), `commits` lines such as "OMBackend.jl f661a4a", `url` the site's address (for the badge snippet). Returns the run's directory. """ -function publish_site(site::AbstractString, results::Vector{ModelResult}; date::Date = today(), +function publish_site(site::AbstractString, results::Vector{ModelResult}; + version::AbstractString = TOP_LEVEL_MSL_VERSION, date::Date = today(), report::AbstractString = "", analysis::AbstractString = "", commits::Vector{String} = String[], note::AbstractString = "", - library::AbstractString = "MSL 3.2.3", url::AbstractString = "") + library::AbstractString = "MSL $version", url::AbstractString = "") local run = Dict{String, Any}("date" => string(date), "models" => length(results), "note" => String(note), "commits" => commits) for (p, c) in coverage_funnel(results) run[p] = c end - local dir = joinpath(site, "runs", string(date)) + local folder = site_folder(version) + local here = joinpath(site, folder) + local dir = joinpath(here, "runs", string(date)) mkpath(dir) isempty(report) || cp(report, joinpath(dir, "report.html"); force = true) open(io -> TOML.print(io, run; sorted = true), joinpath(dir, "summary.toml"), "w") write(joinpath(dir, "index.html"), _site_run_page(run, isempty(analysis) ? "" : read(analysis, String), !isempty(report), library)) - local history = filter(r -> r["date"] != run["date"], site_history(site)) + local history = filter(r -> r["date"] != run["date"], site_history(here)) push!(history, run) sort!(history; by = r -> r["date"], rev = true) - open(io -> TOML.print(io, Dict("runs" => history); sorted = true), joinpath(site, "history.toml"), "w") - _write_site_index(site, history, library, url) + open(io -> TOML.print(io, Dict("runs" => history); sorted = true), joinpath(here, "history.toml"), "w") + local versions = _site_versions(site) + _write_site_index(here, history, library, url, versions, folder) + #= The other versions' indexes, for their links to this one. =# + for (label, other) in versions + other == folder && continue + local d = joinpath(site, other) + _write_site_index(d, site_history(d), label, url, versions, other) + end return dir end +#= The MSL versions with runs on the site, as (label, folder) pairs: 3.2.3 at the root first, + then the msl- folders. =# +function _site_versions(site::AbstractString)::Vector{Tuple{String, String}} + local versions = Tuple{String, String}[] + isfile(joinpath(site, "history.toml")) && push!(versions, ("MSL $TOP_LEVEL_MSL_VERSION", "")) + for d in sort(readdir(site)) + local m = match(r"^msl-(.+)$", d) + m !== nothing && isfile(joinpath(site, d, "history.toml")) && push!(versions, ("MSL $(m[1])", d)) + end + return versions +end + +#= The link from the index of `folder` to the index of `target` (folders of _site_versions). =# +function _site_link(folder::AbstractString, target::AbstractString)::String + local up = isempty(folder) ? "" : "../" + isempty(target) && return isempty(up) ? "./" : up + return "$up$target/" +end + """ site_history(site) -> Vector{Dict{String, Any}} @@ -122,7 +161,8 @@ function _write_badge(path, label, n, total) ", \"color\": ", _json_string(_badge_color(_site_pct(n, total))), "}\n")) end -function _write_site_index(site, history, library, url) +function _write_site_index(site::AbstractString, history::Vector{Dict{String, Any}}, library::AbstractString, + url::AbstractString, versions::Vector{Tuple{String, String}}, folder::AbstractString) local latest = first(history) _write_badge(joinpath(site, "badge.json"), "$library validate", latest["validate"], latest["models"]) for p in SITE_PHASES @@ -135,7 +175,7 @@ function _write_site_index(site, history, library, url) Latest coverageLatest coverage: $(latest["date"]) """)) touch(joinpath(site, ".nojekyll")) # plain files, no Jekyll build - write(joinpath(site, "index.html"), _site_index_page(history, library, url)) + write(joinpath(site, "index.html"), _site_index_page(history, library, url, versions, folder)) end const _SITE_CSS = """ @@ -152,7 +192,7 @@ main { max-width: 960px; margin: 0 auto; padding: 24px 16px 48px; } h1 { font-size: 1.6em; margin: 0 0 4px; } h2 { font-size: 1.2em; margin: 32px 0 8px; } p.lead, .muted { color: var(--muted); } a { color: var(--accent); } -nav { margin-bottom: 16px; } nav a { margin-right: 16px; } +nav { margin-bottom: 16px; } nav a, nav strong { margin-right: 16px; } .table-wrap { overflow-x: auto; } table { border-collapse: collapse; width: 100%; font-variant-numeric: tabular-nums; } th, td { text-align: right; padding: 6px 8px; border-bottom: 1px solid var(--line); white-space: nowrap; } @@ -222,9 +262,15 @@ function _site_trend(history) return String(take!(io)) end -function _site_index_page(history, library, url) +function _site_index_page(history::Vector{Dict{String, Any}}, library::AbstractString, url::AbstractString, + versions::Vector{Tuple{String, String}}, folder::AbstractString) local latest = first(history) local io = IOBuffer() + if length(versions) > 1 + println(io, "") + end println(io, "

OM.jl coverage of the $(html_escape(String(library))) examples

") println(io, "

Each experiment model goes through OM.jl's pipeline: flatten (frontend), translate (backend), ", "simulate, and validate against the reference trajectories. Measured by ", @@ -243,7 +289,8 @@ function _site_index_page(history, library, url) println(io, "") println(io, "

Badge

The share of models that validate in the latest run ", "(badge.json; badges/<phase>.json per phase), for a README:

") - local base = isempty(url) ? "<this site>/" : html_escape(String(rstrip(url, '/') * "/")) + local base = isempty(url) ? "<this site>/" : + html_escape(String(rstrip(url, '/') * "/" * (isempty(folder) ? "" : "$folder/"))) println(io, "
[![Coverage](https://img.shields.io/endpoint?url=$(base)badge.json)]($base)
") return _site_page("OM.jl coverage", String(take!(io))) end diff --git a/test/siteTests.jl b/test/siteTests.jl index e99ccf8..21d48df 100644 --- a/test/siteTests.jl +++ b/test/siteTests.jl @@ -37,5 +37,20 @@ using TOML @test isfile(joinpath(site, "badges", "frontend.json")) local index = read(joinpath(site, "index.html"), String) @test occursin("runs/2026-10-04/report.html", index) && occursin("", index) # one version: no links to others + + #= Another MSL version: its own folder, history and badges; the indexes link each other. =# + @test OLT.site_folder("3.2.3") == "" && OLT.site_folder("4.1.0") == "msl-4.1.0" + local dir4 = OLT.publish_site(site, results[1:3]; version = "4.1.0", date = Date(2026, 10, 12), + url = "https://example.org/cov") + @test dir4 == joinpath(site, "msl-4.1.0", "runs", "2026-10-12") + @test [r["date"] for r in OLT.site_history(joinpath(site, "msl-4.1.0"))] == ["2026-10-12"] + @test [r["date"] for r in OLT.site_history(site)] == ["2026-10-04", "2026-10-03"] # 3.2.3 untouched + @test occursin("\"label\": \"MSL 4.1.0 validate\"", read(joinpath(site, "msl-4.1.0", "badge.json"), String)) + @test occursin("\"label\": \"MSL 3.2.3 validate\"", read(joinpath(site, "badge.json"), String)) + local index4 = read(joinpath(site, "msl-4.1.0", "index.html"), String) + @test occursin("MSL 3.2.3", index4) && occursin("MSL 4.1.0", index4) + @test occursin("https://example.org/cov/msl-4.1.0/badge.json", index4) + @test occursin("MSL 4.1.0", read(joinpath(site, "index.html"), String)) end end