⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parallelmandelbort.c

📁 并行程序设计
💻 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 + -