// AUTOCORR.C
// Functions for calculating autocorrelation
// © 2021 Peter J. Meyer
#include "iss.h"
/*----------------------------*/
double get_autocorrelation(void)
{
int i, j, k, l; // array indices
int spin_value, autocorrelation_sum=0;
switch ( dimensionality )
{
case 2:
for ( i=0; i<size; i++ )
{
for ( j=0; j<size; j++ )
{
if ( spin_value = spin_at_site(i,j) )
// spin_value is 0 if site is not occupied.
autocorrelation_sum +=
( spin_value == initial_spin_at_occupied_site(i,j) );
}
}
break;
case 3:
for ( i=0; i<size; i++ )
{
for ( j=0; j<size; j++ )
{
for ( k=0; k<size; k++ )
{
if ( spin_value = spin_at_site(i,j,k) )
// spin_value is 0 if site is not occupied.
autocorrelation_sum +=
( spin_value == initial_spin_at_occupied_site(i,j,k) );
}
}
}
break;
case 4:
for ( i=0; i<size; i++ )
{
for ( j=0; j<size; j++ )
{
for ( k=0; k<size; k++ )
{
for ( l=0; l<size; l++ )
{
if ( spin_value = spin_at_site(i,j,k,l) )
// spin_value is 0 if site is not occupied.
autocorrelation_sum +=
( spin_value == initial_spin_at_occupied_site(i,j,k,l) );
}
}
}
}
break;
}
if ( model_is_ising )
return ( (2*(double)autocorrelation_sum)/num_spins - 1 );
// maximum = 1, minimum = -1, no correlation = 0
else // model is q-state Potts
return ( (double)autocorrelation_sum/num_spins - 1.0/q);
// maximum = (q-1)/q, minimum = -1/q, no correlation = 0
}