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; }