145 lines
3.4 KiB
C
145 lines
3.4 KiB
C
#include "nr.h"
|
|
#include "nrutil.h"
|
|
#include <pthread.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#include "matutil.h"
|
|
|
|
void try_gaussj(JMatrixData* data) {
|
|
printf("gauss-jordan method:\n");
|
|
gaussj(data->a, data->m, data->b, 1);
|
|
print_matrix(data->m, 1, data->b);
|
|
}
|
|
|
|
void try_lu(JMatrixData* data) {
|
|
printf("LU Decomposition:\n");
|
|
|
|
int* indx = calloc(data->m + 1, sizeof(int));
|
|
float* d = calloc(data->m + 1, sizeof(float));
|
|
ludcmp(data->a, data->m, indx, d);
|
|
|
|
print_matrix(data->m, data->n, data->a);
|
|
|
|
printf("index: ");
|
|
print_vector_int(data->m, indx);
|
|
printf("d: ");
|
|
print_vector_float(data->m, d);
|
|
|
|
printf("solution:\n");
|
|
float * b = calloc(data->m + 1, sizeof(float));
|
|
int i;
|
|
for (i = 1; i <= data->m; i++) {
|
|
b[i] = data->b[i][1];
|
|
}
|
|
lubksb(data->a, data->m, indx, b);
|
|
for (i = 1; i <= data->m; i++) {
|
|
printf("%6.2f ", b[i]);
|
|
}
|
|
free(indx);
|
|
free(d);
|
|
|
|
}
|
|
|
|
void processMatrix(JMatrixData* data) {
|
|
printf("-----------------------------\n");
|
|
printf("matrix data A:\n");
|
|
print_matrix(data->m, data->n, data->a);
|
|
printf("matrix data b:\n");
|
|
print_matrix(data->m, 1, data->b);
|
|
printf("-----------------------------\n");
|
|
|
|
pid_t pid = fork();
|
|
if (pid < 0) {
|
|
printf("process 실행 실패\n");
|
|
return;
|
|
} else if (pid == 0) {
|
|
printf("created process for gauss-jordan method\n");
|
|
printf("-----------------------------\n");
|
|
JMatrixData* copied = new_jmatdata(data->m, data->n);
|
|
copy_jmatdata(data, copied);
|
|
try_gaussj(copied);
|
|
free_jmatdata(copied);
|
|
printf("-----------------------------\n");
|
|
exit(0);
|
|
}
|
|
|
|
wait(NULL);
|
|
pid = fork();
|
|
if (pid < 0) {
|
|
printf("process 실행 실패\n");
|
|
return;
|
|
} else if (pid == 0) {
|
|
printf("created process for LU Decomposition\n");
|
|
printf("-----------------------------\n");
|
|
JMatrixData* copied = new_jmatdata(data->m, data->n);
|
|
copy_jmatdata(data, copied);
|
|
try_lu(copied);
|
|
free_jmatdata(copied);
|
|
printf("-----------------------------\n");
|
|
exit(0);
|
|
|
|
}
|
|
wait(NULL);
|
|
}
|
|
|
|
JMatrixData*readDataFrom(char *filename) {
|
|
FILE *fp = fopen(filename, "r");
|
|
|
|
if (fp == NULL) {
|
|
printf("Error opening file");
|
|
exit(1);
|
|
}
|
|
|
|
int m, n;
|
|
fscanf(fp, "%d", &m);
|
|
fscanf(fp, "%d", &n);
|
|
|
|
JMatrixData*data = new_jmatdata(m, n);
|
|
|
|
int i, j;
|
|
for (i = 1; i <= data->m; i++) {
|
|
for (j = 1; j <= data->n; j++) {
|
|
fscanf(fp, "%f", &data->a[i][j]);
|
|
}
|
|
}
|
|
|
|
for (i = 1; i <= data->m; i++) {
|
|
fscanf(fp, "%f", &data->b[i][1]);
|
|
}
|
|
|
|
fclose(fp);
|
|
return data;
|
|
}
|
|
|
|
int main() {
|
|
int m, n;
|
|
int i, j;
|
|
|
|
|
|
const char *filenames[] = {
|
|
"lineq1.dat", "lineq2.dat", "lineq3.dat"};
|
|
pid_t pid;
|
|
for (i = 0; i < 3; i++) {
|
|
pid = fork();
|
|
if (pid < 0) {
|
|
printf("process 실행 실패\n");
|
|
return 2;
|
|
} else if (pid == 0) {
|
|
printf("=================================\n");
|
|
printf("data from %s:\n", filenames[i]);
|
|
JMatrixData* data = readDataFrom(filenames[i]);
|
|
processMatrix(data);
|
|
printf("end for %s\n", filenames[i]);
|
|
exit(0);
|
|
}
|
|
wait(NULL);
|
|
}
|
|
|
|
|
|
|
|
printf("end\n");
|
|
|
|
return 0;
|
|
} |