X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fmorpheus.git;a=blobdiff_plain;f=main.c;h=9306e60228f3c026a57cc0b15565083af588b4fd;hp=190955cdde5b26e93aa6e285a8f1a3837f124eca;hb=2114472cdcc3dc98f31f44f104148baaf4058651;hpb=bc4fbff2dcad64083b2fa7403d6d17650097c0fd diff --git a/main.c b/main.c index 190955c..9306e60 100644 --- a/main.c +++ b/main.c @@ -13,14 +13,21 @@ #include #include +#include #include #include #include +/* important defines */ #include "defines.h" +/* function prototypes */ +#include "random.h" +#include "display.h" + /* global variables */ u32 sum_z_cells; +u32 sum_range_rate; int random_fd; /* /dev/urandom file descriptor */ int usage() @@ -33,31 +40,58 @@ int usage() puts("-y \t # y cells (default 50)"); puts("-z \t # z cells (default 100)"); puts("-s \t # steps to calculate (default 5000)"); - puts("-X \t display area intercept point x (default 25)"); - puts("-Y \t display area intercept point y (default 25)"); - puts("-Z \t display area intercept point z (default 50)"); + puts("-X \t display area intercept point x (default # x celss / 2)"); + puts("-Y \t display area intercept point y (default # y cells / 2)"); + puts("-Z \t display area intercept point z (default # z cells / 2)"); puts("-d \t refresh every loops (default 100)"); + puts("-r \t pressure range from amorphous SiCx (default 2)"); + puts("-f \t (unused) faktor for pressure from amorphous SiCx (default 1)"); + puts("-p \t p0 for propability of cell getting amorph (default sum_range_rate / 4)"); return -23; } int make_amorph(u32 *cell) { - *cell=*cell|AMORPH; + *cell|=AMORPH; return 23; } int make_cryst(u32 *cell) { - *cell=*cell&(~AMORPH); + *cell&=~AMORPH; return 23; } /* look at cell ... */ -int process_cell(u32 *cell) +int process_cell(void *cell_p,u32 x,u32 y,u32 z,u32 x_max,u32 y_max,u32 z_max,int range,int faktor,int p0) { - /* tag it ... testing! */ - make_amorph(cell); - + u32 *cell; + int i,j,k,count; + // float count; + cell=(u32 *)(cell_p+x+y*(x_max-1)+z*(x_max-1)*(y_max-1)); + count=p0; + for(i=-range;i<=range;i++) + { + for(j=-range;j<=range;j++) + { + for(k=-range;k<=range;k++) + { + if(!(i==0 && j==0 && k==0)) + { + if(*(u32 *)(cell_p+((x+x_max+i)%x_max)+((y+j+y_max)%y_max)*(x_max-1)+((z+k+z_max)%z_max)*(x_max-1)*(y_max-1))&AMORPH) count+=(3*range*range-i*i-j*j-k*k); + } + } + } + } + // count+=faktor*1.0/(i*i+j*j+k*k); + if(*cell&AMORPH) + { + /* wrong propability! just test by now ...*/ + if(rand_get(sum_range_rate)>count) make_cryst(cell); + } else + { + if(rand_get(sum_range_rate)<=count) make_amorph(cell); + } return 23; } @@ -65,8 +99,9 @@ int main(int argc,char **argv) { u32 x_cell,y_cell,z_cell; /* amount of segments */ u32 x,y,z; /* cells */ - int i; /* for counting */ + int i,j,k; /* for counting */ int slope_nel,start_nel; /* nuclear energy loss: slope, constant */ + int a_p_range,a_p_faktor,a_p_p0; /* p. range, p0 and faktor of amorphous sic */ int steps; /* # steps */ void *cell_p; struct __display display; @@ -79,10 +114,13 @@ int main(int argc,char **argv) z_cell=DEFAULT_Z_SEG; slope_nel=DEFAULT_SLOPE_NEL; start_nel=DEFAULT_START_NEL; + a_p_range=DEFAULT_A_P_RANGE; + a_p_faktor=DEFAULT_A_P_FAKTOR; + a_p_p0=NOT_SPECIFIED; steps=DEFAULT_STEPS; - display_x=DEFAULT_DISPLAY_X-1; - display_y=DEFAULT_DISPLAY_Y-1; - display_z=DEFAULT_DISPLAY_Z-1; + display_x=x_cell/2; + display_y=y_cell/2; + display_z=z_cell/2; display_refresh_rate=DEFAULT_DISPLAY_REF_RATE; /* parse command args */ @@ -126,6 +164,15 @@ int main(int argc,char **argv) case 'd': display_refresh_rate=atoi(argv[++i]); break; + case 'r': + a_p_range=atoi(argv[++i]); + break; + case 'f': + a_p_faktor=atoi(argv[++i]); + break; + case 'p': + a_p_p0=atoi(argv[++i]); + break; default: usage(); return -23; @@ -140,15 +187,32 @@ int main(int argc,char **argv) return -23; } - /* calculate sum_z_cells one time! */ + /* calculate sum_z_cells, sum_range_rate one time! */ sum_z_cells=0; for(i=1;i<=z_cell;i++) sum_z_cells+=(start_nel+i*slope_nel); - printfd("debug: sum z cells -> %d\n",sum_z_cells); + printfd("debug: sum z cells -> %u\n",sum_z_cells); + sum_range_rate=0; + for(i=-a_p_range;i<=a_p_range;i++) + { + for(j=-a_p_range;j<=a_p_range;j++) + { + for(k=-a_p_range;k<=a_p_range;k++) + { + if(!(i==0 && j==0 && k==0)) + sum_range_rate+=((3*a_p_range*a_p_range)-i*i-j*j-k*k); + } + } + } + printfd("debug: sum range rate -> %u\n",sum_range_rate); + /* add a_p_p0 ... */ + if(a_p_p0==NOT_SPECIFIED) a_p_p0=sum_range_rate/4; + sum_range_rate+=a_p_p0; /* testing ... */ /* allocate cells */ + printf("malloc will free %d bytes now ...\n",x_cell*y_cell*z_cell*sizeof(u32)); if((cell_p=malloc(x_cell*y_cell*z_cell*sizeof(u32)))==NULL) { puts("failed allocating memory for cells\n"); @@ -168,15 +232,13 @@ int main(int argc,char **argv) /* todo */ // distrib_c_conc(cell_p); - process_cell((u32 *)(cell_p+x+y*(x_cell-1)+z*(x_cell-1)*(y_cell-1))); + + // process_cell((u32 *)(cell_p+x+y*(x_cell-1)+z*(x_cell-1)*(y_cell-1))); + process_cell(cell_p,x,y,z,x_cell,y_cell,z_cell,a_p_range,a_p_faktor,a_p_p0); /* display stuff */ - if((i%display_refresh_rate)==0) - { - puts("refreshing display ..."); - // display_draw(&display,display_x,display_y,display_z); - } - /* */ + if((i%display_refresh_rate)==0) + display_draw(&display,display_x,display_y,display_z); } /* display again and quit when button hit */ @@ -184,5 +246,7 @@ int main(int argc,char **argv) puts("hit button to quit ..."); getchar(); + display_release(&display); + return 23; }