Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPI - MKM.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
391.79 Кб
Скачать

3.3 Өлшемді Лаплас теңдеуін 3-өлшемді декомпозиция тәсілімен программалау.

enum {UP,DOWN,LEFT,RIGHT,FRONT,BACK};

int main( intargc, char *argv[])

{

intrank,size;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Status status;

intndims=3, reorder=0;

int dims[3]={0,0,0}, periods[3]={0,0,0},coords[3] ,nbrs[6];

MPI_Dims_create(size, ndims, dims);

MPI_Commcartcomm;

MPI_Cart_create(MPI_COMM_WORLD,ndims,dims,periods,reorder,&cartcomm);

MPI_Comm_rank(cartcomm, &rank);

MPI_Cart_coords(cartcomm, rank, 3, coords);

MPI_Cart_shift(cartcomm,0,1,&nbrs[LEFT], &nbrs[RIGHT]);

MPI_Cart_shift(cartcomm,1,1,&nbrs[DOWN], &nbrs[UP]);

MPI_Cart_shift(cartcomm,2,1,&nbrs[FRONT], &nbrs[BACK]);

inta,b,c,i,j,k,it,nit=100,n=12;

a=n/dims[0]+2;

b=n/dims[1]+2;

c=n/dims[2]+2;

float u1[a][b][c],u0[a][b][c];

float h=1.0/n,x,y,z;

for (i=0; i<a; i++) { for (j=0; j<b; j++) { for (k=0; k<c; k++) { u0[i][j][k]=0; u1[i][j][k]=0; if (nbrs[RIGHT]==-1) {u0[a-2][j][k]=1;} } } }

for (it=0; it<nit; it++)

{

for (i=1; i<a-1; i++) { for (j=1; j<b-1; j++) { for (k=1; k<c-1; k++) {

u1[i][j][k]=(u0[i-1][j][k]+u0[i+1][j][k]+u0[i][j-1][k]+u0[i][j+1][k]+u0[i][j][k-1]+u0[i][j][k+1])/6.0; } } }

MPI_Datatype UD;

MPI_Type_vector(a-2,c-2,b*c,MPI_FLOAT,&UD);

MPI_Type_commit(&UD);

MPI_Send(&u1[1][1][1],1,UD,nbrs[UP],1,MPI_COMM_WORLD);

MPI_Recv(&u1[1][b-1][1],1,UD,nbrs[DOWN],1,MPI_COMM_WORLD, &status);

MPI_Send(&u1[1][b-2][1],1,UD,nbrs[DOWN],2,MPI_COMM_WORLD);

MPI_Recv(&u1[1][0][1],1,UD,nbrs[UP],2,MPI_COMM_WORLD, &status);

MPI_Type_free (&UD);

int count=(b-2)*(a-2),p;

intaob[count],aod[count];

for (j=0; j<count; j++) {aob[j]=1; p=j/(b-2); aod[j]=c*(j+2*p); }

MPI_Datatype FB;

MPI_Type_indexed(count,aob,aod,MPI_FLOAT,&FB);

MPI_Type_commit(&FB);

MPI_Send(&u1[1][1][1],1,FB,nbrs[FRONT],3,MPI_COMM_WORLD);

MPI_Recv(&u1[1][1][c-1],1,FB,nbrs[BACK],3,MPI_COMM_WORLD, &status);

MPI_Send(&u1[1][1][c-2],1,FB,nbrs[BACK],4,MPI_COMM_WORLD);

MPI_Recv(&u1[1][1][0],1,FB,nbrs[FRONT],4,MPI_COMM_WORLD, &status);

MPI_Type_free (&FB);

MPI_Datatype LR;

MPI_Type_vector(b-2,c-2,c,MPI_FLOAT,&LR);

MPI_Type_commit(&LR);

MPI_Send(&u1[1][1][1],1,LR,nbrs[LEFT],5,MPI_COMM_WORLD);

MPI_Recv(&u1[a-1][1][1],1,LR,nbrs[RIGHT],5,MPI_COMM_WORLD, &status);

MPI_Send(&u1[a-2][1][1],1,LR,nbrs[RIGHT],6,MPI_COMM_WORLD);

MPI_Recv(&u1[0][1][1],1,LR,nbrs[LEFT],6,MPI_COMM_WORLD, &status);

MPI_Type_free (&LR);

for (i=0; i<a; i++) { for (j=0; j<b; j++) { for (k=0; k<c; k++) {

u0[i][j][k]=u1[i][j][k]; } } }

if (nbrs[FRONT]==-1)

{ for (i=1; i<a-1; i++) { for (j=1; j<b-1; j++) { u0[i][j][0]=0; u0[i][j][1]=0; } } }

if (nbrs[BACK]==-1)

{ for (i=1; i<a-1; i++) { for (j=1; j<b-1; j++) { u0[i][j][c-1]=0; u0[i][j][c-2]=0; } } }

if (nbrs[DOWN]==-1)

{ for (i=1; i<a-1; i++) { for (k=1; k<c-1; k++) { u0[i][b-1][k]=0; u0[i][b-2][k]=0; } } }

if (nbrs[UP]==-1)

{ for (i=1; i<a-1; i++) { for (k=1; k<c-1; k++) { u0[i][0][k]=0; u0[i][1][k]=0; } } }

if (nbrs[LEFT]==-1)

{ for (j=1; j<b-1; j++) { for (k=1; k<c-1; k++) { u0[0][j][k]=0; u0[1][j][k]=0; } } }

if (nbrs[RIGHT]==-1)

{ for (j=1; j<b-1; j++) { for (k=1; k<c-1; k++) { u0[a-1][j][k]=0; u0[a-2][j][k]=1; } } }

}

if (rank==0)

{ for (i=1; i<a-1; i++) { for (j=1; j<b-1; j++) { for (k=1; k<c-1; k++) {

x=float(coords[0])/float(dims[0])+(i-1)*h;

y=float(coords[1])/float(dims[1])+(b-2-j)*h;

z=float(coords[2])/float(dims[2])+(k-1)*h;

printf("u[%i][%i][%i] = %f\tx = %f\ty = %f\tz = %f\n",i,j,k,u0[i][j][k],x,y,z); } } } }

FILE *file;

int count=(a-2)*(b-2)*(c-2);

char s[count];

sprintf(s, "a%i.dat\0", rank);

file = fopen(s, "w+");

fprintf(file, "ZONE I=%i,J=%i,K=%i,F=POINT\n",a-2,b-2,c-2);

for(i=1;i<a-1;i++) { for(j=b-2;j>0;j--) { for (k=1; k<c-1; k++) {

x=float(coords[0])/float(dims[0])+(i-1)*h;

y=float(coords[1])/float(dims[1])+(b-2-j)*h;

z=float(coords[2])/float(dims[2])+(k-1)*h;

fprintf(file,"%f\t%f\t%f\t%f\n",x,y,z,u0[i][j][k]); } } }

fclose(file);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]