// CORLEN.C
// Functions for calculating correlation lengths.
// © 2021 Peter J. Meyer
#include "iss.h"
#define PERCOLATION 0
static int num_spins_in_non_spanning_cluster;
struct _all_cluster_trace_data ct_data;
// static int open_bond_spins[MAX_SIZE];
static int num_open_bond_spins[MAX_SIZE];
static int num_like_spins[MAX_SIZE];
static double correlation[MAX_SIZE];
static void zero_counts(void);
static void grow_cluster_and_count(int i, int j, ...);
static int num_sites_at_distance(int n);
static double calculate_corr_length(type);
static int another_spin(void);
// corr_len_type = 0 for percolation correlation length
// 1 for thermal correlation length
/*-----------------------------------------------*/
double get_correlation_length(int corr_length_type,
int method,
int exclude_spanning_clusters)
{
int i, j, spin_value, n;
int num_spins_in_non_spanning_cluster=0;
zero_counts();
if ( exclude_spanning_clusters )
{
ct_data.cluster_type = CT_OPEN_BOND; // ???
ct_data.stop_on_spanning_cluster = false;
trace_all_clusters(&ct_data); // Look for spanning cluster.
}
switch ( dimensionality )
{
case 2:
if ( method == 0 )
{
}
else
{
for ( i=0; i<size; i++ )
{
for ( j=0; j<size; j++ )
{
if ( spin_value = spin_at_site(i,j) )
{
if ( exclude_spanning_clusters && ( sites2[i][j] & IN_SPANNING_CLUSTER ))
continue;
if ( !( sites2[i][j] & IN_SPANNING_CLUSTER) )
num_spins_in_non_spanning_cluster++;
grow_cluster_and_count(i,j);
// Grow the cluster with seed(i,j) and count the number
// of spins and like spins at all distances n,
// adding to running total.
}
}
}
}
break;
case 3:
ADD_CODE // 3d
break;
case 4:
ADD_CODE // 4d
break;
}
correlation[0] = 1;
for ( n=1; n<size/2; n++ )
{
if ( corr_length_type == PERCOLATION )
correlation[n] = num_open_bond_spins[n]
/ ( num_sites_at_distance(n) * num_spins_in_non_spanning_cluster );
else // type == THERMAL
correlation[n] = num_like_spins[n]
/ ( num_sites_at_distance(n) * num_spins_in_non_spanning_cluster );
}
// Include perc_correlation[] and thermal_correlation[] in results
// so as to allow extraction of xi by semi-log plot.
return ( calculate_corr_length(corr_length_type) );
}
// This calculation depends on the lattice type and dimensionality.
/*-----------------------------------*/
static int num_sites_at_distance(int n)
{
return ( 1 );
}
/*-------------------------------------*/
static double calculate_corr_length(type)
{
return ( 0.0 );
}
/*-------------------------*/
static void zero_counts(void)
{
// zero number of open bond spins
memset(&num_open_bond_spins[0],0,MAX_SIZE);
// zero numbers of like spins
memset(&num_like_spins[0],0,MAX_SIZE);
num_spins_in_non_spanning_cluster = 0;
}
// Grow a cluster of type T from site i,j.
// T is WL for the whole lattice, NN for nearest neighbour,
// OB for open-bond, SP for spin (of like values).
/*-------------------------------------------------*/
static void grow_cluster_and_count(int i, int j, ...)
{
int n;
mark_all_sites_unvisited();
MARK_SITE_AS_VISITED_2(i,j);
n = 1;
loop
{
while ( another_spin() )
{
;
}
}
}
// This returns true if there is a direction r such that
// there is a T = WL site (occupied or not) in direction r
// NN spin in direction r (open or closed bond)
// OB spin in direction r with open bnd
// SP like-valued spin in direction r
// and which is unvisited.
// In this case the direction of the possible new spin on return is in s_r
// and the location of the possible new spin is (nn_i,nn_j,...).
/*-------------------------*/
static int another_spin(void)
{
switch ( dimensionality )
{
case 2:
break;
case 3:
break;
case 4:
break;
}
return ( 0 );
}