added mc_init
[physik/computational_physics.git] / zentral.c
1 /*
2  * zentral.c - teilchen im zentralfeld
3  *
4  * usag: ./zentral <x_0> <y_0> <vx_0> <vy_0> <steps> <alpha>
5  *
6  */
7
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <math.h>
12 #include <stdlib.h>
13 #include "g_plot.h"
14
15 int main(int argc,char **argv) {
16  double x_p,x,y_p,y,r_3; /* ortsvektor */
17  double vx_p,vx,vy_p,vy; /* geschwindigkeitsvektor */
18  int steps,i,j;
19  double tau;
20  double alpha,f_x,f_y;
21  int fd;
22  char filename[64];
23  double *buf;
24
25  if(argc!=7) {
26   printf("usage: %s <x_0> <y_0> <vx_0> <vy_0> <steps> <alpha>\n",argv[0]);
27   return -1;
28  }
29
30  /* init + starting conditions */
31  x_p=atof(argv[1]); y_p=atof(argv[2]);
32  vx_p=atof(argv[3]); vy_p=atof(argv[4]);
33  steps=atoi(argv[5]); alpha=atof(argv[6]);
34  tau=2*M_PI/steps;
35  sprintf(filename,"zentral_%f_%f_%f_%f_%d_%f.plot",x_p,y_p,vx_p,vy_p,steps,alpha);
36  fd=gp_init(filename);
37
38  /* allocate memory for data buffer */
39  if((buf=(double *)malloc(5*steps*sizeof(double)))==NULL) {
40   puts("malloc failed!");
41   return -1;
42  }
43  buf[0]=0;
44  buf[1]=x_p; buf[2]=y_p;
45  buf[3]=vx_p; buf[4]=vy_p;
46
47  /* loop */
48  for(i=0;i<steps;i++) {
49   r_3=sqrt(x_p*x_p+y_p*y_p)*(x_p*x_p+y_p*y_p);
50   f_x=-alpha*x_p/r_3; f_y=-alpha*y_p/r_3;
51   x=x_p+vx_p*tau; y=y_p+vy_p*tau;
52   vx=vx_p+f_x*tau; vy=vy_p+f_y*tau;
53   /* save */
54   j=5*i;
55   buf[5+j]=i*tau;
56   buf[6+j]=x; buf[7+j]=y;
57   buf[8+j]=vx; buf[9+j]=vy;
58   /* switch */
59   x_p=x; y_p=y;
60   vx_p=vx; vy_p=vy;
61  }
62
63  /* write to file */
64  gp_add_data(fd,buf,5,steps,TYPE_DOUBLE);
65  gp_close(fd);
66
67  free(buf);
68
69  return 1;
70 }