📄 parallelmandelbort.c
字号:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "X11/bitmaps/icon"
main(int argc,char **argv)
{ double t1,t2;
float inp1=-2.0;
float inp2=-2.0;
float inp3=4.0;
float inp4=4.0;
float par[4];
int xinhao=1;
int Tx;
int Ty;
int Bx;
int By;
int Mx;
int My;
int p=1;
int size,rank;
int color[400][400];
int buf[400];
int i,j;
int number,nslave,cow;
MPI_Status status;
Display* display=NULL;
int screen_info; //screen's information
int screen_width; //screen's width
int screen_height; //screen's height
Window paint_win; //paint window
int paint_win_width=400; //paint window's width
int paint_win_height=400; //paint window's height
int paint_win_x; //paint window's x
int paint_win_y; //paint window's y
int paint_win_size=1;
char* paint_win_name="tsingsong\'s windows"; //the windows name
char* icon_name="Sky";
XSizeHints paint_win_hints;
XWMHints wm_hints;
XClassHint class_hints;
Pixmap icon_pixmap;
int icon_wwidth=icon_width;// icon's width
int icon_wheight=icon_height;//icon's height
XTextProperty window_name;
XTextProperty iconname;
XEvent report;
GC gc;
XColor pcolor;
XGCValues values;
Colormap map;
int Draw_x;
int Draw_y;
float Drawc_x;
float Drawc_y;
const int num=250;
int count;
float DrawPoint_x;
float DrawPoint_y;
float squre_r;
float temp;
int r[255];
int g[255];
int b[255];
int index;
srand((unsigned)time(NULL));
for(i=0;i<256;i++)
{r[i]=(i*i*1000)%65535;
g[i]=(i*i*i*5000)%65535;
b[i]=(i*i*i*i*8000)&65535;}
MPI_Init(&argc,&argv);
t1=MPI_Wtime();
MPI_Comm_rank(MPI_COMM_WORLD,&rank); //μ?μ???3ìμ???3ìo?
if(rank==0) //master
{ for(i=0;i++;i<400)
for(j=0;j++;j<400)
color[i][j]=0;
display=XOpenDisplay("");//connect server to Xlib
if(display==NULL)
{ printf("the display cann't open!\n");
exit(-1); }
screen_info=DefaultScreen(display);//get screen's information
screen_width=DisplayWidth(display,screen_info);//get screen's width
screen_height=DisplayHeight(display,screen_info);//get screen's height
paint_win_x=(screen_width-paint_win_width)/2;
paint_win_y=(screen_height-paint_win_height)/2;
paint_win=XCreateSimpleWindow(display,RootWindow(display,screen_info) ,paint_win_x,paint_win_y,paint_win_width,paint_win_height
,4,65535,65535);
icon_pixmap=XCreateBitmapFromData(display,paint_win,icon_bits,icon_wwidth,icon_wheight);
if(XStringListToTextProperty(&icon_name,1,&iconname)==0)
printf("the change is failed!\n");
if(XStringListToTextProperty(&paint_win_name,1,&window_name)==0)
printf("the change is failed!\n");
paint_win_hints.flags=PPosition | PSize | PMinSize;
paint_win_hints.min_width=300;
paint_win_hints.min_height=300;
wm_hints.initial_state=NormalState;
wm_hints.input=True;
wm_hints.icon_pixmap=icon_pixmap;
wm_hints.flags=StateHint | IconPixmapHint | InputHint;
class_hints.res_name=argv[0];
class_hints.res_class="Basic win";
XSetWMProperties(display,paint_win,&window_name,&iconname,argv,argc,&paint_win_hints,&wm_hints,&class_hints);
XSelectInput(display,paint_win,ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask | ButtonReleaseMask |ButtonMotionMask);
XMapWindow(display,paint_win);//show the paint window
par[0]=inp1;
par[1]=inp2;
par[2]=inp3;
par[3]=inp4;
MPI_Comm_size(MPI_COMM_WORLD,&size); //μ?μ???3ìμ???êy
nslave=size-1; //μ?μ?′ó??3ìμ???êy
for(number=0;number<nslave;number++)
{ MPI_Send(par,4,MPI_FLOAT,number+1,number,MPI_COMM_WORLD);
MPI_Send(&number,1,MPI_INT,number+1,number,MPI_COMM_WORLD);//?íDDo?
}
for(i=0;i<400;i++)
{ MPI_Recv(buf,400,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); cow=status.MPI_TAG;
for(j=0;j<400;j++)
{ color[cow][j]=buf[j]; }
if(number<400)
{ MPI_Send(&number,1,MPI_INT,status.MPI_SOURCE,number,MPI_COMM_WORLD);//?íDDo?
number++; }
else { MPI_Send(&number,1,MPI_INT,status.MPI_SOURCE,number,MPI_COMM_WORLD);//?íDDo?
} }
while(1)
{ XNextEvent(display,&report);
switch(report.type)
{case Expose:
map=DefaultColormap(display,DefaultScreen(display));
pcolor.flags=DoRed|DoGreen|DoBlue;
gc=XCreateGC(display,paint_win,0,&values);
for(Draw_x=0;Draw_x<400;Draw_x++)
for(Draw_y=0;Draw_y<400;Draw_y++)
{if(color[Draw_x][Draw_y]==num)
{ pcolor.red=0;
pcolor.green=0;
pcolor.blue=0;
}
else { pcolor.red=r[index*2]; pcolor.green=g[index*3];
pcolor.blue=b[index*4]; }
if(color[Draw_x][Draw_y]==num)
color[Draw_x][Draw_y]=0;
XSetForeground(display,gc,color[Draw_x][Draw_y]*234);
XDrawPoint(display,paint_win,gc,Draw_x,Draw_y);
}
t2=MPI_Wtime();
printf("%f\n",t2-t1);
break;
case ButtonPress:
Bx=report.xbutton.x;
By=report.xbutton.y;
break;
case ButtonRelease:
Tx=report.xbutton.x;
Ty=report.xbutton.y;
inp1=Bx*inp3/400+inp1;
inp2=(400-Ty)*inp4/400+inp2;
inp3=(Tx-Bx)*inp3/400;
inp4=(Ty-By)*inp4/400;
par[0]=inp1;
par[1]=inp2;
par[2]=inp3;
par[3]=inp4;
XDrawRectangle(display,paint_win,gc,Bx,By,Tx-Bx,Ty-By);
for(number=0;number<nslave;number++)
{ MPI_Send(par,4,MPI_FLOAT,number+1,number,MPI_COMM_WORLD);
MPI_Send(&number,1,MPI_INT,number+1,number,MPI_COMM_WORLD);//?íDDo?
}
for(i=0;i<400;i++)
{ MPI_Recv(buf,400,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); cow=status.MPI_TAG;
for(j=0;j<400;j++)
{ color[cow][j]=buf[j]; } if(number<400)
{ MPI_Send(&number,1,MPI_INT,status.MPI_SOURCE,number,MPI_COMM_WORLD);//?í
number++; }
else
{ MPI_Send(&number,1,MPI_INT,status.MPI_SOURCE,number,MPI_COMM_WORLD);//?íDDo?
} }
map=DefaultColormap(display,DefaultScreen(display));
pcolor.flags=DoRed|DoGreen|DoBlue;
gc=XCreateGC(display,paint_win,0,&values);
for(Draw_x=0;Draw_x<400;Draw_x++)
for(Draw_y=0;Draw_y<400;Draw_y++)
{ if(color[Draw_x][Draw_y]==num)
{ pcolor.red=0;
pcolor.green=0;
pcolor.blue=0;
}
else {
index=color[Draw_x][Draw_y]%256;
pcolor.red=r[index*2];
pcolor.green=g[index*3];
pcolor.blue=b[index*4];
}
if(color[Draw_x][Draw_y]==num)
color[Draw_x][Draw_y]=0;
XSetForeground(display,gc,color[Draw_x][Draw_y]*234);
XDrawPoint(display,paint_win,gc,Draw_x,Draw_y); } break;
defualt:
break;
} } }
else {
while(xinhao==1)
{ p=1;
MPI_Recv(par,4,MPI_FLOAT,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
inp1=par[0];
inp2=par[1];
inp3=par[2];
inp4=par[3];
while(p==1)
{for(i=0;i<400;i++) buf[i]=0;
MPI_Recv(&number,1,MPI_INT,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
if(number<400)
{Drawc_x=inp3*number/400+inp1;
for(Draw_y=0;Draw_y<400;Draw_y++)
{ count=0;
Drawc_y=inp4*(400-Draw_y)/400+inp2;
DrawPoint_x=0.0;
DrawPoint_y=0.0;
squre_r=DrawPoint_x*DrawPoint_x+DrawPoint_y*DrawPoint_y;
while(count<num && squre_r<4.0)
{ temp=DrawPoint_x;
DrawPoint_x=DrawPoint_x*DrawPoint_x-DrawPoint_y*DrawPoint_y+Drawc_x;
DrawPoint_y=2*temp*DrawPoint_y+Drawc_y;
squre_r=DrawPoint_x*DrawPoint_x+DrawPoint_y*DrawPoint_y;
count++;
}
buf[Draw_y]=count; }
MPI_Send(buf,400,MPI_INT,0,number,MPI_COMM_WORLD); }
else
{ p=0;
} } }
} MPI_Finalize(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -