// ISS_DEF.H // #defines // © 2021 Peter J. Meyer #define true (1) #define false (0) #define loop while(true) #define ADD_CODE missing_code(__FILE__,__LINE__); #define SHORT_INTS_PER_SWENDSEN_WANG_STACK_PUSH (dimensionality) #define SHORT_INTS_PER_WOLFF_STACK_PUSH (dimensionality+1) #define NUM_MULTIPLE_RESULTS (4) // Maximum number of results saved in multiple_temperature_results[][][] array. // 0 = magnetization // 1 = Binder cumulant // 2 = internal energy // 3 = specific heat #define CHECK_ADMISSABILITY true // used in FILE_IO.C #define DOES_PERCOLATION_THRESHOLDS false #define TIMING_DIAGNOSTICS false #define SAVE_MEASUREMENTS false #define COMPLETE_SAMPLE_ON_ESCAPE true #define WR_ST_DEV_AUTOCORRELATON true #define FREE_BOUNDARY_CONDITIONS_POSSIBLE true #define RECORD_SPIN_DISTANCES true #define MAJOR_AXIS_SPECIFICATION_PERMITTED false #define ALTERNATIVE_SPIN_SELECTIONS false #define TETRAHEDRAL_LATTICE_IMPLEMENTED false // Tetrahedral lattice has coordination number 12, // so this would require all storage for bonds information // to be expanded from unsigned char (8 bits) to unsigned short int (16 bits). // Defines used in determination of percolation thresholds. #define MAX_ITERATIONS (30) #define NUM_CONCENTRATIONS (6) // Concentration range divided into NUM_CONCENTRATIONS-1 parts. #define NUM_LATTICE_TYPES (9+TETRAHEDRAL_LATTICE_IMPLEMENTED) #define J ((double)1.0) // J represents the interaction energy. // A larger interaction energy implies that transitions to higher-energy states // are less probable, so with larger J the spin system changes more slowly. // #defines for the PRNGs #define PRNG1_NAME "ran2()" // These are names of functions: #define INIT_PRNG1 init_ran2 #define PRNG1 ran2 #define NUM_PRNG1_CALLS num_ran2_calls #define RESET_NUM_PRNG1_CALLS reset_num_ran2_calls #define PRNG1_PERIOD_EXCEEDED ran2_period_exceeded #define NON_EXISTENT (-10000) // Minima and maxima #define MIN_SIZE (4) // minimum lattice size #define MAX_SIZE (2048) // maximum lattice size #define MIN_SIZE_PT (20) // minimum size in determination of perc. thr. // For maximum sizes see max_size[] in ISS_VAR.H. #define MIN_CONCENTRATION (0.001) // site and bond concentration #define MAX_CONCENTRATION (1.0) #define MIN_TEMPERATURE (0.001) #define MAX_TEMPERATURE (50.0) #define MAX_NUM_TEMPERATURES (40) #define MIN_PRECISION (2) // Used in determination of #define MAX_PRECISION (6) // percolation threshold. #define MIN_MAJOR_AXIS (0) // Used with honeycome #define MAX_MAJOR_AXIS (1) // and diamond lattices. #define MAX_DIMENSIONALITY (4) // Used for array sizes. #define MIN_NUM_CONFIGURATIONS_PT (100) // only for determination of percolation threshold #define MAX_NUM_CONFIGURATIONS (100000) // max. num. of site configurations #define MAX_NUM_SPIN_ASSIGNMENTS (100000) // max. num. of spin assignments #define MAX_NUM_REPETITIONS (500) // max. num. runs for each spin assignment #define MAX_STEP_LENGTH (10000) // max. number of MCS between measurements #define MIN_NUM_TIME_SLICES (2) // no. of time slices includes initial state #define MAX_NUM_TIME_SLICES (10001) // max. number of measurements // MAX_STEP_LENGTH * MAX_NUM_TIME_SLICES // must be less than 2^32 #define MIN_PERCENTAGE_RANGE_FOR_MEAN (1) #define MAX_PERCENTAGE_RANGE_FOR_MEAN (100) #define MIN_Q_VALUE (2) #define MAX_Q_VALUE (15) // 9 for a stack of 1 MB. For larger q // the stack size must be increased. // TEST WITH LARGER STACK #define MAX_COORD_NUM (8) // MAX_COORD_NUM cannot be increased without significant changes to the code. #define MAX_NUM_SPANNING_CLUSTERS (64) // Spin values for Ising model #define UP_SPIN (1) #define DOWN_SPIN (-1) // Spin values for q-state Potts model range from 1 through q. // Types of clusters #define CT_NN (1) #define CT_OPEN_BOND (2) #define CT_SPIN (3) #define CT_SWENDSEN_WANG (4) // Date formats #define ISO 0 #define EUR 1 #define US 2 // ASCII characters #define TAB (9) #define LINEFEED (10) #define CONTROL_T (20) #define ESCAPE (27) #define SPACE (32) // The following used in ALLOC.C and in FILE_IO.C #define NUM_MAGNETIZATION_COMPONENTS (4) #define NUM_INTERNAL_ENERGY_COMPONENTS (3) #define NUM_AUTOCORRELATION_COMPONENTS (2) #define MAX_DIVISORS (60) #define PREFERRED_NUM_DIVISORS (6) // Bit masks #define BIT1_0 (1) // 00000001 #define BIT1_1 (2) // 00000010 #define BIT1_2 (4) // 00000100 #define BIT1_3 (8) // 00001000 #define BIT1_4 (16) // 00010000 #define BIT1_5 (32) // 00100000 #define BIT1_6 (64) // 01000000 #define BIT1_7 (128) // 10000000 #define BIT0_0 (254) // 11111110 #define BIT0_1 (253) // 11111101 #define BIT0_2 (251) // 11111011 #define BIT0_3 (247) // 11110111 #define BIT0_4 (239) // 11101111 #define BIT0_5 (223) // 11011111 #define BIT0_6 (191) // 10111111 #define BIT0_7 (127) // 01111111 #define IN_SPANNING_CLUSTER BIT1_4 // Bit pattern 00010000 #define VISITED BIT1_5 // Bit pattern 00100000 #define BOUNDARY BIT1_6 // Bit pattern 01000000 #define OCCUPIED BIT1_7 // Bit pattern 10000000 #define OCCUPIED_BY_UP_SPIN BIT1_7 // Bit pattern 10000000 #define OCCUPIED_BY_DOWN_SPIN (BIT1_7|BIT1_0) // Bit pattern 10000001 #define NOT_IN_SPANNING_CLUSTER BIT0_4 // Bit pattern 11101111 #define UNVISITED BIT0_5 // Bit pattern 11011111 #define UNOCCUPIED BIT0_7 // Bit pattern 01111111 // Macros #define IS_BOUNDARY_SITE_2(i,j) ( sites2[i][j] & BOUNDARY ) #define IS_BOUNDARY_SITE_3(i,j,k) ( sites3[i][j][k] & BOUNDARY ) #define IS_BOUNDARY_SITE_4(i,j,k,l) ( sites4[i][j][k][l] & BOUNDARY ) #define SITE_IS_OCCUPIED_2(i,j) ( i<0 ? false : sites2[i][j] & OCCUPIED ) #define SITE_IS_OCCUPIED_3(i,j,k) ( i<0 ? false : sites3[i][j][k] & OCCUPIED ) #define SITE_IS_OCCUPIED_4(i,j,k,l) ( i<0 ? false : sites4[i][j][k][l] & OCCUPIED ) #define MARK_SITE_AS_VISITED_2(i,j) ( sites2[i][j] |= VISITED ) #define MARK_SITE_AS_VISITED_3(i,j,k) ( sites3[i][j][k] |= VISITED ) #define MARK_SITE_AS_VISITED_4(i,j,k,l) ( sites4[i][j][k][l] |= VISITED ) #define SITE_IS_VISITED_2(i,j) ( i<0 ? false : sites2[i][j] & VISITED ) #define SITE_IS_VISITED_3(i,j,k) ( i<0 ? false : sites3[i][j][k] & VISITED ) #define SITE_IS_VISITED_4(i,j,k,l) ( i<0 ? false : sites4[i][j][k][l] & VISITED ) #define MARK_SITE_IN_SPANNING_CLUSTER_2(i,j) ( sites2[i][j] |= IN_SPANNING_CLUSTER ) #define MARK_SITE_IN_SPANNING_CLUSTER_3(i,j,k) ( sites3[i][j][k] |= IN_SPANNING_CLUSTER ) #define MARK_SITE_IN_SPANNING_CLUSTER_4(i,j,k,l) ( sites4[i][j][k][l] |= IN_SPANNING_CLUSTER )