I have an idea about this ... not the time now, but.
The base idea is to modify the 'Get position in texture'. When it reads for example X=100, Y=0, Z=20 you can exponential increase these values with functions. Doing a power of 2 will give you values of 10.000 | 0 | 400.
In other words, the farer you get from 0|0|0 the smaller steps are. On the other hand: if you have an output for a displacement you can divide by the length of that vector, so farer distance, smaller displacement.
Now, you only need to control the what and where

Volker