91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 5KB
    文件類型: .c
    金幣: 1
    下載: 0 次
    發布日期: 2021-05-27
  • 語言: 其他
  • 標簽: MPI??LU分解??

資源簡介

對于一個n階的非奇異矩陣A,其LU分解是求一個主對角元素全為1的下三角矩陣L與上三角矩陣U,使A=LU。

資源截圖

代碼片段和文件信息

#include?“stdio.h“
#include?“stdlib.h“
#include?“mpi.h“
#define?a(xy)?a[x*M+y]
/*A為M*M矩陣*/
#define?A(xy)?A[x*M+y]
#define?l(xy)?l[x*M+y]
#define?u(xy)?u[x*M+y]
#define?floatsize?sizeof(float)
#define?intsize?sizeof(int)

int?MN;
int?m;
float?*A;
int?my_rank;
int?p;
MPI_Status?status;

void?fatal(char?*message)
{
????printf(“%s\n“message);
????exit(1);
}

void?Environment_Finalize(float?*afloat?*f)
{
????free(a);
????free(f);
}

int?main(int?argc?char?**argv)
{
????int?ijkmy_rankgroup_size;
????int?i1i2;
????int?vw;
????float?*a*f*l*u;
????FILE?*fdA;

????MPI_Init(&argc&argv);
????MPI_Comm_size(MPI_COMM_WORLD&group_size);
????MPI_Comm_rank(MPI_COMM_WORLD&my_rank);

????p=group_size;

????if?(my_rank==0)
????{
????????fdA=fopen(“dataIn.txt““r“);
????????fscanf(fdA“%d?%d“?&M?&N);
????????if(M?!=?N)
????????{
????????????puts(“The?input?is?error!“);
????????????exit(0);
????????}
????????A=(float?*)malloc(floatsize*M*M);
????????for(i?=?0;?i?????????????for(j?=?0;?j?????????????????fscanf(fdA?“%f“?A+i*M+j);
????????fclose(fdA);
printf(“Input?of?file?\“dataIn.txt\“\n“);
????????printf(“%d\t?%d\n“M?N);
????????for(i=0;i????????{
????????????for(j=0;j????????????????printf(“%f\t“A(ij));
????????????printf(“\n“);
????????}
????}

????/*0號進程將M廣播給所有進程*/
????MPI_Bcast(&M1MPI_INT0MPI_COMM_WORLD);
????m=M/p;
????if?(M%p!=0)?m++;

????/*分配至各進程的子矩陣大小為m*M*/
????a=(float*)malloc(floatsize*m*M);

????/*各進程為主行元素建立發送和接收緩沖區*/
????f=(float*)malloc(floatsize*M);

????/*0號進程為l和u矩陣分配內存,以分離出經過變換后的A矩陣中的l和u矩陣*/
????if?(my_rank==0)
????{
????????l=(float*)malloc(floatsize*M*M);
????????u=(float*)malloc(floatsize*M*M);
????}

????/*0號進程采用行連續劃分將矩陣A劃分為大小m*M的p塊子矩陣,依次發送給1至p-1號進程*/
????if?(a==NULL)?fatal(“allocate?error\n“);

????if?(my_rank==0)
????{
????????for(i=0;i????????????for(j=0;j????????????????a(ij)=A(ij);
????????for(i=m;i????????{
????????????i1=i/m;
????????????i2=i%m+1;
????????????MPI_Send(&A(i0)MMPI_FLOATi1i2MPI_COMM_WORLD);
????????}
????}
????else
????{
????????for(i=0;i????????????MPI_Recv(&a(i0)MMPI_FLOAT0i+1MPI_COMM_WORLD&status);
????}

????for(i=0

評論

共有 條評論