// ISM.C
// Author: Peter J. Meyer
#define SHOW_NOTICE
#define RANDOM_SEED 0
// Define as 0 to use seconds-since-1970 or
// as non-zero to get a reproducible sequence of random numbers.
// This program supports Ising and q-state Potts spin models
// (non-diluted, site-diluted and bond-diluted)
// on lattices of the following nine types
// (coordination number in parentheses):
//
// 2d: square (4) honeycomb (3)
// triangular (6) double triangular (8)
// 3d: cubic (6) diamond (4)
// quadrilateral (8)
// 4d: hypercubic (8) hyperdiamond (5)
#define M
// Controls variable declarations and definitions in iss_var.h.
#include "iss.h"
static void preliminaries(char *argv[]);
static void zero_multiple_temperature_results(void);
static void perform_task(void);
/*-----------------------------*/
void main(int argc, char *argv[])
{
preliminaries(argv); // Below.
if ( argc == 1 )
display_syntax(); // Does not return.
strupr(argv[1]);
if ( !strcmp(argv[1],"/F") )
display_input_data_format(); // Does not return.
#ifdef SHOW_NOTICE
show_notice(); // For U. of D. version.
#endif
system_date(session_start_date,ISO);
system_time(session_start_time,true);
// If more than one input file then a session has multiple runs.
num_input_files = argc - 1;
if ( num_input_files > 1 )
printf("Processing %d input files.\n",num_input_files);
for ( input_file_num=0; input_file_num<num_input_files; input_file_num++ )
{
if ( !read_command_line(input_file_num+1,argv) ) // READ.c
break;
set_up_filenames(); // FILE_IO.C
read_input_data(); // READ.C
check_if_output_file_exists(); // FILE_IO.C
set_parameters(); // SETPARAM.C
display_startup_info(); // TEXTOUT.C
allocate_arrays(); // ALLOC.C
if ( use_precomputed_nn_sites )
precompute_nn_sites(); // PRECOMP.C
if ( multiple_temperatures_specified )
zero_multiple_temperature_results();
for ( temperature_num=0; temperature_num<num_temperatures; temperature_num++ )
{
temperature = temperatur[temperature_num];
final_temperature = ( temperature_num == num_temperatures - 1 );
// Results file is displayed only when this becomes true
// (or user requests the program to stop).
perform_task(); // below
if ( escape_key_termination || stop_on_next_temperature )
break;
}
free_arrays(); // ALLOC.C
if ( escape_key_termination || stop_on_next_temperature )
break;
}
if ( NUM_PRNG1_CALLS() > 0 )
{
system_date(session_end_date,ISO);
system_time(session_end_time,true);
printf("\nRun started at %s %s",session_start_date,session_start_time);
printf("\nRun ended at %s %s",session_end_date,session_end_time);
if ( (unsigned long)NUM_PRNG1_CALLS() < 2e9 )
printf("\n%s was called %s times.\n",PRNG1_NAME,
ultoa_commas((unsigned long)NUM_PRNG1_CALLS(),temp));
else
printf("\n%s was called %s million times.\n",PRNG1_NAME,
ultoa_commas((unsigned long)(NUM_PRNG1_CALLS()/1e6),temp));
}
}
/*-----------------------------------*/
static void preliminaries(char *argv[])
{
get_exe_name(argv); // READ.C
display_copyright(); // TEXTOUT.C
if ( !( seed = RANDOM_SEED ) )
seed = time(NULL);
INIT_PRNG1(seed*(seed+1)+1);
}
/*-----------------------------------------------*/
static void zero_multiple_temperature_results(void)
{
int i, j, k;
for ( i=0; i< MAX_NUM_TEMPERATURES; i++ )
for ( j=0; j<NUM_MULTIPLE_RESULTS; j++ )
for ( k=0; k<2; k++ )
multiple_temperature_results[i][j][k] = 0.0;
}
/*--------------------------*/
static void perform_task(void)
{
int num_iterations_done;
// clock_t is #typedef'd as a long int in time.h.
system_date(run_start_date,ISO);
system_time(run_start_time,true);
task_start = clock();
pause_time = 0;
if ( goal_is_equilibration )
perform_equilibrations(); // EQUIL.C
else
num_iterations_done = get_percolation_threshold(); // PERC.C
task_end = clock();
run_time = (( (double)task_end - task_start ) / CLOCKS_PER_SEC );
run_time -= pause_time;
// Get end time
system_date(run_end_date,ISO);
system_time(run_end_time,true);
if ( goal_is_equilibration )
write_equilibration_results(); // RESULTS.C
else
write_percolation_results(num_iterations_done); // PERC_RESC.C
}