#include "nr.h" #include "nrutil.h" #include #include #include #include #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; }