Density vs Temperature:
Hot smoke particles are less dense only if you use the Temperature Expand (which is by default used).
As hot gas expands it cools down faster and the density becomes less. However if more cool gas assembles in one spot the density becomes higher again but the temperature stays the same.
To reheat surrounding particles you would use the Temp. Diffusion as well as the cooling rate.
This is based on physics behavior as close as possible and it still gives you all artistic freedom to do whatever you want.
About Spawn particles
TP's Spawn automatically corrects for density which is pretty complex and unique as the function adds new particles to the solver without you noticing it.
Vorticity is controlled by simulation physics and cannot be controlled by individual particles by definition.
Whirls happen based on physics and are averaged out throughout the grid.
There is no “one” vorton particle - there are hundreds or thousands of them contributing to the whole fluid motion.
The Smoke Atmospheric can be used without the solver - just don't set the solver.
There won't be any dynamics (including no cooling), but with the Temperature data channel you can drive the TRange color gradient, and the color data channel is used as a filter for the gradient color.
The “Move” parameter in atmospheric disturbance is simple a fixed noise structure move in x axes, to get a other noise structure sector on the same position. If you want a initial seed.
You use the spacing parameter to get a correct looking behavior depend on the particle count, that use of this parameter is ok. Than you use spawning to get more particle and make it denser, but you notice that the behavior changed with more spawning particles. Exact therefore is the “Spacing” parameter there, to get more particle without (nearly) losing the overall behavior. If you double the count in the particle generator you must double the spacing value too, so you have nearly the same behavior but with double particles. The renderer also use this value to adjust the density you see in the rendering, that means if you already have adjust the right density for rendering with low particles you don't have to adjust it again with more particles if you use the spacing value.
The ground idea about the spawning is to hold a specific particle density when the particle drifted apart, not to get a overall density, so the density will not reduced per new spawning particle.
The second method with doubling the generator count and spacing, is the right way to get a overall more particles
The spawning is the try to hold the particle resolution after the particle drifted apart from each other at a while. This is local effect on places where new particle needed, that is dynamic over time and position, the spacing parameter is a overall factor for every particle fixed over time an position. So you can't get the right spacing value for all spawning regions without not editing at the same time other regions.
Vorticity Going Up or Down
there should be no difference between going down and up smoke, realistic vorticity values are 0.1 - 1.0, you can make a test with temperature 0.0, set derivation to 10 and then to -10 with buoyancy 10.0 you should see the same behavior in both direction
The vorticity effect is stronger in high temperature regions!
Caching Temperature to Data Channel
The temperature and density of a particle will lost after caching, at the moment no operator can't write data direct into the cache. Therefore the temperature and density can write to a data channel, this cache the information for rendering. The smoke renderer read first this data from the smoke group operator when not exist he reads the temperature from the data channel.
I look at your scene, the mapping on the torus knot seams to be broken. The mapping is fundamental important, the uv's must always lie between 0 - 1. Value lower or greater make a undesired tiling. And recording slow down because for every 0 - 1 the complete map will calculate stacked. As a sample, if a cube would have the same material id on every side, one map file is create but the calculation will done for all side and the result will write in the same map file.
Rendering Smoke, Step Size and Smoothing Radius
hmm, the particle have no radius for the renderer, the atmos walk on the camera ray an collect all particle in the smoothing radius per step, thats speed up the thing.
The rendering here woks but the SmokeRender density 1.0 in this scene is to low. But the render element doesn't work under vray, vray seems to be ignore unknown elements, no smoke elements functions are called from vray, except the class ID is requested.
World Scale and Velocity and Vorton Grid Sizes
In the latest beta I add a visual for velocity and vorton grid. The dimension is for scaling the smoke solver. As sample you create the smoke in default meter and have found the right parameters. Now you will the same behavior in a scene scaled to kilometer. Some SmokeGroup Parameters must change to new values or you turn the dimension value to 1000 meter and all parameters will correct internal. If the SmokeGroup present during a max scene scale the dimension automatically scaled.
the temperature expand to 0 and heating has no effect on rising
temp expand make the particle lighter with higher temperature, the mass is constant but the volume rise, so the density fall's, density = mass / volume
the collision make the solver, the boundary is only a container. Internal a particle will flagged when collide, so I let in the next beta the SmokeData output this flag. I hope this will be enough for the first step.
show option should work in the viewport, with type inoutside outside green dots on voxels center and inside red dots and with on geom the dot's on correspondent point on the geometry
the best thing about the voxel technology is, to give the particles a motion inheritance or a heat emission before the particle intersect the geometry with the influence radius.