Well, the issue I have with a simplistic model is that there is no slider bar between "realistic" and "simplistic". You either model a solid as a rigid body or you don't. You either have fluid pressure or you don't. You can skip minutiae, but you can't skip the big picture.
I always program following the philosophy "complexity does not follow simplicity, it precedes it." I'm not a particularly experienced programmer, so I'm not always able to immediately see what patterns will work and what patterns will not. Same goes for terrain generation. Sure, I could make a simple model look good in theory, but that's if I had years of experience examining and looking at the methods and results of other terrain generators.
As for magma flow, I admit, it is rather esoteric not well understood. My primary intent was to test to see if I could get decent looking plates by using randomized seed magma temperatures, not to realistically model magma convection. If I figured out that much, then further development in any magma-related features (i.e. rifts, volcanoes, partial melts, igneous intrusions, etc...) would be a lot easier to fit in with a unified framework.
Currently though, this project is on the backburner for me (once again, I'm going to wait until after I've learned the requisite maths to grapple with this). The whole project hinges on a realistic model of plate tectonics; after all, IMO terrain generation has pretty much been covered in detail for pretty much all other parts. Take a look at the DF terrain generator; it has everything I plan for with the sole exception of plate tectonics. So why back out of plate tectonics? (well actually, discounting igneous rock differentiation and certain special rock interactions, such as limestone forming karst topography)
EDIT:
Also, some more background information (I honestly haven't thought much about this project in a while, I've forgotten some of the things that I've thought through already). One benefit to keeping interactions as local as possible is the ability to multi-thread my calculations, or pass them off to the GPU (there's this really cool new technology which allows GPUs to do other intensive parallel calculations like physics simulators; look up OpenCL).
Why I don't just stack plates on top of one another is actually a result of one of my biggest gripes with noise-generated heightmaps. There are no "mountain ranges" there are only giant mounds of rock labeled "mountains". ffs I want my terrain generator to generate mountain peaks and mountain passes, not a giant mound of rock. The difference between hills and mountains in the real world (tm) is that mountains are generated under much more extreme stress; so instead of simply deforming plastically, rock at some points actually buckles becomes weak points for stress to be released. This pushes up sharp peaks instead of rounded mounds. There is no way I can see that being simulated in any way other than actually modeling stresses and strains.
That is not entirely true and besides you don't want to model it as a rigid body because plates deform under stress and you already admitted you want volcanoes and plates rifting, all of which are incompatible with a rigid body.
Take for example the following approximation for the stresses:
Each plate has a plate center,
Pi,c which is essentially just an abstract designator that doesn't really have a physical meaning.
We can then define a plate influence function for plate P
i as I
i(
r) = |
r-
Pi,c|, essentially the length of the vector from the plate's center to the point
r.
Using this influence function we can define the stress scalar between two plates i and j as S
s,i,j(r) = (max{I
i(
r)*rig
i(
r),I
j(
r)*rig
j(
r)}/min { I
i(
r)*rig
i(
r),I
j(
r)*rig
j(
r) })
(rigi(r)+rigj(r))/2 with rig
i(
r) the rigidity function for plate i. The stress scalar function is essentially composed of 2 hyperbola-like functions squashed together. The rigidity scalar pretty much defines how far the stress of the far plate penetrates into the near plate and also moves the location of the plate boundary further from the hardest plate. A very high value for rig(
r) around a plate edge (there where I
i(
r) = I
j(
r)) means the stress scalar drops very steeply, while a low value for rig(
r) means the stress will be felt very far from the plate edge. A decent first approximation for rig(
r) would be to just use perlin noise, but you could also use a more complicated function for this.
Now, each plate also has a translational vector
v and a rotational vector
O which is per definition equal to
O = omega*(
r-
Pi,c), so one only needs to track the angular velocity omega. We can then define the total stress vector as
s(
r) =
v +
O. The binary compressive stress is then equal to: s
i,c = S
s,i,j(
r)(
si(
r)-
sj(
r))*norm(
Pj,c-
Pi,c), with * the dot product operator and norm() the normalization function for a vector (which yields a vector with the same direction but a length of 1). The local shear stress can be modeled in the same way, but instead using the normalized vector perpendicular to
Pj,c-
Pi,c.
This model (or actually the one generalized to work with an arbitrary number of plates, which should be trivial) should give you voronoi-like plates for a constant rigidity function, with stress dependent on the relative angular and rotational velocities of the plates and stress drop-off dependent on the rigidity of the plates. If you'd however use a non-constant rigidity function, say a perlin-based function or one based upon a real model of the rock properties, you'd get twisted plate edges and a seemingly chaotic stress function. Said stress function can then be used to determine the shape and types of geological phenomena found in the model.
Several extensions to the model are possible. The first and most obvious is to add a time-variant component to the velocities. One way to do that is to take the net vector of all stresses working on a plate scaled with the local influence and rigidity function, and use that to modify the rotational and translational velocities. By adding magma-induced stress (via a perlin noise function or a true magma model) you can keep the plates moving unpredictably and prevent them from reaching equilibrium.
Magma-induced stresses could also be used to generate plate fracturing. First thing would be to add a time component to the stresses which causes a gradual transition from one stress to another. Then you generate new plate centers according to a magma-based function and keep them for some time. If a center causes enough stress it will cause a rupture and you keep it, otherwise you reject it and generate a new center.