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

📄 c.c

📁 《并行算法实践》附带的mpi源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <mpi.h>#include <math.h>int my_rank,group_size,sub_group;int n_all;double pointx[30],pointy[30];double tempx[2],tempy[2],xtemp[4],ytemp[4];MPI_Status status;int location[30];/*获得y坐标最小的点,坐标值保存到保存到tempx,tempy数组中*/void getymin( ){    int i,index=0;    double tempvalue=pointy[0];    for(i=1;i<n_all;i++)    {        if(pointy[i]<tempvalue)        {            tempvalue=pointy[i];            index=i;        }        else        {			/*若y坐标相同,则取x坐标小者。这是为了保证(tempx[0],tempy[0])->(tempx[1],tempy[1])为逆时针方向*/            if(pointy[i]==tempvalue)                if(pointx[index]>pointx[i])                    index = i;        }    }    tempx[0]=pointx[index];    tempy[0]=pointy[index];	/*如果y坐标最小的极点只有1点,就复制该点*/    tempx[1]=tempx[0];    tempy[1]=tempy[0];	/*考察极点是否多于1点*/    for(i=0;i<n_all;i++)        if((pointy[i]==tempy[1])&&(pointx[i]>tempx[1]))    {		/*极点多于1点,取x坐标大者,保存最后一个极点的坐标*/        tempx[1]=pointx[i];        tempy[1]=pointy[i];    }    return;}/*获得y坐标最大的点,保存到tempx,tempy数组中*/void getymax(){    int i,index=0;    double temp=pointy[0];    for(i=1;i<n_all;i++)    {        if(pointy[i]>temp)        {            temp=pointy[i];            index=i;        }        else        {			/*若y坐标相同,则取x坐标大者。这是为了保证(tempx[0],tempy[0])->(tempx[1],tempy[1])为逆时针方向*/            if(temp==pointy[i])                if(pointx[i]>pointx[index])                    index=i;        }    }	/*保存YMAX极点坐标*/    tempx[0]=pointx[index];    tempy[0]=pointy[index];	/*如果y坐标最大的极点只有1点,就复制该点*/    tempx[1]=tempx[0];    tempy[1]=tempy[0];	/*考察极点是否多于1点*/    for(i=0;i<n_all;i++)    {        if((pointy[i]==tempy[1])&&(pointx[i]<tempx[1]))        {			/*极点多于1点,取x坐标小者,保存最后一个极点的坐标*/            tempx[1]=pointx[i];            tempy[1]=pointy[i];        }    }    return;}/*获得x坐标最小的点,坐标保存到tempx,tempy数组中*/void getxmin(){    int i,index=0;    double temp=pointx[0];    for(i=1;i<n_all;i++)    {        if(pointx[i]<temp)        {            temp=pointx[i];            index=i;        }        else        {			/*若x坐标相同,则取y坐标大者。这是为了保证(tempx[0],tempy[0])->(tempx[1],tempy[1])为逆时针方向*/            if(pointx[i]==temp)                if(pointy[index]<pointy[i])                    index=i;        }    }	/*保存XMIN极点坐标*/    tempx[0]=pointx[index];    tempy[0]=pointy[index];	/*如果x坐标最小的极点只有1点,就复制该点*/    tempx[1]=tempx[0];    tempy[1]=tempy[0];	/*考察极点是否多于1点*/    for(i=0;i<n_all;i++)    {        if((pointx[i]==tempx[1])&&(pointy[i]<tempy[1]))        {			/*极点多于1点,取y坐标小者,保存最后一个极点的坐标*/            tempx[1]=pointx[i];            tempy[1]=pointy[i];        }    }    return;}/*获得x坐标最大的点,其坐标值保存保存到tempx,tempy数组中*/void getxmax(){    int i,index=0;    double temp=pointx[0];    for(i=1;i<n_all;i++)    {        if(pointx[i]>temp)        {            temp=pointx[i];            index=i;        }        else        {			/*若x坐标相同,则取y坐标小者。这是为了保证(tempx[0],tempy[0])->(tempx[1],tempy[1])为逆时针方向*/            if(temp==pointx[i])                if(pointy[index]>pointy[i])                    index=i;        }    }	/*保存XMAX极点坐标*/    tempx[0]=pointx[index];    tempy[0]=pointy[index];	/*如果x坐标最大的极点只有1点,就复制该点*/    tempx[1]=tempx[0];    tempy[1]=tempy[0];	/*考察极点是否多于1点*/    for(i=0;i<n_all;i++)    {        if((pointx[i]==tempx[1])&&(pointy[i]>tempy[1]))        {			/*极点多于1点,取y坐标大者,保存第2个极点的坐标*/            tempx[1]=pointx[i];            tempy[1]=pointy[i];        }    }    return;}/*temp[x],temp[y]设置两个值的作用是为了有多个最值时,保存首尾两个,后面划分区域时分别以这两个为端点,中间就没有其他的点了*//*确定是属于哪一部分*/void getincludedvertex(int tag){    double linea,lineb,dist;    int i,count=0;	/*若该边已退化成一个点, 则除此点外无其它点在处理区域内*/    if((tempx[1]==tempx[0])&&(tempy[1]==tempy[0]))    {        n_all=1;        pointx[0]=tempx[1];        pointy[0]=tempy[1];    }    else    {		/*根据两端点坐标确定直线的斜率和参数*/        linea=(tempy[1]-tempy[0])/(tempx[1]-tempx[0]);        lineb=tempy[1]-linea*tempx[1];		/*根据点在直线的哪一侧来确定该顶点是否在处理区域内*/        for(i=0;i<n_all;i++)        {            dist=linea*pointx[i]+lineb-pointy[i];            if(tag*dist<0)            {                pointx[count]=pointx[i];                pointy[count++]=pointy[i];            }        }		/*调整各点的位置以加入两个端点*/        for(i=0;i<count;i++)        {            pointx[count-i]=pointx[count-1-i];            pointy[count-i]=pointy[count-1-i];        }		/*将两个端点放在两端*/        pointx[0]=tempx[0];        pointy[0]=tempy[0];        pointx[count+1]=tempx[1];        pointy[count+1]=tempy[1];        count+=2;		/*更新n_all为要处理的新的表列中的点的数量*/        n_all=count;    }}/*确定此点的后一点的序号,并放入location[]中*/void nextindex(int i,int x,int y){    double x1,y1,temp,valuemax=0;    int j;    x1=pointx[i];    y1=pointy[i];	/*遍历各顶, 将有最小极角点的序号作为自己的Nextindex值*/    for(j=0;j<n_all;j++)    {        if(((pointx[j]-x1)*x+(pointy[j]-y1)*y)>0)        {			/*由极角的余弦或其余角的正弦来判断极角大小*/            temp=((pointx[j]-x1)*x+(pointy[j]-y1)*y)/(sqrt((pointx[j]-x1)*(pointx[j]-x1)+(pointy[j]-y1)*(pointy[j]-y1)));            if(temp>valuemax)            {                location[i]=j;                valuemax=temp;            }        }    }    if(valuemax==0)        location[i]=-1;}/*输出点的序列*/void output(int rank){    int j=0,index,temp;    double xtem,ytem;    int flag=0;    printf("输出的是第%d部分的点\n",rank/sub_group);    if(rank==0)        flag=1;    if(flag==0)        if(!((pointx[n_all-1]==tempx[0])&&        (pointy[n_all-1]==tempy[0])))            flag=1;	/*将nextindex反向,使输出的点按逆时针方向,以保证各行主处理器输出顺序相邻*/    index=location[j];    while(location[index]!=-1)    {        temp=location[index];        location[index]=j;        j=index;        index=temp;    }    location[index]=j;    location[0]=-1;	/*按照索引顺序输出各点*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -