bool Thermal::apply(SpinSystem* ss, RNG* useThisRNG)
{
	int slot = markSlotUsed(ss);
	
	RNG* rand = myRNG;
	if(useThisRNG)
		rand = useThisRNG;

	if(rand == 0)
	{
		errormsg = "Missing RNG";
		return false;
	}
	
	const double alpha = ss->alpha;
	const double dt    = ss->dt;
	const double gamma = ss->gamma;

	double* hx = ss->hx[slot]->data();
	double* hy = ss->hy[slot]->data();
	double* hz = ss->hz[slot]->data();
	const double* ms = ss->ms->data();

	
	gamma_alpha ga(ss);
	
	for(int i=0; i<ss->nxyz; i++)
	{
		if(ms[i] != 0 && temperature != 0)
		{
			const double alpha = ga.alpha(i);
			const double gamma = ga.gamma(i);
			if(gamma > 0)
			{
				const double stddev = sqrt((2.0 * alpha * global_scale * temperature * (*scale)[i]) / (ms[i] * dt * gamma));
				
				hx[i] = stddev * rand->randNorm(0, 1);
				hy[i] = stddev * rand->randNorm(0, 1);
				hz[i] = stddev * rand->randNorm(0, 1);
			}
			else
			{
				hx[i] = 0;
				hy[i] = 0;
				hz[i] = 0;
			}
		}
		else
		{
			hx[i] = 0;
			hy[i] = 0;
			hz[i] = 0;
		}
	}

	return true;
}