This is lorentz.c in view mode; [Download] [Up]
/* LORENTZ.C Bruno Bienfait 1989 */ /* C example (lorentzian) for generating a lineshape file for the FDC-ESR program. The output file *.asc is a ASCII file which must be compiled by the "COMPILER" program. */ #include<stdlib.h> #include<stdio.h> #include<string.h> #define ANSI #ifdef ANSI /* functions prototypes */ void write_string( FILE *fp , const char *string ) ; void write_long( FILE *fp, long number ) ; void write_real( FILE *fp, double value ) ; void show_error_and_exit( const char *message) ; #else #define const /* */ #endif const char filename[] = "lineshap.asc" ; const int N = 150 ; const long number = 16000 ; /* This number will give you a ~150K file */ const long width_ratio = 16 ; const long max_height = 32767 ; /* May not be larger than 65535 */ void main() { long width = 0 ; double X = 0.0, X0 = 0.0 ; double Y = 0.0 ; FILE *fp = NULL ; printf("\n\tLorentzian lineshape ASCII file generator\n"); printf("for the FDC-ESR program\n"); printf("\n\tPlease wait\n") ; /* create a new file called 'filename' :*/ if( (fp = fopen( filename, "w" )) == NULL ) show_error_and_exit("I cannot create the new file") ; /* <1> write name of the lineshape ( string of maximun N characters ). It will be displayed in FDC-ESR while loading the data from disk */ write_string( fp, "Lorentzian" ) ; printf("\tcalculating the %s lineshape\n", "Lorentzian" ) ; /* <2> write comment for the linewidth ( string of maximun N characters). It will be displayed in FDC-ESR when entering the line width */ write_string( fp , "half height linewidth" ) ; /* <3> write total number of element in the lineshape */ write_long( fp, number ) ; /* <4> write width of the lineshape ( corresponding to comment at <2> ) */ width = number / width_ratio ; write_long( fp, width ) ; /* <5> write symmetry of the lineshape */ write_string( fp, "SYMETRIC") ; /* For the 1st derivative, it would be "ANTISYMETRIC" */ /* <6> write the largest unsigned integer value for the digital lineshape , all data values (see <7> and <8> )will be scaled and rounded to a 0 - max_height range by the COMPILER program. low : decrease precision but decrease overflow risk high : increase precision but increase overflow risk */ if( max_height > 0 && max_height <= 65535U ) write_long( fp, max_height ) ; else show_error_and_exit("max_height is not correct") ; /* <7> The first calculated value comes here */ /* lorentzian function : Y = A*W*W / (W*W + 4*(X0-X)*(X0-X) ) */ /* absolute height is not important ( A*W*W is a constant ) => Y = constant / (W*W + 4*(X0-X)*(X0-X) ) */ #define constant 100000.0 #define W (double)width X0 = number / 2 ; for( X = 0 ; X < number ; X++ ) { Y = constant / ( W*W + 4*(X0-X)*(X0-X) ) ; /*printf(" %6ld\t\t%lf\n", (long)X, Y ) ; */ /* for debugging */ write_real( fp, Y ) ; /* SHAPE-BIN accept also data in integer format */ } /* <8> end of the program */ fclose( fp ) ; } /***************************************************************************/ /***************************************************************************/ static char buffer[1000] ; void write_string( fp , string ) FILE *fp ; const char *string ; { int length = strlen( string ) ; if( length > N ) { printf(" String is longer than %d character\n", N ); show_error_and_exit("") ; } if( fprintf( fp, "%s\n", string ) < 0 ) show_error_and_exit( " Problem while writing data" ); } /***************************************************************************/ void write_long( fp, number ) FILE *fp ; long number ; { sprintf( buffer, "%ld\n", number ) ; if( fprintf( fp, "%s", buffer ) < 0 ) show_error_and_exit( " Problem while writing data" ); } /***************************************************************************/ void write_real( fp, value ) FILE *fp ; double value ; { sprintf( buffer, "%lf\n", value ) ; if( fprintf( fp, "%s", buffer ) < 0 ) show_error_and_exit( " Problem while writing data" ); } /***************************************************************************/ void show_error_and_exit( message) const char *message ; { printf("\n%s\nPress return to continue\n", message ) ; getchar() ; exit(0) ; } /***************************************************************************/ /* EOF */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.