davidson16807 / tectonics.js

3d plate tectonics in your web browser
http://davidson16807.github.io/tectonics.js/
Creative Commons Attribution 4.0 International
204 stars 28 forks source link

Information about the Model #47

Open OmegaRogue opened 4 years ago

OmegaRogue commented 4 years ago

I'm working on something similar in C# and HLSL with UnityEngine, currently mostly based off of Lauri Viitanen's simulation PlaTec, but the Plate collision logic there seems weird. How does this Simulation work? How does it handle Plate Movement?

davidson16807 commented 4 years ago

Hi there!

Plate motion starts with crust age. The model stores the composition of crust in terms of felsic and mafic components, and the density of the mafic component varies as a function of age. The density of crust is used to determine the buoyancy of crust, and the gradient of buoyancy is used to approximate a velocity map. This gives some idea where the crust ought to go, but it does not represent the actual flow, since plates are modeled as rigid bodies. Instead, the velocity map is passed to an image segmentation algorithm that is used to define plate boundaries. The actual velocity is determined from buoyancy along the plate boundaries. If buoyancy falls below zero it indicates the crust is sinking, and that means it's going to pull the rest of the crust with it, so we take the magnitude of the buoyancy and multiply it by the 2d surface normal of the plate boundary to get an estimate for a single grid cell, then average all those estimates across the plate to get the velocity for that single plate.

That's a huge info dump so I'm happy to take questions if you have them. I think this is the best approach that's currently offered by any non-academic tectonic simulator, but it still has issues that occasionally pop up. The biggest one iirc is that there's no concept of compression within the model, so colliding continents will occasionally bleed past one another in the right circumstances. I'm currently working on a port of the model to C++ and have recently considered ways of addressing this oversight, so please let me know if you're interested in collaborating to find a better model.