8 * compile: gcc -Wall -o dfe dfe.c bmp.c list.c -O3 -lm
10 * usage: ./dfe 100 50 2 1 1 10
12 * anmerkung frank: bisschen was ging so: ./dfe 1 5 2 1 1 10
13 * ist auch schotter, aber mit richtigen parametern
14 * wirds. viel glueck!!
16 * author: christian leirer, frank zirkelbach
18 * need api: cvs -d:pserver:anonymous@hackdaworld.dyndns.org:/my-code co api
43 int main(int argc,char **argv) {
72 printf("usage: %s <b-feld> <p-pot> <xi> <rand-scale> <coulomb> <b-force>\n",
86 fd=open("/dev/null",O_WRONLY);
100 memset(&gp,0,sizeof(t_gp));
103 list_add_element(&list,&gp,sizeof(t_gp));
107 for(i=0;i<STEPS;i++) {
109 /* determine status of vortex, liquid or solid */
113 gp_ptr=(t_gp *)list.current->data;
115 for(dx=-RANGE;dx<=RANGE;dx++) {
116 for(dy=-RANGE;dy<=RANGE;dy++) {
117 if((dx!=0)||(dy!=0)) {
118 x=(gp_ptr->x+X_+dx)%X_;
122 if(list_search_data(&list,&gp,2*sizeof(int))==L_SUCCESS)
123 lpp+=exp(-1.0*sqrt(x*x+y*y)/xi);
129 if(lpp>(0.8*pp)) gp_ptr->status=FLUESSIG;
130 else gp_ptr->status=FEST;
133 while(list_next(&list)!=L_NO_NEXT_ELEMENT);
135 /* force on vortex */
143 gp_ptr=(t_gp *)list.current->data;
144 for(dx=-RANGE;dx<=RANGE;dx++) {
145 for(dy=-RANGE;dy<=RANGE;dy++) {
146 if((dx!=0)||(dy!=0)) {
147 x=(gp_ptr->x+X_+dx)%X_;
151 if(list_search_data(&list,&gp,2*sizeof(int))==L_SUCCESS) {
152 memcpy(&gp,list.current->data,sizeof(t_gp));
154 if(dy==0) sf[0]+=(-1.0/(dx*dx)*co*(dx/abs(dx)));
155 else if (dx==0) sf[1]+=(-1.0/(dy*dy)*co*(dy/abs(dy)));
157 sf[0]+=(-1.0/(dx*dx+dy*dy)*co*1.0*dx/abs(dy));
158 sf[1]+=(-1.0/(dx*dx+dy*dy)*co*1.0*dy/abs(dx));
162 if(dy==0) lf[0]+=(-1.0*(dx/abs(dx))*(by+co));
163 else if(dx==0) lf[1]+=(-1.0*(dy/abs(dy))*(by+co));
165 lf[0]+=(-1.0*dx/abs(dy)*(by+co));
166 lf[1]+=(-1.0*dy/abs(dx)*(by+co));
174 gp_ptr->fx=sf[0]+lf[0]+((1.0*rand()/RAND_MAX)-0.5)/rs;
175 gp_ptr->fy=sf[1]+lf[1]+((1.0*rand()/RAND_MAX)-0.5)/rs;
176 if(gp_ptr->y==0) gp_ptr->fy+=by;
177 if(gp_ptr->status&FEST) {
178 gp_ptr->fy+=(bf*exp(-y*1.0/1000));
180 gp_ptr->fx-=gp_ptr->pp;
181 if(gp_ptr->fx<0) gp_ptr->fx=0;
184 gp_ptr->fx+=gp_ptr->pp;
185 if(gp_ptr->fx>0) gp_ptr->fx=0;
188 gp_ptr->fy-=gp_ptr->pp;
189 if(gp_ptr->fy<0) gp_ptr->fy=0;
192 gp_ptr->fy+=gp_ptr->pp;
193 if(gp_ptr->fy>0) gp_ptr->fy=0;
196 if((mf<gp_ptr->fx)||(mf<gp_ptr->fy)) {
197 mf=gp_ptr->fx>gp_ptr->fy?gp_ptr->fx:gp_ptr->fy;
203 while(list_next(&list)!=L_NO_NEXT_ELEMENT);
205 /* move vortex with highest force */
207 printf("step %d: want to move vortex %d %d,",i,mx,my);
208 list_search_data(&list,&gp,2*sizeof(int));
209 gp_ptr=(t_gp *)list.current->data;
211 if(fabs(gp_ptr->fx)>fabs(gp_ptr->fy)) {
212 if(gp_ptr->fx>0) dx=1;
216 if(gp_ptr->fy>0) dy=1;
219 printf(" with direction dx=%d dy=%d | force: %f %f\n",dx,dy,gp_ptr->fx,gp_ptr->fy);
222 if(list_search_data(&list,&cgp,2*sizeof(int))==L_SUCCESS) {
223 printf("but there is allready a flussfaden! this parameter set suX!\n");
225 else if(gp_ptr->y==0&&dy==-1) {
226 printf("but this wuld be stupid (out of target), skipped!\n");
229 printf("and i am doing it now! :)\n");
233 printf("adding moved flussfaden (y=0)\n");
234 list_add_element(&list,&gp,sizeof(t_gp));
237 if(gp_ptr->y==Y_-1) {
238 printf("flussfaden reached top of target, ending simulation!\n");
243 printf("alle flussfaden:\n");
246 gp_ptr=(t_gp *)list.current->data;
247 printf("flussfaden bei %d %d\n",gp_ptr->x,gp_ptr->y);
248 } while(list_next(&list)!=L_NO_NEXT_ELEMENT);
251 /* plot every PLOT steps */
253 memset(bmp.map,0,3*size*sizeof(unsigned char));
256 gp_ptr=(t_gp *)list.current->data;
257 if(gp_ptr->status&FEST)
258 memset(bmp.map+gp_ptr->y*X_+gp_ptr->x,0xff,1);
260 memset(bmp.map+gp_ptr->y*X_+gp_ptr->x,0xff,3);
261 } while(list_next(&list)!=L_NO_NEXT_ELEMENT);
262 sprintf(string,"dfe_%d_of_%d.bmp",i,STEPS);
263 strcpy(bmp.file,string);
264 bmp_write_file(&bmp);