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

📄 qr_value.c

📁 《并行算法实践》附带的mpi源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                        for(i=0;i<m;i++)                        {                            sp=sqrt(f[j]*f[j]+a(i,j)*a(i,j));                            c=f[j]/sp;  s=a(i,j)/sp;                            for(k=0;k<M;k++)                            {                                aj[k]=c*f[k]+s*a(i,k);                                qj[k]=c*v[k]+s*q(i,k);                                ai[k]=-s*f[k]+c*a(i,k);                                qi[k]=-s*v[k]+c*q(i,k);                            }                            for(k=0;k<M;k++)                            {                                f[k]=aj[k];                                v[k]=qj[k];                                a(i,k)=ai[k];                                q(i,k)=qi[k];                            }                        }                         /* for i */                        for(k=0;k<M;k++)                        {                            Q(j,k)=v[k];                            R(j,k)=f[k];                        }                    }                             /* for j */                    for(j=0;j<m-1;j++)                    {                        for(i=j+1;i<m;i++)                        {                            sp=sqrt(a(j,my_rank*m+j)*a(j,my_rank*m+j)+a(i,my_rank*m+j)*a(i,my_rank*m+j));                            c=a(j,my_rank*m+j)/sp;                            s=a(i,my_rank*m+j)/sp;                            for(k=0;k<M;k++)                            {                                aj[k]=c*a(j,k)+s*a(i,k);                                qj[k]=c*q(j,k)+s*q(i,k);                                ai[k]=-s*a(j,k)+c*a(i,k);                                qi[k]=-s*q(j,k)+c*q(i,k);                            }                            for(k=0;k<M;k++)                            {                                a(j,k)=aj[k];                                q(j,k)=qj[k];                                a(i,k)=ai[k];                                q(i,k)=qi[k];                            }                        }                         /*  for i */                        for(k=0;k<M;k++)                        {                            Q((my_rank*m+j),k)=q(j,k);                            R((my_rank*m+j),k)=a(j,k);                        }                    }                             /* for j */                    for(k=0;k<M;k++)                    {                        Q((my_rank*m+m-1),k)=q((m-1),k);                        R((my_rank*m+m-1),k)=a((m-1),k);                    }                }                                 /* for my_rank==groupsize -1 */            }                                     /*    else my_rank!=0           */        }                                         /*    if p >1          */        if (p==1)        {            for (j=0;j<M;j++)                for (i=j+1;i<M;i++)            {                sp=sqrt(a(j,j)*a(j,j) + a(i,j)*a(i,j));                c=a(j,j)/sp;                s=a(i,j)/sp;                for (k=0;k<M;k++)                {                    aj[k]=c*a(j,k) + s*a(i,k);                    qj[k]=c*q(j,k) + s*q(i,k);                    ai[k]=(-s)*a(j,k) + c*a(i,k);                    qi[k]=(-s)*q(j,k) + c*q(i,k);                }                for (k=0;k<M;k++)                {                    a(j,k)=aj[k];                    q(j,k)=qj[k];                    a(i,k)=ai[k];                    q(i,k)=qi[k];                }            }                                     /* for   */            for(i=0;i<M;i++)                for(j=0;j<M;j++)                    R(i,j)=a(i,j);            for(i=0;i<M;i++)                for(j=0;j<M;j++)                    Q(i,j)=q(i,j);        }                                         /*  if   p==1 */        if (my_rank==p-1)        {            for(i=0;i<M;i++)                for(j=i+1;j<M;j++)            {                temp=Q(i,j);                Q(i,j)=Q(j,i);                Q(j,i)=temp;            }        }        if (my_rank==p-1)        {            for(i=0;i<m;i++)                for(j=0;j<M;j++)                    a(i,j)=R((my_rank*m+i),j);            for (i=0;i<M;i++)                for (j=0;j<m;j++)                    b(i,j)=Q(i,(my_rank*m+j));        }        if (my_rank==p-1)        {            for(i=0;i<p-1;i++)            {                MPI_Send(&R(m*i,0),m*M,MPI_FLOAT,i,i,MPI_COMM_WORLD);                for (j=0;j<M;j++)                    MPI_Send(&Q(j,m*i),m,MPI_FLOAT,i,i,MPI_COMM_WORLD);            }        }        else        {            MPI_Recv(a,m*M,MPI_FLOAT,p-1,my_rank,MPI_COMM_WORLD,&status);            for (j=0;j<M;j++)                MPI_Recv(&b(j,0),m,MPI_FLOAT,p-1,my_rank,MPI_COMM_WORLD,&status);        }        for (i=0;i<p;i++)        {            l=(i+my_rank)%p;            for (k=0;k<m;k++)                for (j=0;j<m;j++)                    for (t(l,k,j)=0,n=0;n<M;n++)                        t(l,k,j)=t(l,k,j)+a(k,n)*b(n,j);            mm1=(p+my_rank-1)%p;            mp1=(my_rank+1)%p;            if (i!=p-1)            {                if(my_rank%2==0)                {                    MPI_Send(b,M*m,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);                    MPI_Recv(b,M*m,MPI_FLOAT,mp1,my_rank,MPI_COMM_WORLD,&status);                }                else                {                    for(k=0;k<M;k++)                        for(j=0;j<m;j++)                            buffer(k,j)=b(k,j);                    MPI_Recv(b,M*m,MPI_FLOAT,mp1,my_rank,MPI_COMM_WORLD,&status);                    MPI_Send(buffer,M*m,MPI_FLOAT,mm1,mm1,MPI_COMM_WORLD);                }            }        }                                         /*  for */        if (my_rank==p-1)            for(i=0;i<m;i++)                for(j=0;j<M;j++)                    A((my_rank*m+i),j)=*(t+i*M+j);        if (my_rank!=p-1)            MPI_Send(t,m*M,MPI_FLOAT,p-1,my_rank,MPI_COMM_WORLD);        else        {            for(k=0;k<p-1;k++)            {                MPI_Recv(t,m*M,MPI_FLOAT,k,k,MPI_COMM_WORLD,&status);                for(i=0;i<m;i++)                    for(j=0;j<M;j++)                        A((k*m+i),j)=*(t+i*M+j);            }        }        count++;        tag=0;        if (my_rank==p-1)        {            for(i=1;i<M;i++)                for(j=0;j<i;j++)                    if (fabs(A(i,j))>E)                        tag=1;        }        MPI_Bcast(&tag,1,MPI_INT,p-1,MPI_COMM_WORLD);        if (my_rank==p-1)        {            for(i=0;i<M;i++)                for(j=0;j<M;j++)                    if (i==j)                        Q(i,j)=1.0;            else                Q(i,j)=0.0;        }        if (my_rank==p-1)        {            for(i=0;i<m;i++)                for(j=0;j<M;j++)            {                a(i,j)=A((my_rank*m+i),j);                q(i,j)=Q((my_rank*m+i),j);            }        }        if (my_rank==p-1)        {            for(i=0;i<p-1;i++)            {                MPI_Send(&A(m*i,0),m*M,MPI_FLOAT,i,i,MPI_COMM_WORLD);                MPI_Send(&Q(m*i,0),m*M,MPI_FLOAT,i,i,MPI_COMM_WORLD);            }        }        else        {            MPI_Recv(a,m*M,MPI_FLOAT,p-1,my_rank,MPI_COMM_WORLD,&status);            MPI_Recv(q,m*M,MPI_FLOAT,p-1,my_rank,MPI_COMM_WORLD,&status);        }    }    while ((tag==1)&&(count<1000));    if(my_rank==p-1)    {        if (count>=1000)        {            printf("\n can not converage to a triangular matrix\n");            printf("this is the matrix:\n");            for(i=0;i<M;i++)            {                for(j=0;j<M;j++)                    printf("%f\t",A(i,j));                printf("\n");            }        }        else        {            printf("\nthe envalue is\n");            for(i=0;i<M;i++) printf("%f\t",A(i,i));            printf("\n");        }    }    time2 = MPI_Wtime();    if (my_rank==0)    {        printf("\n");        printf("Iteration num = %d\n",count);        printf("Whole running time    = %f seconds\n",time2-starttime);        printf("Distribute data time  = %f seconds\n",time1-starttime);        printf("Parallel compute time = %f seconds\n",time2-time1);    }    MPI_Barrier(MPI_COMM_WORLD);    MPI_Finalize();    Environment_Finalize(a,q,v,f,R,Q,ai,aj,qi,qj,b,t,buffer);    return(0);}

⌨️ 快捷键说明

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