// TS_VALS.C // © 2021 Peter J. Meyer #include "iss.h" #include <process.h> #define ALWAYS_WRITE_AUTOCORRELATION true /*----------------------------------------*/ void write_timeslice_values(FILE *of, int w) { int i, write_normed_magnetization; int write_autocorrelation=true, p=5; double first_second_moment, magnetization_0; magnetization_0 = fabs(magnetization[0][0]); write_normed_magnetization = ( magnetization_0 > 0.001 && magnetization_0 < 1 ); // If magnetization_0 < 0.001 then the normed magnetization values are too large. // Print first line of heading. fprintf(of,"\n\n%*s%*s",w/2+1,"Time",w,"Mean"); if ( standard_deviation_measured ) fprintf(of,"%*s",w,"Std."); if ( write_normed_magnetization ) fprintf(of,"%*s",w,"Normed"); if ( second_moment_measured ) { fprintf(of,"%*s",w,"Second"); fprintf(of,"%*s",w,"2ndmom"); } if ( autocorrelation_measured ) { fprintf(of,"%*s",w,"Auto-"); #if WR_ST_DEV_AUTOCORRELATON fprintf(of,"%*s",w,"Std.dev."); #endif } if ( internal_energy_measured ) { fprintf(of,"%*s",w,"Internal"); fprintf(of,"%*s",w,"Std.dev."); fprintf(of,"%*s",w,"Specific"); } if ( binder_cumulant_measured ) fprintf(of,"%*s",w,"Binder"); if ( log_values_requested ) { fprintf(of,"%*s%*s",w,"lnMCS",w,"lnMean"); if ( write_normed_magnetization ) fprintf(of,"%*s",w,"lnNormed"); #if WR_LOG_ST_DEV_MAGNETISM if ( standard_deviation_measured ) fprintf(of,"%*s",w,"lnStd."); #endif if ( second_moment_measured ) { fprintf(of,"%*s",w,"lnSecond"); fprintf(of,"%*s",w,"ln2ndmom"); } if ( autocorrelation_measured ) fprintf(of,"%*s",w,"lnAuto-"); if ( internal_energy_measured ) { fprintf(of,"%*s",w,"ln Int."); // Not printing log of std. dev. of internal energy. fprintf(of,"%*s",w,"ln Spec."); } } // Print second line of heading. fprintf(of,"\n%*s%*s",w/2+1,"point",w,"magn'n"); if ( standard_deviation_measured ) fprintf(of,"%*s",w,"dev'n"); if ( write_normed_magnetization ) fprintf(of,"%*s",w,"magn'n"); if ( second_moment_measured ) { fprintf(of,"%*s",w,"moment"); fprintf(of,"%*s",w,"/first"); } if ( autocorrelation_measured ) { fprintf(of,"%*s",w,"corr'n"); #if WR_ST_DEV_AUTOCORRELATON fprintf(of,"%*s",w,"Autocor."); #endif } if ( internal_energy_measured ) { fprintf(of,"%*s",w,"energy"); fprintf(of,"%*s",w,"int.en."); fprintf(of,"%*s",w,"heat"); } if ( binder_cumulant_measured ) fprintf(of,"%*s",w,"cumulant"); if ( log_values_requested ) { fprintf(of,"%*s%*s",w,"",w,"magn'n"); if ( write_normed_magnetization ) fprintf(of,"%*s",w,"magn'n"); #if WR_LOG_ST_DEV_MAGNETISM if ( standard_deviation_measured ) fprintf(of,"%*s",w,"dev'n"); #endif if ( second_moment_measured ) { fprintf(of,"%*s",w,"moment"); fprintf(of,"%*s",w,"/first"); } if ( autocorrelation_measured ) fprintf(of,"%*s",w,"corr'n"); if ( internal_energy_measured ) { fprintf(of,"%*s",w,"energy"); // Not printing log of std. dev. of internal energy. fprintf(of,"%*s",w,"heat"); } } fprintf(of,"\n\n"); if ( second_moment_measured ) { if ( ( first_second_moment = magnetization[1][2] ) == NON_EXISTENT ) first_second_moment = 0; // Why not first_second_moment = magnetization[*0*][2] ? // Why norm the 2nd moment wrt value at 2nd timeslice not 1st? } // Now print the values. for ( i=0; i<num_time_slices; i++ ) { if ( magnetization[i][2] == NON_EXISTENT ) break; // Write MCS and magnetization. fprintf(of,"%*d%*.*f", w/2+1,i*step_length,w,p,magnetization[i][0]); // Write standard deviation. if ( standard_deviation_measured ) { if ( magnetization[i][1] != NON_EXISTENT ) fprintf(of,"%*.*f",w,p,magnetization[i][1]); else fprintf(of,"%*s",w,""); } if ( write_normed_magnetization ) fprintf(of,"%*.*f",w,p,magnetization[i][0]/magnetization_0); // Write second moment. if ( second_moment_measured ) { fprintf(of,"%*.*f",w,p,magnetization[i][2]); if ( i ) { if ( first_second_moment ) fprintf(of,"%*.*f",w,4,magnetization[i][2]/first_second_moment); else fprintf(of,"%*s",w,""); } else fprintf(of,"%*s",w,""); } // Write autocorrelation and standard deviation of autocorrelation. if ( autocorrelation_measured ) { if ( write_autocorrelation || ALWAYS_WRITE_AUTOCORRELATION ) { fprintf(of,"%*.*f",w,p,autocorrelation[i][0]); #if WR_ST_DEV_AUTOCORRELATON if ( autocorrelation[i][1] != NON_EXISTENT ) fprintf(of,"%*.*f",w,p,autocorrelation[i][1]); else fprintf(of,"%*s",w,""); #endif write_autocorrelation = ( autocorrelation[i][0] > 0 ); } else { fprintf(of,"%*s",w,""); #if WR_ST_DEV_AUTOCORRELATON fprintf(of,"%*s",w,""); #endif } } if ( internal_energy_measured ) { // internal energy per spin fprintf(of,"%*.*f",w,p,internal_energy[i][0]); // standard deviation of internal energy per spin if ( internal_energy[i][1] != NON_EXISTENT ) fprintf(of,"%*.*f",w,p,internal_energy[i][1]); else fprintf(of,"%*s",w,""); // specific heat per spin fprintf(of,"%*.*f",w,p,internal_energy[i][2]); #if false if ( internal_energy[i][2] != NON_EXISTENT ) fprintf(of,"%*.*f",w,p,internal_energy[i][2]); else fprintf(of,"%*s",w,""); #endif } if ( binder_cumulant_measured ) fprintf(of,"%*.*f",w,p,magnetization[i][3]); if ( log_values_requested ) { // Write log of MCS. if ( i > 0 ) fprintf(of,"%*.*f",w,p,log(i*step_length)); else fprintf(of,"%*s",w,""); // Write log of magnetization. if ( magnetization[i][0] > 0 ) fprintf(of,"%*.*f",w,p,log(magnetization[i][0])); else fprintf(of,"%*s",w,""); // Write log of normed magnetization. if ( write_normed_magnetization ) { if ( magnetization[i][0] > 0 ) fprintf(of,"%*.*f",w,p,log(magnetization[i][0]/magnetization_0)); else fprintf(of,"%*s",w,""); } #if WR_LOG_ST_DEV_MAGNETISM // Write log of standard deviation. if ( standard_deviation_measured ) { if ( magnetization[i][1] > 0 ) fprintf(of,"%*.*f",w,p,log(magnetization[i][1])); else fprintf(of,"%*s",w,""); } #endif // Write log of second moment. if ( second_moment_measured ) { if ( magnetization[i][2] > 0 ) fprintf(of,"%*.*f",w,p,log(magnetization[i][2])); else fprintf(of,"%*s",w,""); if ( i ) { if ( first_second_moment && magnetization[i][2]/first_second_moment > 0 ) fprintf(of,"%*.*f",w,p, log(magnetization[i][2]/first_second_moment)); else fprintf(of,"%*s",w,""); } else fprintf(of,"%*s",w,""); } // Write log of autocorrelation. if ( autocorrelation_measured ) { if ( write_autocorrelation && autocorrelation[i][0] > 0 ) fprintf(of,"%*.*f",w,p,log(autocorrelation[i][0])); else fprintf(of,"%*s",w,""); } if ( internal_energy_measured ) { // log of internal energy if ( internal_energy[i][0] > 0 ) fprintf(of,"%*.*f",w,p,log(internal_energy[i][0])); else fprintf(of,"%*s",w,""); // log of specific heat if ( internal_energy[i][2] > 0 ) fprintf(of,"%*.*f",w,p,log(internal_energy[i][2])); else fprintf(of,"%*s",w,""); } } #if !COMPLETE_SAMPLE_ON_ESCAPE // This is #defined in ISS_DEF.H if ( escape_key_termination ) { if ( (unsigned long)(i*step_length) == step_length*(mcs_done/step_length) ) fprintf(of," Escape"); // Show where data is discontinuous. } #endif fprintf(of,"\n"); } }