00001 #include "sadie.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 void
00013 MATRIX_INVERT (double *mat,
00014 short size,
00015 double *inv
00016
00017 )
00018 {
00019 register short i, j, k;
00020 double temp;
00021
00022 if (TIMES)
00023 TIMING (T_MATRIX_INVERT);
00024
00025
00026 for (i = 0; i < size; i++)
00027 {
00028 for (j = 0; j < size; j++)
00029 {
00030 inv[i * size + j] = mat[i * size + j];
00031 }
00032 }
00033
00034
00035 for (i = 0; i < size; i++)
00036 {
00037 temp = inv[i * size + i];
00038 inv[i * size + i] = 1.0;
00039 for (j = 0; j < size; j++)
00040 {
00041 if (temp == 0.0)
00042 {
00043 MESSAGE ('E', " Can't invert singular matrix.");
00044 goto the_end;
00045 }
00046 else
00047 {
00048 inv[i * size + j] /= temp;
00049 }
00050 }
00051 for (j = 0; j < size; j++)
00052 {
00053 if (j != i)
00054 {
00055 temp = inv[j * size + i];
00056 inv[j * size + i] = 0.0;
00057 for (k = 0; k < size; k++)
00058 {
00059 inv[j * size + k] -= temp * inv[i * size + k];
00060 }
00061 }
00062 }
00063 }
00064
00065 the_end:
00066 if (TIMES)
00067 TIMING (T_EXIT);
00068 }