fixed distrib_c
[physik/nlsop.git] / nlsop.c
diff --git a/nlsop.c b/nlsop.c
index 030db9f..7dc862c 100644 (file)
--- a/nlsop.c
+++ b/nlsop.c
@@ -38,9 +38,11 @@ int usage(void)
  printf("-x <value> \t # x cells (default %d)\n",X);
  printf("-y <value> \t # x cells (default %d)\n",Y);
  printf("-z <value> \t # x cells (default %d)\n",Z);
+ /*
  printf("-X <value> \t display x (default %d)\n",X/2-1);
  printf("-Y <value> \t display y (default %d)\n",Y/2-1);
  printf("-Z <value> \t display z (default %d)\n",Z/2-1);
+ */
  printf("-s <value> \t steps (default %d)\n",STEPS);
  printf("-d <value> \t refresh display (default %d)\n",REFRESH);
  printf("-r <value> \t amorphous influence range (default %d)\n",RANGE);
@@ -76,20 +78,23 @@ int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,int r,double a,double b,int
    } 
   }
  }
- p*=*conc;
+ // p*=*conc;
+ // printf("debug: p * conc = %f\n",p);
  if(!(*thiz&AMORPH))
  {
-  if(rand_get(URAND_MAX)<=p)
+  if(get_rand(URAND_MAX)<=p)
   {
    MAKE_AMORPH(thiz);
+   printf("debug: c->a %d - %d\n",*t_c,*conc);
    *t_c=*t_c+1-*conc;
   } else *t_c+=1;
  } else
  {
   /* assume 1-p probability */
-  if(rand_get(URAND_MAX)>p)
+  if(get_rand(URAND_MAX)>p)
   {
    MAKE_CRYST(thiz);
+   printf("debug: a->c %d - %d\n",*t_c,*conc);
    *t_c=*t_c+1+*conc;
   } else *t_c+=1;
  }
@@ -99,7 +104,8 @@ int process_cell(d3_lattice *d3_l,u32 x,u32 y,u32 z,int r,double a,double b,int
 
 int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
 {
- int i,j,k,total,area,sum;
+ int i,j,k,total,area;
+ double sum;
  int temp,left;
  int *area_h;
  u32 x,y,z;
@@ -108,7 +114,7 @@ int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
  area_h=(int *)malloc(d3_l->max_z*sizeof(int));
 
  total=0;
- sum=0;
+ sum=b*d3_l->max_z+a*d3_l->max_z*(d3_l->max_z+1)/2;
  for(i=0;i<d3_l->max_z;i++)
  {
   area_h[i]=0;
@@ -116,16 +122,12 @@ int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
   {
    if(!(*(d3_l->status+(i*area)+j)&AMORPH))
    {
-    sum+=(i+1)*a+b;
     area_h[i]+=1;
    }
   }
- }
- for(i=0;i<d3_l->max_z;i++)
- {
-  temp=((i+1)*a+b)*t_c/(sum+area_h[i]);
-  if(temp>1)
-  {
+  temp=(int)((i+1)*a+b)*t_c/(sum*area_h[i]);
+  // if(temp)
+  // {
    for(j=0;j<area;j++)
    {
     if(!(*(d3_l->status+(i*area)+j)&AMORPH))
@@ -134,17 +136,18 @@ int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
      total+=temp;
     }
    }
-  }
+  // }
   left=(int)(((i+1)*a+b)*t_c/sum)%area_h[i];
   while(left)
   {
-  x=get_rand(d3_l->max_x);
-  y=get_rand(d3_l->max_y);
-  if(!(*(d3_l->status+(i*area)+x+y*d3_l->max_x)&AMORPH))
-  {
-   *(d3_l->extra+(i*area)+x+y*d3_l->max_x)+=1;
-   total+=1;
-   left-=1;
+   x=get_rand(d3_l->max_x);
+   y=get_rand(d3_l->max_y);
+   if(!(*(d3_l->status+(i*area)+x+y*d3_l->max_x)&AMORPH))
+   {
+    *(d3_l->extra+(i*area)+x+y*d3_l->max_x)+=1;
+    total+=1;
+    left-=1;
+   }
   }
  }
  left=t_c-total;
@@ -153,13 +156,13 @@ int distrib_c(d3_lattice *d3_l,int t_c,double a,double b)
   x=get_rand(d3_l->max_x);
   y=get_rand(d3_l->max_y);
   z=get_rand_lgp(d3_l->max_z,a,b);
-  if(!(*(d3_l->status+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&AMORPH))
+  if(!(*(d3_l->status+x+y*d3_l->max_x+z*area)&AMORPH))
   {
-   *(d3_l->extra+x+y*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)+=1;
+   *(d3_l->extra+x+y*d3_l->max_x+z*area)+=1;
    left-=1;
-   total+=1;
   }
  }
+ free(area_h);
 
  return 1;
 }
@@ -250,15 +253,12 @@ int main(int argc,char **argv)
  char conc_txt[MAX_TXT];
  char steps_txt[MAX_TXT];
  char cc_txt[MAX_TXT];
- char **arg_v;
+ char *arg_v[MAX_ARGV];
  d3_lattice d3_l;
 
  max_x=X;
  max_y=Y;
  max_z=Z;
- x=X/2-1;
- y=Y/2-1;
- z=Z/2-1;
  steps=STEPS;
  range=RANGE;
  refresh=REFRESH;
@@ -270,6 +270,8 @@ int main(int argc,char **argv)
  b_ap=B_AP;
  cc=CC;
  nowait=0;
+ quit=0;
+ escape=0;
  strcpy(s_file,"");
  strcpy(l_file,"");
  strcpy(r_file,"");
@@ -301,6 +303,7 @@ int main(int argc,char **argv)
     case 'z':
      max_z=atoi(argv[++i]);
      break;
+    /*
     case 'X':
      x=atoi(argv[++i]);
      break;
@@ -310,6 +313,7 @@ int main(int argc,char **argv)
     case 'Z':
      z=atoi(argv[++i]);
      break;
+    */
     case 's':
      steps=atoi(argv[++i]);
      break;
@@ -350,6 +354,10 @@ int main(int argc,char **argv)
   } else usage();
  }
 
