added -g (continue from file at certain step feature) good for power interrupts ;)
[physik/nlsop.git] / nlsop.c
diff --git a/nlsop.c b/nlsop.c
index 372af4e..5b160bc 100644 (file)
--- a/nlsop.c
+++ b/nlsop.c
@@ -55,6 +55,7 @@ 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> \t 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");
@@ -307,7 +308,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,21 +316,24 @@ 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=3*d3_l->max_x*d3_l->max_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=3*d3_l->max_y*d3_l->max_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=3*d3_l->max_x*d3_l->max_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;
  }
@@ -383,7 +387,7 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
   {
    for(i=0;i<d3_l->max_x;i++)
    {
-    if(*(d3_l->status+i+y*d3_l->max_x+(d3_l->max_z-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,6 +395,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;
+    }
+   } 
   }
  }
  if(window==2)
@@ -399,7 +412,7 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
   {
    for(i=0;i<d3_l->max_y;i++)
    {
-    if(*(d3_l->status+x+i*d3_l->max_x+(d3_l->max_z-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,6 +420,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;
+    }
+   }
   }
  }
  if(window==3)
@@ -415,7 +437,7 @@ int write_bmp(d3_lattice *d3_l,int window,u32 x,u32 y,u32 z)
   {
    for(i=0;i<d3_l->max_x;i++)
    {
-    if(*(d3_l->status+i+(d3_l->max_y-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 +445,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 +613,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];
@@ -641,6 +673,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,"");
@@ -735,6 +768,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 +824,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 +873,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);