The OrnsteinUhlenbeck correction to diffusion can be used in applications ranging from modeling
Bakken oil production to modeling
CO2 sequestration.
Due to its origins as a random walk process, a pure diffusion model of particles will show unbounded excursions given a long enough time duration. This is characterized by the unbounded Fickian growth law showing a
$\sqrt{t}$ dependence for a pure random walk with a single diffusivity.
In practice, the physical environment of a particle may prevent unbounded excursions. It is physically possible that the environment may impose limiting effects on the extent of motion, or that it will place some form of drag on the particle’s hopping rate the further it moves away from a mean starting value.
The rationale for this limiting process within a producing hydrofractured reservoir may
arise from a barrier to diffusion beyond a certain range.

Figure 1: The OrnsteinUhlenbeck process suppresses the
diffusional flow by limiting the extent at which the mobile solute can travel,
thus generating a constrained asymptote below that of dragfree diffusion. 
Similarly, a sequestration barrier may exist preventing CO2 from permanently exiting the active carbon cycle; this makes the fat temporal tail even fatter.

Figure 2 : Impulse Response of the sequestering of Carbon
Dioxide to a normalized stimulus. The solid blue
curve represents the generally accepted model, while the dashed and dotted
curves represent the dispersive diffusion model with OU correction. The correction flattens out the tail. 
We can use the OrnsteinUhlenbeck process to model mathematically how this pure random walk becomes bounded. The OrnsteinUhlenbeck process has its origins in the modeling of Brownian motion with a special “reversion to the mean” property in motion excursions (specifically, it was first
formulated to describe Brownian motion in the presence of drag on
particle velocities, extending Einstein's work). The following expression shows the stationary marginal probability given a stochastic differential equation
$dX=aX\bullet dt+dW$
which models a drag on an excursion [1]
$dP\left(X\left(t+s\right)=x\rightX\left(s\right)=0)=\frac{1}{\sqrt{2\pi \tau}}{e}^{\frac{{x}^{2}}{2\tau}}dx$
$where\tau =\frac{1{e}^{2at}}{2a}$
The OU correction is straightforward to apply on our dispersive growth formulation, we only need apply a nonlinear transformation to the timescale.
$t\stackrel{OU}{\to}\tau $
and then apply this to a dispersive growth term such as the following:
$x\left(\tau \left(t\right)\right)=\sqrt{D\tau \left(t\right)}\frac{\sqrt{\frac{D\tau \left(t\right)}{{x}_{0}}}}{1+\sqrt{\frac{D\tau \left(t\right)}{{x}_{0}}}}\stackrel{where}{\to}\tau \left(t\right)=(1{e}^{2at})/2a$
This has the equivalent effect of appearing to slow down time at an exponential rate. This exponential rate turns out to be much faster than the Fickian growth law can sustain, so that an asymptotic limit is achieved in the diffusional growth extent.

Figure 3: The reversion to the mean process of the
OrnsteinUhlenbeck process will limit the growth of a diffusional process 
A physical model of an attractor or potential well which “tugs” on the random walker to bring it back to the mean state (see Figure below).

Figure 4: Representation of an OrnsteinUhlenbeck random walk process. The hopping
rate works similarly to a potential well, with a greater resistance to
hopping the further excursion ways from the mean. 
Algorithmic Code
The following pseudocode snippet sets up an OrnsteinUhlenbeck random walk model with a reversiontothemean term. The diffusion term is the classical Markovian random walk transition rate. The drag term places an attractor which opposes large excursions in the term Z.
 OrnsteinUhlenbeck random walk = ou
ou(X1, X2, Z)
random(R)
if R < 0.5 then
Z = Z*X1 + X2
else
Z = Z*X1  X2
end
 This is how it gets parameterized
ou_random_walker (dX, Diffusion, Drag, Z)
X1 = exp(2*Drag*dX)
X2 = sqrt(Diffusion*(1exp(2*Drag*dX))/2/Drag)
ou(X1, X2, Z)
Variance
To determine whether an OrnsteinUhlenbeck process is apparent on a set of data, one can apply a simple multiscale variance to the result of a Z array of length N :
variance(Z,N) {
L = N/2
while(L > 1) {
Sum = 0.0
for(i=1; i<N/2; i++) {
Val = Z[i]  Z[i+L]
Sum += Val * Val
}
print L “ “ sqrt(Sum/(N/2))
L = 0.95*L;
}
}
So that for a given random walk simulation, the asymptotic variance will tend to saturate at longer correlation length scales. A typical multiscale variance plot will look like those described here:
http://theoilconundrum.blogspot.com/2011/11/multiscalevarianceanalysisand.html.
Autocorrelation and Spectral Representation
The autocorrelation of the OrnsteinUhlenbeck process is, where Theta=Drag:
$R\left(x\right)=\frac{D}{\theta}{e}^{\theta \leftx\right}$
Even though this shows a saturation level, the power spectrum still obeys a 1/S^2 falloff.
$I\left({S}_{x}\right)=\frac{D}{\pi}\bullet \frac{1}{{{S}_{x}}^{2}+{\theta}^{2}}$
The OrensteinUhlenbeck process is often referred to as red noise and the two parameters of Diffusion and Drag can be determined either from the autocorrelation function or from the PSD. For the PSD, on a loglog plot, this involves reading the peak near S=0 and then determining the shoulder of the powerlaw rolloff. Between these two measures, one can infer both parameter values.
References
[1]
D. Mumford and A. Desolneux, Pattern Theory: The Stochastic Analysis Of RealWorld Signals. A K Peters, Ltd., 2010.