Этот вариант - последовательная реализация нужной программы, но зато с динамическим выделением памяти.
Код:
#include "stdafx.h"
#include <malloc.h>
#include <conio.h>
//#include <mpi.h>
int main( int argc, char **argv )
{
float **A,**U,**L;
int n,m,i,j,k,sum=0;
FILE *opn;
FILE *wr;
wr = fopen("output.txt", "w");
//открытие файла с матрицей
do
{
opn = fopen("input.txt", "r");
if (!opn)
{
printf("Fail input.txt, soderzhaschij matricu A,dolzhen byt` v papke s programmoj\n");
getch();
}
}
while(!opn);
//размер матрицы
do
{
printf("Vvedite razmer matricy\n");
scanf ("%d %d",&n,&m);
getch();
if (m!=n)
{
printf("Matrica dolzhna byt` kvadratchnaja!\n");
getch();
}
}
while (m!=n);
printf("\n");
// выделение памяти под А,U и L
A = (float**)malloc(n*sizeof(float*));
U = (float**)malloc(n*sizeof(float*));
L = (float**)malloc(n*sizeof(float*));
for(i = 0; i < n; i++)
{
A[i] =(float*) malloc(n*sizeof(float));
U[i] =(float*) malloc(n*sizeof(float));
L[i] =(float*) malloc(n*sizeof(float));
}
///заполнение матрицы А значениями
for(i = 0; i < n; i++)
{for(j = 0; j < n; j++)
{fscanf(opn,"%f",&A[i][j]);
}
}
//вычисление L и U
for (i = 0; i < n; i++)
{
U[0][i] = A[0][i];
L[i][0] = A[i][0] / U[0][0];
for (j = 0; j < n; j++)
{
sum = 0;
for (k = 0; k <i; k++)
{
sum =sum + L[i][k] * U[k][j];
}
U[i][j] = A[i][j] - sum;
if (i > j)
{
L[j][i] = 0;
}
else
{
sum = 0;
for (k = 0; k <i; k++)
{
sum =sum + L[j][k] * U[k][i];
}
L[j][i] = (A[j][i] - sum) / U[i][i];
}
}
}
//вывод А
printf("Matrica A\n\n");
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
printf("%g ",A[i][j]);
}
printf("\n");
}
printf("\n");
//вывод L
printf("Matrica L\n\n");
fprintf(wr,"Matrica L\n\n");
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
printf("%g ",L[i][j]);
fprintf(wr,"%g ", L[i][j]);
}
printf("\n");
fprintf(wr,"\n");
}
printf("\n");
fprintf(wr,"\n");
//вывод U
printf("Matrica U\n\n");
fprintf(wr,"Matrica U\n\n");
for(i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
printf("%g ",U[i][j]);
fprintf(wr,"%g ", U[j]);
}
printf("\n");
fprintf(wr,"\n");
}
getch();
fclose(opn);fclose (wr);
return 0;
}
А этот - с MPI, но как видите, матрицы фиксированного размера
[I]#include "stdafx.h"
#include "mpi.h"
#include <conio.h>
int main(int argc, char **argv )
{
float A[4][4]={0},L[4][4]={0},U[4][4]={0},l=0;
double time;
int k=0,i=0,j=0,sz,myrank;
FILE *opn;
FILE *wr;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
MPI_Comm_size (MPI_COMM_WORLD, &sz);
time = MPI_Wtime ();
wr = fopen("output.txt", "w");
opn = fopen("input.txt", "r");
for(i = 0; i < sz; i++)
{
for(j = 0; j < sz; j++)
{
fscanf(opn,"%f",&A[i][j]);
U[i][j]=A[i][j];
}
}
i=1;
for(k=0;k<sz;k++){
MPI_Scatter(&U, sz, MPI_FLOAT, &U[myrank], sz, MPI_FLOAT, 0, MPI_COMM_WORLD);
l=U[myrank][k]/U[k][k];
for(j=i;j<sz;j++)
{
U[myrank][j]=U[myrank][j] - l*U[k][j];
}
MPI_Gather (&l, 1, MPI_FLOAT, &L[k], 1, MPI_FLOAT, 0, MPI_COMM_WORLD);
MPI_Gather (&U[myrank], sz, MPI_FLOAT, &U, sz, MPI_FLOAT, 0, MPI_COMM_WORLD);
i++;}
if (myrank==0){
time = MPI_Wtime () - time;
printf ("Time = %f\n\n", time);
//вывод А
printf("Matrica A\n\n");
fprintf(wr,"Matrica A\n\n");
for(i = 0; i < sz; i++) {
for(j = 0; j < sz; j++) {
printf("%g ",A[i][j]);
fprintf(wr,"%g ", A[i][j]);
}
printf("\n");
fprintf(wr,"\n");
}
printf("\n");
fprintf(wr,"\n");
//Вывод L
printf("Matrica L\n\n");
fprintf(wr,"Matrica L\n\n");
for(i = 0; i < sz; i++) {
for(j = 0; j < sz; j++) {
printf("%g ",L[j][i]);
fprintf(wr,"%g ", L[j][i]);
}
printf("\n");
fprintf(wr,"\n");
}
printf("\n");
fprintf(wr,"\n");
//вывод U
printf("Matrica U\n\n");
fprintf(wr,"Matrica U\n\n");
for(i = 0; i < sz; i++) {
for(j = 0; j < sz; j++) {
printf("%g ",U[j][i]);
fprintf(wr,"%g ", U[j][i]);
}
printf("\n");
fprintf(wr,"\n");
}
fclose(opn);
fclose (wr); }
MPI_Finalize();
return 0;
}