fixed type & increased MAX_CHAR size
[physik/nlsop.git] / nlsop.c
diff --git a/nlsop.c b/nlsop.c
index ff89e7c..5470960 100644 (file)
--- a/nlsop.c
+++ b/nlsop.c
@@ -32,6 +32,7 @@
 /* test globals - get removed or included in my_info struct later */
 int amorph_count;
 int cryst_count;
+unsigned char c_diff;
 
 int usage(void)
 {
@@ -39,6 +40,7 @@ int usage(void)
  puts("-h \t\t help");
  puts("-n \t\t no user interaction");
  puts("-Z \t\t cryst -> amorph c diffusion in z direction");
+ puts("-i \t\t no cryst to cryst diffusion");
  printf("-a <value> \t slope of nuclear energy loss (default %f)\n",A_EL);
  printf("-b <value> \t nuclear energy loss offset (default %f)\n",B_EL);
  printf("-x <value> \t # x cells (default %d)\n",X);
@@ -55,12 +57,13 @@ int usage(void)
  printf("-D <value> \t diffusion rate from cryst to amorph cells (default %f)\n",DR_AC);
  printf("-c <value> \t diffusion rate in cryst cells (default %f)\n",DR_CC);
  printf("-e <value> \t do diffusion every <value> steps (default %d)\n",DIFF_RATE);
+ puts("-g <file> <step> continue simulation from file and step (step > 0)!");
  printf("-W <value> \t write every <value> steps to save file (default %d)\n",RESAVE);
  puts("-C <file> \t convert file to gnuplot format");
  puts("-L <file> \t load from file");
  puts("-S <file> \t save to file");
  puts("-R <file> \t read from random file");
- puts("-P <file> \t specify implantatin profile file");
+ puts("-P <file> \t specify implantation profile file");
  
  return 1;
 }
@@ -135,7 +138,7 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio)
    for(k=0;k<d3_l->max_z;k++)
    {
     offset=i+j*d3_l->max_x+k*d3_l->max_x*d3_l->max_y;
-    /* case amorph - amorph <-> cryst diffusion */
+    /* case amorph: amorph <- cryst diffusion */
     if(*(d3_l->status+offset)&AMORPH)
     {
      for(c=-1;c<=1;c++)
@@ -184,7 +187,11 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio)
       }
      }  
     } else
-    /* case not amorph - cryst <-> cryst diffusion */
+    /* case not amorph: cryst <-> cryst diffusion */
+
+    /* test ! */
+    if(c_diff) {
+    /* */
     {
      for(c=-1;c<=1;c++) 
      {
@@ -221,6 +228,9 @@ int distrib_c(d3_lattice *d3_l,info *my_info,int step,double c_ratio)
       }
      }
     }
+    /* end test */
+    }
+    /* */
    } /* for z */
   } /* for y */
  } /* for x */
@@ -307,7 +317,7 @@ int calc_max_extra(d3_lattice *d3_l)
 
 int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
 {
- int fd,i,j,size=0;
+ int fd,i,j,size=0,foo=0;
  int width=0,height=0;
  char bmpfile[MAX_CHARS];
  char buf[128];
@@ -315,23 +325,26 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
  if(window==1)
  {
   sprintf(bmpfile,"x-z_%d.bmp",y);
-  size=x*z;
-  width=x;
-  height=z;
+  foo=3*d3_l->max_x;
+  size=(foo+(4-foo%4))*d3_l->max_z;
+  width=d3_l->max_x;
+  height=d3_l->max_z;
  }
  if(window==2)
  {
   sprintf(bmpfile,"y-z_%d.bmp",x);
-  size=y*z;
-  width=y;
-  height=z;
+  foo=3*d3_l->max_y;
+  size=(foo+(4-foo%4))*d3_l->max_z;
+  width=d3_l->max_y;
+  height=d3_l->max_z;
  }
  if(window==3)
  {
   sprintf(bmpfile,"x-y_%d.bmp",z);
-  size=x*y;
-  width=x;
-  height=y;
+  foo=3*d3_l->max_x;
+  size=(foo+(4-foo%4))*d3_l->max_y;
+  width=d3_l->max_x;
+  height=d3_l->max_y;
  }
 
  if((fd=open(bmpfile,O_WRONLY|O_CREAT))<0)
@@ -379,11 +392,11 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
  }
  if(window==1)
  {
-  for(i=0;i<d3_l->max_x;i++)
+  for(j=0;j<d3_l->max_z;j++)
   {
-   for(j=0;j<d3_l->max_z;j++)
+   for(i=0;i<d3_l->max_x;i++)
    {
-    if(*(d3_l->status+i+y*d3_l->max_x+j*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
+    if(*(d3_l->status+i+y*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
     else memset(buf,0,3);
     if(write(fd,buf,3)<3)
     {
@@ -391,15 +404,24 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
      return-1;
     }
    }
+   if(foo%4)
+   {
+    memset(buf,0,4-foo%4);
+    if(write(fd,buf,4-foo%4)<4-foo%4)
+    {
+     puts("failed writing 4 byte ending");
+     return -1;
+    }
+   } 
   }
  }
  if(window==2)
  {
-  for(i=0;i<d3_l->max_y;i++)
+  for(j=0;j<d3_l->max_z;j++)
   {
-   for(j=0;j<d3_l->max_z;j++)
+   for(i=0;i<d3_l->max_y;i++)
    {
-    if(*(d3_l->status+x+i*d3_l->max_x+j*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
+    if(*(d3_l->status+x+i*d3_l->max_x+(d3_l->max_z-j-1)*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
     else memset(buf,0,3);
     if(write(fd,buf,3)<3)
     {
@@ -407,15 +429,24 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
      return-1;
     }
    }
+   if(foo%4)
+   {
+    memset(buf,0,4-foo%4);
+    if(write(fd,buf,4-foo%4)<4-foo%4)
+    {
+     puts("failed writing 4 byte ending");
+     return -1;
+    }
+   }
   }
  }
  if(window==3)
  {
-  for(i=0;i<d3_l->max_x;i++)
+  for(j=0;j<d3_l->max_y;j++)
   {
-   for(j=0;j<d3_l->max_y;j++)
+   for(i=0;i<d3_l->max_x;i++)
    {
-    if(*(d3_l->status+i+j*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
+    if(*(d3_l->status+i+(d3_l->max_y-j-1)*d3_l->max_x+z*d3_l->max_x*d3_l->max_y)&RED) memset(buf,0xff,3);
     else memset(buf,0,3);
     if(write(fd,buf,3)<3)
     {
@@ -423,6 +454,15 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
      return -1;
     }
    }
+   if(foo%4)
+   {
+    memset(buf,0,4-foo%4);
+    if(write(fd,buf,4-foo%4)<4-foo%4)
+    {
+     puts("failed writing 4 byte ending");
+     return -1;
+    }
+   }
   }
  }
  close(fd);
@@ -582,6 +622,7 @@ int main(int argc,char **argv)
  u32 x,y,z,x_c,y_c,z_c;
  int i,quit,escape,switchmode,nowait,bmp;
  int refresh,resave;
+ int c_step;
  char s_file[MAX_CHARS];
  char s_file_tmp[MAX_CHARS];
  char l_file[MAX_CHARS];
@@ -626,6 +667,7 @@ int main(int argc,char **argv)
  refresh=REFRESH;
  resave=RESAVE;
  my_info.z_diff=0;
+ c_diff=1;
  my_info.a_el=A_EL;
  my_info.b_el=B_EL;
  my_info.a_cd=A_CD;
@@ -641,6 +683,7 @@ int main(int argc,char **argv)
  quit=0;
  escape=0;
  switchmode=0;
+ c_step=0;
  strcpy(s_file,"");
  strcpy(l_file,"");
  strcpy(c_file,"");
@@ -682,6 +725,9 @@ int main(int argc,char **argv)
     case 'Z':
      my_info.z_diff=1;
      break;
+    case 'i':
+     c_diff=0;
+     break;
     case 's':
      my_info.steps=atoi(argv[++i]);
      break;
@@ -735,6 +781,10 @@ int main(int argc,char **argv)
     case 'P':
      strcpy(p_file,argv[++i]);
      break;
+    case 'g':
+     strcpy(l_file,argv[++i]);
+     if(i<argc-1) if(argv[i+1][0]!='-') c_step=atoi(argv[++i]);
+     break;
     default:
      usage();
      return -1;
@@ -787,7 +837,7 @@ int main(int argc,char **argv)
    return 1;
   } 
 #ifdef USE_DFB_API
-    else d3_lattice_init(&argc,argv,&d3_l);
+  else d3_lattice_init(&argc,argv,&d3_l);
 #endif
  }
 
@@ -836,14 +886,14 @@ int main(int argc,char **argv)
  arg_v[25]=dr_cc_txt;
 #endif
 
- if(!strcmp(l_file,""))
+ if((!strcmp(l_file,""))||(c_step))
  {
   if(get_c_ratio(&c_ratio,p_file,&my_info,&d3_l)!=1)
   {
    puts("failed calculating ratio");
    return -1;
   }
-  i=0;
+  i=(c_step?c_step:0);
   while((i<my_info.steps) && (quit==0) && (escape==0))
   {
    x_c=get_rand(d3_l.max_x);