8 * compile: gcc -Wall -o dfe dfe.c bmp.c list.c -O3 -lm
10 * usage: ./dfe 100 50 2 1 1 10
12 * author: christian leirer, frank zirkelbach
14 * need api: cvs -d:pserver:anonymous@hackdaworld.dyndns.org:/my-code co api
39 int main(int argc,char **argv) {
68 printf("usage: %s <b-feld> <p-pot> <xi> <rand-scale> <coulomb> <b-force>\n",
82 fd=open("/dev/null",O_WRONLY);
96 memset(&gp,0,sizeof(t_gp));
99 list_add_element(&list,&gp,sizeof(t_gp));
103 for(i=0;i<STEPS;i++) {
104 /* determine status of vortex, liquid or solid */
108 gp_ptr=(t_gp *)list.current->data;
110 for(dx=-RANGE;dx<=RANGE;dx++) {
111 for(dy=-RANGE;dy<=RANGE;dy++) {
112 if((dx!=0)||(dy!=0)) {
113 x=(gp_ptr->x+X_+dx)%X_;
117 if(list_search_data(&list,&gp,2*sizeof(int))==L_SUCCESS)
118 gp_ptr->pp+=exp(-1.0*sqrt(x*x+y*y)/xi);
124 if(lpp>(0.8*pp)) gp_ptr->status=FLUESSIG;
125 else gp_ptr->status=FEST;
128 while(list_next(&list)!=L_NO_NEXT_ELEMENT);
130 /* force on vortex */
137 gp_ptr=(t_gp *)list.current->data;
138 for(dx=-RANGE;dx<=RANGE;dx++) {
139 for(dy=-RANGE;dy<=RANGE;dy++) {
140 if((dx!=0)||(dy!=0)) {
141 x=(gp_ptr->x+X_+dx)%X_;
145 if(list_search_data(&list,&gp,2*sizeof(int))==L_SUCCESS) {
146 memcpy(&gp,list.current->data,sizeof(t_gp));
148 if(dy==0) sf[0]+=(-1.0/(dx*dx+dy*dy)*co*(dx/abs(dx)));
149 else if (dx==0) sf[1]+=(-1.0/(dx*dx+dy*dy)*co*(dy/abs(dy)));
150 /* hier ist die scheisse drin!! */
152 sf[0]+=(-1.0/(dx*dx+dy*dy)*co*dx/abs(dy));
153 sf[1]+=(-1.0/(dx*dx+dy*dy)*co*dy/abs(dx));
157 /* und hier wahrscheinlich auch */
158 if(dy==0) lf[0]+=(-1.0*(dx/abs(dx))*(by+co));
159 else if(dx==0) lf[1]+=(-1.0*(dy/abs(dy))*(by+co));
161 lf[0]+=(-1.0*dx/abs(dy)*(by+co));
162 lf[1]+=(-1.0*dy/abs(dx)*(by+co));
170 gp_ptr->fx=sf[0]+lf[0]+((1.0*rand()/RAND_MAX)-0.5)/rs;
171 gp_ptr->fy=sf[1]+lf[1]+((1.0*rand()/RAND_MAX)-0.5)/rs;
172 if(gp_ptr->status&FEST) {
173 gp_ptr->fy+=(bf*exp(-y*1.0/100));
175 gp_ptr->fx-=gp_ptr->pp;
176 if(gp_ptr->fx<0) gp_ptr->fx=0;
179 gp_ptr->fx+=gp_ptr->pp;
180 if(gp_ptr->fx>0) gp_ptr->fx=0;
183 gp_ptr->fy-=gp_ptr->pp;
184 if(gp_ptr->fy<0) gp_ptr->fy=0;
187 gp_ptr->fy+=gp_ptr->pp;
188 if(gp_ptr->fy>0) gp_ptr->fy=0;
191 if(gp_ptr->y==0) gp_ptr->fy+=by; /* wenn rand by dazu, arschloch !!1 */
192 if((mf<gp_ptr->fx)||(mf<gp_ptr->fy)) {
193 mf=gp_ptr->fx>gp_ptr->fy?gp_ptr->fx:gp_ptr->fy;
199 while(list_next(&list)!=L_NO_NEXT_ELEMENT);
201 /* move vortex with highest force */
203 printf("step %d: move vortex %d %d,",i,mx,my);
204 list_search_data(&list,&gp,2*sizeof(int));
205 gp_ptr=(t_gp *)list.current->data;
207 if(fabs(gp_ptr->fx)>fabs(gp_ptr->fy)) {
208 if(gp_ptr->fx>0) dx=1;
212 if(gp_ptr->fy>0) dy=1;
215 printf(" with direction dx=%d dy=%d | force: %f %f\n",dx,dy,gp_ptr->fx,gp_ptr->fy);
218 if(gp.y==0) list_add_element(&list,&gp,sizeof(t_gp));
220 /* plot every PLOT steps */
222 memset(bmp.map,0,3*size*sizeof(unsigned char));
225 gp_ptr=(t_gp *)list.current->data;
226 if(gp_ptr->status&FEST)
227 memset(bmp.map+gp_ptr->y*X_+gp_ptr->x,0xff,1);
229 memset(bmp.map+gp_ptr->y*X_+gp_ptr->x,0xff,3);
230 } while(list_next(&list)!=L_NO_NEXT_ELEMENT);
231 sprintf(string,"dfe_%d_of_%d.bmp",i,STEPS);
232 strcpy(bmp.file,string);
233 bmp_write_file(&bmp);