+ x=max_x/2-1;
+ y=max_y/2-1;
+ z=max_z/2-1;
+
  if(!strcmp(r_file,"")) rand_init(NULL);
  else rand_init(r_file);
 
@@ -379,18 +387,19 @@ int main(int argc,char **argv)
 
  if(!strcmp(l_file,""))
  {
+  i=0;
   while((i<steps) && (quit==0) && (escape==0))
   {
-   x_c=rand_get(d3_l.max_x);
-   y_c=rand_get(d3_l.max_y);
-   z_c=rand_get_lgp(d3_l.max_z,a_el,b_el);
+   x_c=get_rand(d3_l.max_x);
+   y_c=get_rand(d3_l.max_y);
+   z_c=get_rand_lgp(d3_l.max_z,a_el,b_el);
    distrib_c(&d3_l,cc,a_cd,b_cd);
    process_cell(&d3_l,x_c,y_c,z_c,range,a_ap,b_ap,&cc);
    if(i%refresh==0)
    {
-    sprintf(x_txt,"x: %d",x);
-    sprintf(y_txt,"y: %d",y);
-    sprintf(z_txt,"z: %d",z);
+    sprintf(x_txt,"x: %d",x+1);
+    sprintf(y_txt,"y: %d",y+1);
+    sprintf(z_txt,"z: %d",z+1);
     sprintf(status_txt,"status: %c",(*(d3_l.status+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y)&AMORPH)?'a':'c');
     sprintf(conc_txt,"conc: %d",*(d3_l.extra+x+y*d3_l.max_x+z*d3_l.max_x*d3_l.max_y));
     sprintf(steps_txt,"step: %d",i);
@@ -406,12 +415,14 @@ int main(int argc,char **argv)
     arg_v[9]=steps_txt;
     arg_v[10]=cc_txt;
     d3_lattice_draw(&d3_l,x,y,z,10,arg_v);
-    scan_event(&d3_l,&x,&y,&z,&quit,&escape);
+    // scan_event(&d3_l,&x,&y,&z,&quit,&escape);
    }
-   ++i;
+   i++;
   }
  }
 
+ if(strcmp(s_file,"")) save_to_file(s_file,&d3_l);
+
  while((quit==0) && (escape==0) && (nowait==0))
  {
   sprintf(x_txt,"x: %d",x);