When I was elementary school age in the late 70s, I'd go into her office with her sometimes on school holidays that were not work holidays. She'd let me play Colossal Cave Adventure on a terminal in her office. I remember looking at printouts of code she was working on, and seeing a wireframe diagram of some futuristic plane. I think it must have been one of the first Stealth fighters. I wonder how many security protocols she broke by having me there... :)
She passed a way many years ago, but I think she would have been excited to see work like this.
I used to take my daughter into the SCIF when she was about 2 when needed, and there was a week where I was took my son into work at the Pentagon.
I working for Snake Clark at the time and people kept bringing him candies and treats. I think he was watching cartoons on Nick in the deputy’s office most of the day. He gets a kick out of that story now.
I interviewed at LANL early in my career, and I was struck by how much security there was. My mom's office was nowhere close to that level of security.
Plenty of shenanigans in JSOC scifs that wouldn’t fly on NSA campus.
Your mom was awesome :)
> The program requires a minimum of a 12MHz 80286, 1MB RAM, DOS 5.0 or DR DOS, one 1.2MB 5 1⁄4" or 1.44MB 3 1⁄2" disk drive, hard drive with 11MB of free disk space, and VGA graphics. In addition, Falcon3.O supports a joystick, a joystick with a throttle, dual joysticks, rudder pedals or the ThrustMaster controls. The game also supports a mouse and various sound cards, including the Ad Lib, Sound Blaster and Roland. The 80x87 math coprocessor is supported for the HighFidelity flight model.
> Optimal system requirements are a 20MHz 80386 system or faster, 80x87 math coprocessor, 4MB RAM with EMS (expanded memory), DOS 5.0 or DR DOS, one 1.2MB 51⁄411 or 1.44MB 31⁄2" disk drive, hard drive with 11MB of free space, a 16-bit VGA card, a mouse and a joystick.
* https://vtda.org/docs/computing/SpectrumHolobyte/Falcon_3.0_...
* https://en.wikipedia.org/wiki/Falcon_3.0
"Wow!" we thought at the time.
I remember being so excited when Falcon 3.0 came out. But it just felt like a let down. The graphics were amazing for the time and it seemed so realistic, but for me the realism is what killed all the fun. As a kid, I didn't actually want to BE an expert F16 pilot. I just wanted to feel like I was. I didn't want to have to learn all the systems and controls.
I think that magic is now gone, back then playing games was a bit like reading a book, we had to make use of our imagination to compensate for the lousy graphics, especially when being able to visit arcades.
Then suddenly having computers at home with similar arcade like graphics felt like the future.
Now we get real time rendering without useful gameplay, in many AAA games.
I mean, the software itself is impressive. But the idea of grown adults geeking out over old versions of the NATOPS and trying to develop tactics and such is frankly cringe. You're never going to get it right, because the actual thing is classified. And from the outside looking in, it's like watching a kid put on Dad or Mom's suit jacket to play "office."
But things like Ace Combat, "H.A.W.X", War Thunder, Project Wingman, Nuclear Option, all those games are incredibly popular. The arcade combat genre is alive and well.
I do wish games like VTOL VR, DCS, and other more serious sims had a "maybe don't make me read 700 pages of manual to lock and fire a missile" option. Even something as simple as VTOL VR telling me exactly what machine my targeting pod is locked onto would be nice. Just give me a name and basic specs. It's a damn game, I shouldn't need to memorize target silhouettes unless I want to.
IL-2 Sturmovik: Great Battles actually does this well, with an entire page of "simplify things please" options.
Except for the stuff leaked on the War Thunder forum.
I get your point but come on man, ease up. At least remember that some of those DCS-playing wage slaves helped fund your adventures.
That aside, I kind of weirdly liked it. The story was hard as hell to follow, but the setting was interesting in a trippy way.
I guess they probably came up with a new version, dunno.
However, I'm not sure how many different compatibility models were being targeted.
Granted, I probably would've had an easier border crossing if I didn't have a flight map for Kuwaiti airspace, complete with markings for anti-air defenses in the backseat of my car that one time, but it was _still_ worth it :)
Air density can become pliable, controllable. Thrust velocities match projectile spec velocities (m/s) making calculating intersect a breeze. Trust me, you want to convert the FORTRAN math into standard metric. They didn't believe in Base10 back then so do the math.
I wanted to keep the data tables exactly the same in the C# translation. While formulas can be converted to metric easily, the data tables do not actually have units defined for any of them, so translating them to metric is non-trivial. And the way data is mixed from multiple tables is very complex. So verifying that the calculations have equivalent results in metric is well beyond my ability.
Or rather, the best way to verify it would be to write a flight model that uses customary units (what I describe in the article), and then use that to verify that the metric flight model is equivalent.
At the end of the day, only the inputs and outputs of the flight model need to be converted, which is just handful of multiplication operations. The flight model is very cheap to run, even with conversions at runtime.
I know it sounds daunting. Making a painting does too to someone who doesn’t paint. However, there are steps you can follow that make it super easy to create masterpieces and all the greats follow the same process.
So where you translate ft to m or slug/ft to slug/m or however - the surrounding math is perfect for a unit test. Keeping you from having to build another flight model and do analog mark-2 eyeball testing.
You could just leave it - someone will pick it up and do the work.
*EDIT* I ran some of it through my models and converted AirDataComputer to Kelvin, kg/m, m/s:
public class AirDataComputer {
/// <summary>
/// Density at sea level in kg/m³ (standard atmosphere)
/// </summary>
public const float SeaLevelDensity = 1.225f;
/// <summary>
/// Max altitude in meters
/// </summary>
public const float MaxAltitude = 10668.0f; // ~35,000 ft in meters
/// <summary>
/// Calculates air data based on velocity and altitude using SI units
/// </summary>
/// <param name="velocity">Velocity in m/s</param>
/// <param name="altitude">Altitude in meters</param>
/// <returns>Air data</returns>
public AirData CalculateAirData(float velocity, float altitude) {
const float baseTemperature = 288.15f; // Sea level temp in K (~15°C)
const float minTemperature = 216.65f; // Tropopause temp in K (~ -56.5°C)
const float temperatureGradient = 0.0065f; // Lapse rate in K/m
const float gamma = 1.4f; // Ratio of specific heats
const float gasConstant = 287.05f; // J/(kg·K), specific gas constant for air
const float densityPower = 4.14f;
altitude = Mathf.Clamp(altitude, 0, MaxAltitude);
// Calculate temperature in Kelvin using linear lapse rate model
float temperatureFactor = 1.0f - (temperatureGradient * altitude / baseTemperature);
float T = Mathf.Max(minTemperature, baseTemperature * temperatureFactor);
// Speed of sound in m/s
float speedOfSound = Mathf.Sqrt(gamma * gasConstant * T);
float altitudeMach = velocity / speedOfSound;
// Air density using barometric approximation
float rho = SeaLevelDensity * Mathf.Pow(temperatureFactor, densityPower);
// Dynamic pressure in Pascals (N/m²)
float qBar = 0.5f * rho * velocity * velocity;
return new AirData() {
altitudeMach = altitudeMach,
qBar = qBar
};
}
A nautical mile is ~6,076 feet or exactly 1,852 meters (???).
That is actually defined by distances on Earth (which is of course an approximation, but still ...). So, 1 nautical mile equals to one minute in the 90 degrees hemisphere arc. It's approximately 10k km from equator to the pole, so 10,000km/90/60 equals 1.852km.The nautical mile is not an SI unit, so it is not defined by a single organization, Your definition used to be the common definition, but it seems like the relevant organizations has updated the definition to be exactly 1852 m. If the original definition of the meter applies, then it would have been 1851.85 or 15 cm shorter, but with newer measurement of the earth, it would have been more like 1855 m.
"In 1929 the International Hydrographic Bureau obtained an agreement from a large number of countries to adopt a value of 1852 metres for the nautical mile, the unit thus defined to be called the International Nautical Mile."
* https://usma.org/laws-and-bills/adoption-of-international-na...
* https://en.wikipedia.org/wiki/International_Hydrographic_Org...
But there was no treaty or anything with a fancy ceremony, just a 'handshake', and so it was up to each country to adopt it with a domestic law or regulation, which (e.g.) the US did in 1954:
* https://usma.org/wp-content/uploads/2015/06/Nautical-Mile.pd...
Previously in the US it was 1853.25 m (because the US is actually metric "officially": all of its customary units (ft, oz) are defined in terms of metric equivalents):
I'm hoping they know that the language's name comes from FORmula TRANslator...
That is such a useful feature! Surprised I haven’t seen that more often. So much fiddly code exists that’s just fixing offsets to conform to 0 (or 1 for Lua) -based indexing!
// This also supports multidimensional arrays, that is why the parameters are arrays.
var array = Array.CreateInstance(elementType: typeof(Int32), lengths: [ 5 ], lowerBounds: [ -2 ]);
// This does not compile, the type is Int32[*], not Int32[].
// Console.WriteLine(array[0]);
array.SetValue(value: 42, index: -2);
Console.WriteLine(array.GetValue(-2));
https://github.com/sourceryinstitute/fidbits/blob/master/src...
https://fortran-lang.discourse.group/t/just-say-no-to-non-de...
Hence why the whole base index discussion only became relevant in C based languages.
You're confusing the definition of the language with the implementation. In implementation you're right, most runtimes will treat arrays starting at 1 as a special case and optimize that access. The language itself doesn't make that distinction though. Here an array is simply any table indexed by integers. The documentation states it's thusly:
You can start an array at index 0, 1, or any other value
The more you go away from raw pointer semantics the less intuitive it gets.
Yeah, that's mixing both of them. Wouldn't it work as well if they all used 1-based indexing or 0-based indexing? Sounds like the issue was that algorithms/stuff underneath wasn't 1-based.
Perhaps I've been influenced by writing a lot of code in assembler, way back when, but zero-based has always seemed completely natural to me, to the extent that I find it very hard to understand algorithms expressed in non-zero based code.
arr: array[-2..10] of integer;
pointer(@arr) == pointer(@arr[0])
Or you can use descriptors (dope vectors), but that involves quite an overhead. The books on compilers from the 70s (e.g. Gries's "Compiler construction for digital computers") have rather extensive discussions on both approaches.> The books on compilers from the 70s (e.g. Gries's "Compiler construction for digital computers")
Yellow cover, I think? My then GF bought it for Xmas at about 1984 or so. Not the best book on the topic, IMHO.
Now to get the 3rd element from array, you have to know the start index, so another parameter to pass to function.
EDIT (for more explanation): I have an input value from -10 to 100. I want to use this value to lookup something in a table. IN a ero indexed world I have to know what the lowest value is and subtract that from the input value to get to zero (so "another parameter to pass to function").
With an arbitrary start index the array is just indexed from the lowest value (-10). There is nothing more needing to be passed in.
I know it's fashionable in some circles to dump on everything non-metric, but these things are they way they are because of reasons, and airspeed is generally measured in either knots or Mach.
I'm just annoyed that so many educational resources and even flight code still use customary units for everything. I believe that metric should be used for all internal calculations and knots should only exist at the UI layer for the pilot.
When I play flight games though, I only have intuition for speed in terms of knots. Like 150 kts is takeoff speed and 400 kts is the corner speed.
I just think that the pilot letting out a spool of knotted rope from their plane is a very silly practice to defend :)
At least nautical miles and knots have some use on this planet specifically...
boatspeed is also measure in knots... but only very rarely in Mach (and not even primarily because the speed of sound in water is substantially higher than in air)
It also tends to be more of a standard in professional aviation, whereas some small civilian bugsmashers in the US use MPH, presumably because it's easier for the doctors and lawyers of the world to understand after driving their cars, and if you're VFR, who really cares?
Nautical miles and knots were present in long range navigation, especially oceanic
In the words of Jerry Maguire: "You had me at hello."
This early sentence really hooked me:
> While I am a professional software engineer and I have worked in the aerospace industry, that doesn’t mean that I understand what I’m doing.
My favourite part: The image comparing X/Y/Z axis between different 3D modelling products: https://vazgriz.com/wp-content/uploads/2025/05/EmVSW5AW8AAoD...Plus the comment below can make you laugh hard enough to get Coca Cola up your nose!
> Mathematically speaking, these are all equally valid. But we all know that Unreal made the worst possible choice
Imagine trying to keep track of pounds in a single set of equations using subscripts m and f to differentiate between the units’ use for both mass and force.
I was able to coerce Fortran's type system into checking units, but it comes with quite a few downsides: https://fortran-lang.discourse.group/t/compile-time-unit-che...
An approach based on static analysis would not have the downsides I listed, but I personally would prefer being unable to compile the code at all if it had an error that could be detected.
In my experience in both the aerospace industry and the video game industry, there are no tools like this in use. In aerospace specifically, errors like that are caught by manual human review, including third-party validation companies. Unit tests are used to sanity check every calculation. And finally, everything is run in a flight simulator before ever going onto a real aircraft.
In video games however, it's the wild west. Math errors there are funny, not deadly.
Aircraft altimeters are based on air pressure. The reference pressure is variable based on atmospheric conditions and is decided by controllers, or in the case of uncontrolled airspace, the matching the altimeter of the known altitude that you took off from.
All that is to say, on my home (uncontrolled) airport which is ~10 feet above sea level, I occasionally land at a negative altimeter value since the weather conditions have changed while I am in the air.
Assuming that an altimeter reading must be positive is a bad assumption.
In rust I'm familiar with https://docs.rs/uom/latest/uom/ and typescript I've seen safe-units https://jscheiny.github.io/safe-units/ used.
Uhm...
https://www.c-130.net/forum/viewtopic.php?p=9974&sid=bb425b3...
You want to measure how much air mass is in a given volume? That’s gonna be slugs/ft3.
"A Sami measurement of distance; the distance a reindeer can travel before needing to stop to urinate. Today used to describe something that is at a very obscure distance away" (approximately 7.5 km)
https://en.wikipedia.org/wiki/Obsolete_Finnish_units_of_meas...
[1] https://en.wikipedia.org/wiki/List_of_non-coherent_units_of_...
[2] https://en.wikipedia.org/wiki/List_of_humorous_units_of_meas...
From then on, any estimated distance was done in EDs.
A serious spacecraft simulator. Likewise developed from ancient FORTRAN code, in this case ported to C.
Modern fortran has a bit more modern flavour to it, but formulae being so verbose would make the "formula" aspect of a code disappear.
We were educated doing these things on paper with pages and pages of math with these symbols.
20 years later I can still read just this fortran code and guess most of what's going on with no context needed.
I have problems reading "developer code" that boil down to "where the hell is the part of the code that actually does something?!" being perpetually lost in layer among layer of abstraction with the relevant connecting pieces far far apart.
https://en.wikipedia.org/wiki/Shake_(unit)
I am pretty firmly in the Z-up camp, I mean I understand the Y-up camp, take a normal picture, or perhaps a side-scroller game, Y is up and down, the logical extension to three dimensions is to push z as depth. But I can't do it, I see X and Y as a in a map where the obvious Z direction is up and down. yes minecraft triggers me so hard, don't even get me started.
I later added the high fidelity flight dynamics model by translating C code.
Is that video game character walking 100 yards? Or maybe the character is 500 feet tall and he's walking 50 leagues?
This is why scale model sets for practical VFX in cinema were always recorded at higher frame rates and then played back slower.
The acceleration defined to simulate gravity in this Fortran code is presumably already proportional to everything else defined in the simulation.
That's the point of my question.
PS: The time for SMRs was 40 years ago. Renewables radically transformed the economics such that only fusion reactors, geothermal, and tidal are part of a short list of viable alternatives because fossil fuels and fission need to go the way of whale oil and hunting passenger pigeons.