Menu

Homepage
CV
Presentations
Publications
Thesis
Lectures
Evaluation
Computing

German version


Links

KOMET 337
    Román Orús
    Matteo Rizzi
    Daniel Rost
Department of Physics
Mainz University
 
Research unit SFB/TR49
Research unit FOR 1346


nils-uni@bluemer.name

Valid HTML 4.01!

Valid HTML 4.01

 

Codes: stats_template.c

#define PROGNAME "stats_template"
#define VERSION "0.1"
#define DATE  "30.10.2006"
#define AUTHOR "Nils Bluemer"

/* simplified version of stats - computes average, error etc. */
/* used as template for "Computer Simulations in Statistical Physics */
/* see http://komet337.physik.uni-mainz.de/Bluemer/lectures_WS2006 */
/* expects input on stdin in 1st column */
/* compile with cc -lm -o stats_template stats_template.c */


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define BUFSIZE 100
#define NUMHIST 40
#define MAXDATA 100001
#define MIN(a,b) (a<b?a:b)

void error(char error_text[])
/* standard error handler */
{
    fprintf(stderr,"\n%s run-time error\n",PROGNAME);
    fprintf(stderr,"--%s--\n",error_text);
    fprintf(stderr,"for general help use option -h\n");
    fprintf(stderr,"...now exiting to system...\n");
    exit(1);
}


void average(char form){
  double data[MAXDATA];
  double korr[MAXDATA]; 
  char buf[BUFSIZE];
  int i,n,numdata,numkorr;
  double sum, sqsum,nsum,av, var,korrtime,trans;

  numdata=0;
  sum=0.0;
  sqsum=0.0;
  nsum=0;
  do {
    if (fgets(buf,BUFSIZE,stdin)!=NULL){
      numdata++;
      if (numdata>=MAXDATA) error ("too many data points");
      sscanf(buf,"%lf",&data[numdata]);
/*       printf("Nr %d: %f\n",nr,data[numdata]); */
      sum +=data[numdata];
      sqsum += data[numdata]*data[numdata];
      nsum +=numdata*data[numdata];
    }
  } while (feof(stdin)==0);
  if (numdata<2) error ("not enough data");
  av=sum/numdata;
  var=(sqsum-numdata*av*av)/(numdata-1);

  if (form=='l')
    printf("Average: %10.8g, variance: %10.8g, error: %10.8g\n",av,var,sqrt(var/numdata));


  if (form=='c')
    printf("# Autocorrelation function: not yet implemented\n");
  /* computation of autocorrelation time */
  /* computation of transient */
  korrtime=0;
  trans=0;

  if (form=='l') 
    printf ("Korrelation time: %10.8g, corrected error: %10.8g, transient: %10.8g (not yet implemented)\n",
	    korrtime, sqrt(var/numdata)*sqrt(korrtime), trans);
  if (form=='s')
    printf ("%10.8G  %10.8G  %10.8G\n", av, sqrt(var/numdata)*sqrt(korrtime), trans);
}


void histogram ()
{
  printf("please implement!\n");
}


void printhelp ()
{
 printf("**********************************************************\n");
 printf("%s: statistics utility (average, histogram, etc.)\n",PROGNAME);
 printf("Version: %s, %s by %s\n",VERSION,DATE,AUTHOR);
 printf("input:  standardin, 1 column\n");
 printf("options: -a average\n");
 printf("         -s average, short output\n");
 printf("         -c autocorrelation function (not implemented)\n");
 printf("         -i histogram (not implemented)\n");
 printf("         -h this help\n");
}

int main (int argc, char *argv[])
{
  char c;
  while (--argc > 0 && (*++argv)[0] == '-')
    while (c= *++argv[0])
	   switch (c) {
	   case 'a':
	     average('l');
	     break;
	   case 's':
	     average('s');
	     break;
	   case 'c':
	     average('c');
	     break;
	   case 'i':
	     histogram();
	     break;
	   case 'h':
	     printhelp();
	     exit(0);
	   default:
	     error("No valid choice");
	   }
}


syntax highlighted by Code2HTML, v. 0.9.1
Print version: http://dmft.org/Bluemer/codes_stats_template.en.shtml?print

Last changed: 01-Oct-13