Go to the documentation of this file.00001
00002
00003 #include <cmath>
00004 #include <iostream>
00005
00006 #include "RecoTracker/RoadSearchHelixMaker/interface/Dcxmatinv.hh"
00007
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010 using std::cout;
00011 using std::endl;
00012
00013 extern int Dcxmatinv(double *array, int *norder, double *det){
00014
00015 int i__3;
00016 double d__1;
00017
00018
00019 const int nmax = 10;
00020
00021 if (*norder > nmax){
00022 edm::LogInfo("RoadSearch") << "In Dcxmatinv, norder ( = " << *norder << " ) > nmax ( = "
00023 << nmax << " ); error" ; return 1000;
00024 }
00025 static double amax, save;
00026 static int i, j, k, l, ik[nmax], jk[nmax];
00027
00028
00029 array -= (nmax+1);
00030
00031
00032 *det = (double)1.;
00033 for (k = 1; k <= *norder; ++k) {
00034
00035
00036
00037 amax = (double)0.;
00038 L21:
00039 for (i = k; i <= *norder; ++i) {
00040 for (j = k; j <= *norder; ++j) {
00041 d__1 = array[i + j * nmax];
00042 if ((fabs(amax)-fabs(d__1)) <= 0.) {
00043 amax = array[i + j * nmax];
00044 ik[k - 1] = i;
00045 jk[k - 1] = j;
00046 }
00047 }
00048 }
00049
00050
00051
00052 if (amax == 0.) {*det = (double)0.; return 1001;}
00053
00054 i = ik[k - 1];
00055 if ((i__3 = i - k) < 0) {
00056 goto L21;
00057 } else if (i__3 == 0) {
00058 goto L51;
00059 } else {
00060 goto L43;
00061 }
00062 L43:
00063 for (j = 1; j <= *norder; ++j) {
00064 save = array[k + j * nmax];
00065 array[k + j * nmax] = array[i + j * nmax];
00066 array[i + j * nmax] = -save;
00067 }
00068 L51:
00069 j = jk[k - 1];
00070 if ((i__3 = j - k) < 0) {
00071 goto L21;
00072 } else if (i__3 == 0) {
00073 goto L61;
00074 } else {
00075 goto L53;
00076 }
00077 L53:
00078 for (i = 1; i <= *norder; ++i) {
00079 save = array[i + k * nmax];
00080 array[i + k * nmax] = array[i + j * nmax];
00081 array[i + j * nmax] = -save;
00082 }
00083
00084
00085
00086 L61:
00087 for (i = 1; i <= *norder; ++i) {
00088 if (i - k != 0) {
00089 array[i + k * nmax] = -array[i + k * nmax] / amax;
00090 }
00091 }
00092 for (i = 1; i <= *norder; ++i) {
00093 for (j = 1; j <= *norder; ++j) {
00094 if (i - k != 0) {
00095 goto L74;
00096 } else {
00097 goto L80;
00098 }
00099 L74:
00100 if (j - k != 0) {
00101 goto L75;
00102 } else {
00103 goto L80;
00104 }
00105 L75:
00106 array[i+j*nmax] += array[i+k*nmax] * array[k+j*nmax];
00107 L80:
00108 ;
00109 }
00110 }
00111 for (j = 1; j <= *norder; ++j) {
00112 if (j - k != 0) {
00113 array[k + j * nmax] /= amax;
00114 }
00115 }
00116 array[k + k * nmax] = (double)1. / amax;
00117 *det *= amax;
00118 }
00119
00120
00121
00122 for (l = 1; l <= *norder; ++l) {
00123 k = *norder - l + 1;
00124 j = ik[k - 1];
00125 if (j - k <= 0) {
00126 goto L111;
00127 } else {
00128 goto L105;
00129 }
00130 L105:
00131 for (i = 1; i <= *norder; ++i) {
00132 save = array[i + k * nmax];
00133 array[i + k * nmax] = -array[i + j * nmax];
00134 array[i + j * nmax] = save;
00135 }
00136 L111:
00137 i = jk[k - 1];
00138 if (i - k <= 0) {
00139 goto L130;
00140 } else {
00141 goto L113;
00142 }
00143 L113:
00144 for (j = 1; j <= *norder; ++j) {
00145 save = array[k + j * nmax];
00146 array[k + j * nmax] = -array[i + j * nmax];
00147 array[i + j * nmax] = save;
00148 }
00149 L130:
00150 ;
00151 }
00152 return 0;
00153 }