/* Blocked averages computation a la Flyvbjerg and Petersen. [J. Chem. Phys., 91:461-466,1989] Reads in a Y vs. X data, and recursively block adjacent elements, computing variance. Details: See Appendix D in F&S. Outputs column-oriented data as Cameron F. Abrams Written for the course CHE 800-002, Molecular Simulation Spring 0304 compile using "gcc -o flyvbjerg.c flyvbjerg -lm" Drexel University, Department of Chemical Engineering Philadelphia (c) 2004 */ #include #include /* Perform one blocking operation on the array A[] */ void block (double * A, int * N) { int i; for (i=0;i<(*N)/2;i++) { A[i] = 0.5*(A[2*i]+A[2*i+1]); } for (;i<(*N);i++) A[i]=0.0; (*N) = (*N) / 2; } /* Compute the mean (m), 2nd moment (s2) and 4th moment (s4) of the array A[] */ void moments (double * A, int N, double * m, double * s2, double * s4) { double ss=0.0,ssss=0.0; int i; *m=0.0; for (i=0;i4) { moments(A,nData,&mn,&s2,&s4); av=sqrt(s2/(nData-1)); sav=av/sqrt(2*(nData-1)); fprintf(stdout,"%d %.5lf %.5lf %.5lf\n",j++,mn,av,sav); block(A,&nData); } fprintf(stderr,"# program ends\n"); }