This is possible with the very popular and amazing molecular addon by Jean-Francois Gallant:
It builds on the Blender particle system, but normally, particles are not real objects, they are only for visual representation, like sparks or rain drops, or smoke, where it is not noticed when they pass through one another.
The molecular addon makes each particle a real object and can adds bonds with others (which act like springs or shock absorbers), which can be cut, when the links become overstressed to a definable point and thus tear or can recombine together again when they touch (simulation of stickiness)
This video shows a summary what is possible with this, showing all the different facets:
I find especially the rope example mind blowing, how many small particles can be "woven" into strings, also this method allows for objects to have volume which can be broken open and spill.
This is a further example of this, how many particles can become fluid like:
You just create a particle system and then have an extra settings section
where you can define all these parameters, there are quite a few tutorials on youtube.
As you can define specific weight of the particle in kg per meter cubed, you could demonstrate the Archimedes principle very nicely by using a lower density particle system and then drop a higher density one into it, seeing the displacement.
The only drawback that the addon has is that it does not support GPU acceleration and neither uses all your CPU cores. It is restricted in speed due to this, I don't understand the reasons exactly, but the author told me that these calculations cannot be parallelized, a general problem in physics simulations, since one calculation depends on the result of the one that came before it. CPUs with high individual core speeds (even through overclocking) benefit this addon greatly.
I would recommend that you start with a low particle count for initial simulation and then raise the amount for the final calculation.