// PERC_RES.C // Percolation results // © 2021 Peter J. Meyer #include "iss.h" #include <process.h> #define W 13 extern double min_p, max_p, precision2; // PERC.C extern int total_num_configs; extern char anomalies[][64]; /*---------------------------------------------------*/ void write_percolation_results(int num_iterations_done) { int i, iter, ch, p_num; double p; FILE *of; while ( !open_file(output_filepath,"wt",&of) ) { printf("\nCannot open output file %s.",output_filepath); printf("\nPerhaps this file is already open? Retry or quit? (R|Q) "); ch = getch(); if ( ! ( ch == 'R' || ch == 'r' ) ) exit(1); } fprintf(of,"\nDetermination of %s percolation threshold.", ( goal_is_site_percolation_threshold ? "site" : "bond") ); fprintf(of,"\nRun begun at %s %s",run_start_date,run_start_time); if ( escape_key_termination ) fprintf(of,"\nEscape key was pressed.\n"); fprintf(of,"\nlattice dimensionality/type/size: %dd %s (%d) %d", dimensionality,lattice_types[l_type].name, lattice_types[l_type].coord_num,size); for ( i=2; i<=dimensionality; i++ ) fprintf(of,"x%d",size); if ( direction_table_is_parity_dependent && MAJOR_AXIS_SPECIFICATION_PERMITTED ) fprintf(of,"\nmajor axis: %d",major_axis); #if FREE_BOUNDARY_CONDITIONS_POSSIBLE fprintf(of,"\nboundary conditions: %s", (free_boundary_conditions ? "free" : "periodic")); #endif if ( goal_is_site_percolation_threshold ) fprintf(of,"\nbond concentration: %.3f",bond_concentration); else fprintf(of,"\nsite concentration: %.3f",site_concentration); fprintf(of,"\nprecision: +/- %.*f",num_decimal_places,precision); fprintf(of,"\n"); for ( iter=0; iter<num_iterations_done; iter++ ) { if ( iter > 0 ) { if ( iterations[iter-1].repeat ) fprintf(of,"\nRepeating because %s.\n",anomalies[iterations[iter-1].anom_code]); else if ( iterations[iter-1].anom_code == 4 ) fprintf(of,"\nAdjusting range because %s.\n",anomalies[4]); } fprintf(of,"\nIteration #%d, level #%d, epsilon = %.*f", iter+1,iterations[iter].level,num_decimal_places+1,iterations[iter].epsilon); fprintf(of,"\nRange %.*f - %.*f, %.*f in steps of %.*f, %s configurations.\n", num_decimal_places+1,iterations[iter].min_p, num_decimal_places+1,iterations[iter].max_p, num_decimal_places+1,iterations[iter].range, num_decimal_places+1,iterations[iter].range/(NUM_CONCENTRATIONS-1), ultoa_commas(iterations[iter].num_configurations,temp)); for ( p_num=0; p_num<NUM_CONCENTRATIONS; p_num++ ) { p = iterations[iter].min_p + p_num*(iterations[iter].range/(NUM_CONCENTRATIONS-1)); fprintf(of,"%*.*f",W,num_decimal_places+1,p); } fprintf(of,"\n"); for ( p_num=0; p_num<NUM_CONCENTRATIONS; p_num++ ) { if ( iterations[iter].perc_data[p_num][1] == 200 ) break; if ( iterations[iter].perc_data[p_num][1] == 0 ) fprintf(of,"%*d",W,0); else if ( iterations[iter].perc_data[p_num][1] == 100 ) fprintf(of,"%*d",W,100); else fprintf(of,"%*.2f",W,iterations[iter].perc_data[p_num][1]); } fprintf(of,"\n"); } if ( iterations[--iter].anom_code == 5 ) fprintf(of,"\nQuit because %s.\n",anomalies[5]); if ( precision < 0.5 ) { fprintf(of,"\nThe %s percolation threshold for this lattice" "\n(with %s concentration %.3f)", ( goal_is_site_percolation_threshold ? "site" : "bond" ), ( goal_is_site_percolation_threshold ? "bond" : "site" ), ( goal_is_site_percolation_threshold ? bond_concentration : site_concentration )); fprintf(of,"\nis %.*f +/- %.*f (%.*f - %.*f)\n", num_decimal_places+1, (max_p+min_p)/2, num_decimal_places+1, precision2, num_decimal_places+1, (max_p+min_p)/2-precision2, num_decimal_places+1, (max_p+min_p)/2+precision2); } fprintf(of,"\n%s configurations generated.\n",ultoa_commas(total_num_configs,temp)); write_stack_data(of); // STACK.C fprintf(of,"\nRun ended at %s %s",run_end_date,run_end_time); fprintf(of,"\nRun time = %s",seconds_to_time_str((unsigned long)run_time,temp)); fclose(of); spawnlp(P_NOWAIT,"notepad.exe","notepad.exe",output_filepath,NULL); }