//  ISS_FUNC.H
//  Function declarations
//  © 2021 Peter J. Meyer

//  Functions which take a fixed number of arguments.

void adjust_direction_table(int parity);                      //  DIRTABLE.C
int  all_sites_visited(void);                                 //  Q&A.C
void allocate_arrays(void);                                   //  ALLOC.C
void allocate_memory_for_stack(void);                         //  STACK1.C
void analyse_data(void);                                      //  MEAS.C
void assign_initial_spins(void);                              //  INITSPIN.C

void calculate_transition_probabilities(void);                //  TRANSIT.C
void check_if_output_file_exists(void);                       //  FILE_IO.C
void check_stack_is_empty(char *location);                    //  STACK1.C
void copy_sites(void);                                        //  S&B.C
void copy_spin_assignment(void);                              //  SPINS.C

void display_array_allocation_error(int errno, int err_flag); //  ERRMSG.C
void display_array_free_error(int errno);                     //  ERRMSG.C
void display_copyright(void);                                 //  TEXTOUT.C
void display_file_error_message(char *operation, 
    char *file_type, char *filename);                         //  ERRMSG.C
void display_input_data_error(char *parameter);               //  ERRMSG.C
void display_input_data_format(void);                         //  TEXTOUT.C
void display_map(char *filepath,int context);                 //  DISP_LAT.C
void display_missing_data_message(char *parameter);           //  ERRMSG.C
void display_startup_info(void);	                          //  TEXTOUT.C
void display_syntax(void);                                    //  TEXTOUT.C
void do_checkerboard_ssf_sweep(void);                         //  SINGLE.C
void do_random_ssf_sweep(void);                               //  SINGLE.C

int  file_exists(char *filepath);                              //  FILE_IO.C
void flip_initial_spin_to_up(void);                            //  SPINFLIP.C
int  flip_spin(int s);                                         //  SPINFLIP.C
void free_arrays(void);                                        //  ALLOC.C

int  get_abs_internal_energy(void);                            //  SPINS.C
int  get_abs_magnetization(int distinguished_spin_value);      //  SPINS.C
double get_autocorrelation(void);                              //  AUTOCORR.C
double get_critical_temperature(void);                         //  CRITTEMP.C
void get_exe_name(char *argv[]);                               //  READ.C
int get_percolation_threshold(void);                           //  PERC.C

void init_ran1(unsigned int seed);                             //  RAN1.C
int  inverse_direction(int parity, int r);                     //  DIRTABLE.C

void mark_all_sites_unvisited(void);                           //  S&B.C
void mark_all_sites_unvisited_and_clear_path(void);            //  S&B.C
void missing_code(char *file, int linenum);                    //  ERRMSG.C
void move_str_left(char *str1, char *str2);                    //  CHAR_AUX.C

double norm_internal_energy(void);                             //  MEAS.C
double magnetization_per_spin(void);                           //  MEAS.C
unsigned long num_ran1_calls(void);                            //  RAN1.C

int open_bonds(void);                                          //  BONDS.C
int open_file(char *filename, char *mode, FILE **file);        //  FILE_IO.C

void perform_equilibrations(void);                             //  EQUIL.C
void perform_single_spin_flip_sweep(void);                     //  SINGLE.C
void perform_swendsen_wang_sweep(void);                        //  SW-WANG.C
void perform_wolff_sweep(void);                                //  WOLFF.C
void precompute_nn_sites(void);                                //  PRECOMP.C

int  read_command_line(int i, char *argv[]);                   //  READ.C
void read_input_data(void);                                    //  READ.C
int  read_line(FILE *input_file);                              //  FILE_IO.C
void remove_leading_spaces(char *str);                         //  CHAR_AUX.C
void remove_outer_spaces(char *str);                           //  CHAR_AUX.C
void remove_trailing_spaces(char *str);                        //  CHAR_AUX.C
void remove_trailing_zeros(char *num_str);                     //  CHAR_AUX.C
void restore_spin_assignment(void);                            //  SPINS.C

int save_measurements(void);                                   //  FILE_IO.C
int save_spin_assignment(void);                                //  FILE_IO.C
char *seconds_to_time_str(unsigned long num_seconds,
    char *time_str);                                           //  CHAR_AUX.C
void set_critical_temperatures(void);                          //  CRITTEMP.C
void set_direction_table(void);                                //  DIRTABLE.C
void set_directionalities(void);                               //  DIRTABLE.C
void set_parameters(void);                                     //  SETPARAM.C
void set_up_filenames(void);                                   //  FILE_IO.C
void set_up_configuration(void);                               //  S&B.C
void show_notice(void);                                        //  TEXTOUT.C
void skip_spaces(char** pp);                                   //  CHAR_AUX.C
char *sltoa_commas(long x, char *str);                         //  CHAR_AUX.C
void spaces(char *str, int num_spaces);                        //  CHAR_AUX.C
int  stack_empty(void);                                        //  STACK1.C
char *system_date(char *date_str, int format);                 //  CHAR_AUX.C
char *system_time(char *time_str, int seconds);                //  CHAR_AUX.C

void trace_all_clusters(struct _all_cluster_trace_data *actd); // CLUSTERS.C

char *ultoa_commas(unsigned long x, char *str);                //  CHAR_AUX.C
void update_measurements(int time_slice_num);                  //  EQUIL.C    

void write_equilibration_results(void);                        //  RESULTS.C
void write_percolation_results(int num_iterations_done);       //  RESULTS.C
void write_stack_data(FILE *of);                               //  STACK1.C

//  Functions which take a variable number of arguments.

void clear_stack(void);                                        //  STACK1.C

void do_ising_spin_flip(int spin, int i, int j, ...);          //  SPINFLIP.C
void do_q_state_potts_spin_flip(int spint, int new_spin, 
    int i, int j, ...);                                        //  SPINFLIP.C

int get_nn_site_in_dir(int r, int i, int j, ...);              //  Q&A.C
void get_nn_sites(int i, int j, ...);                          //  Q&A.C

int initial_spin_at_occupied_site(int i, int j, ...);          //  SPINS.C

int nn_spin_sum(int i, int j, ...);                            //  SPINS.C

int pop_from_stack(short int *iptr, short int *jptr, ...);     //  STACK1.C
int pop_from_stack_with_r(short int *rptr, 
    short int *iptr, short int *jptr, ...);                    //  STACK1.C
int push_onto_stack(short int i, short int j, ...);            //  STACK1.C
int push_onto_stack_with_r(short int r, 
    short int i, short int j, ...);                            //  STACK1.C

int spin_at_occupied_site(int i, int j, ...);                  //  SPINS.C
int spin_at_site(int i, int j, ...);                           //  SPINS.C
int sum_kronecker_deltas(int spin_value, int i, int j, ...);   //  SPINS.C

void zero_measurements(void);                                  //  MEAS.C

//  Functions with names #defined in ISS_DEF.H.

void INIT_PRNG1(unsigned int seed);                            //  RAN1.C
double PRNG1(void);                                            //  RAN1.C
double NUM_PRNG1_CALLS(void);                                  //  RAN1.C
void RESET_NUM_PRNG1_CALLS(void);                              //  RAN1.C
int PRNG1_PERIOD_EXCEEDED(void);                               //  RAN1.C