I would say that the OOP paradigm can be quite useful when doing simulations; particularly if you’re having to simulate different types of “things”. For example, one might simulate a generic pump, and then later, decide that pump is a multi-stage centrifugal pump. Most methods that work on a generic pump will apply to multi-stage centrifugal pumps, so you’ll want to inherit the measurements, specifications and prediction routines of a generic pump, and add a few specific measurements, specs, and prediction routines for specialization.
However, not all things are cut-and-dry inheritable, and it’s nice to be able to pick and choose what fields to inherit. In fact, from what I understand, inheritance is falling out of favor against interfaces/decorations for reasons like this. Things like “calculate pressure drop” might be quite different for a shell-and-tube heat exchanger vs a plate heat exchanger. So while inheritance can be useful, it can quickly turn into a square peg that you try to hammer into a pentagonal hole. Julia doesn’t have an “inherit” functionality out of the box, but it only took me (more of an engineer than a programmer) a couple of days to figure out Julia’s metaprogramming well enough to build my own inheritance functionality (that allows me to pick and choose what to inherit).
Not only that, I’m able to dispatch different “sim_predict!” functions so I can apply a “generic heat exchanger” prediction with the added operations I would need for a shell-and-tube predictor. It also allows me to “reach into” the “sim_predict!” for generic heat exchangers and swap in methods like “get_flow_resistance” for different kinds of heat exchanger so that the generic method is still applicable. It’s only when you try to build out simulations with swappable components that you realize how quickly multiple dispatch can make your life simpler. It allows you to say “do_operation_x” and allowing the “how” depend on the “what” at great detail in a simpler manner than OOP (which would require me to assign all the methods as interfaces).