CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Functions
Dcxmatinv.cc File Reference
#include <cmath>
#include <iostream>
#include "RecoTracker/RoadSearchHelixMaker/interface/Dcxmatinv.hh"
#include "FWCore/MessageLogger/interface/MessageLogger.h"

Go to the source code of this file.

Functions

int Dcxmatinv (double *array, int *norder, double *det)
 

Function Documentation

int Dcxmatinv ( double *  array,
int *  norder,
double *  det 
)

Definition at line 13 of file Dcxmatinv.cc.

References i, j, gen::k, and prof2calltree::l.

13  {
14  /* System generated locals */
15  int i__3;
16  double d__1;
17 
18  /* Local variables */
19  const int nmax = 10;
20 // edm::LogInfo("RoadSearch") << "norder in Dcxmatinv = " << *norder ;
21  if (*norder > nmax){
22  edm::LogInfo("RoadSearch") << "In Dcxmatinv, norder ( = " << *norder << " ) > nmax ( = "
23  << nmax << " ); error" ; return 1000;
24  }
25  static double amax, save;
26  static int i, j, k, l, ik[nmax], jk[nmax];
27 
28  /* Parameter adjustments */
29  array -= (nmax+1);
30 
31  /* Function Body */
32  *det = (double)1.;
33  for (k = 1; k <= *norder; ++k) {
34 
35  /* FIND LARGEST ELEMENT ARRAY(I, J) IN REST OF MATRIX */
36 
37  amax = (double)0.;
38  L21:
39  for (i = k; i <= *norder; ++i) {
40  for (j = k; j <= *norder; ++j) {
41  d__1 = array[i + j * nmax];
42  if ((fabs(amax)-fabs(d__1)) <= 0.) {
43  amax = array[i + j * nmax];
44  ik[k - 1] = i;
45  jk[k - 1] = j;
46  }
47  }
48  }
49 
50  /* INTERCHANGE ROWS AND COLUMNS TO PUT AMAX IN ARRAY(K, K) */
51 
52  if (amax == 0.) {*det = (double)0.; return 1001;}
53 
54  i = ik[k - 1];
55  if ((i__3 = i - k) < 0) {
56  goto L21;
57  } else if (i__3 == 0) {
58  goto L51;
59  } else {
60  goto L43;
61  }
62  L43:
63  for (j = 1; j <= *norder; ++j) {
64  save = array[k + j * nmax];
65  array[k + j * nmax] = array[i + j * nmax];
66  array[i + j * nmax] = -save;
67  }
68  L51:
69  j = jk[k - 1];
70  if ((i__3 = j - k) < 0) {
71  goto L21;
72  } else if (i__3 == 0) {
73  goto L61;
74  } else {
75  goto L53;
76  }
77  L53:
78  for (i = 1; i <= *norder; ++i) {
79  save = array[i + k * nmax];
80  array[i + k * nmax] = array[i + j * nmax];
81  array[i + j * nmax] = -save;
82  }
83 
84  /* ACCUMULATE ELEMENTS OF INVERSE MATRIX */
85 
86  L61:
87  for (i = 1; i <= *norder; ++i) {
88  if (i - k != 0) {
89  array[i + k * nmax] = -array[i + k * nmax] / amax;
90  }
91  }
92  for (i = 1; i <= *norder; ++i) {
93  for (j = 1; j <= *norder; ++j) {
94  if (i - k != 0) {
95  goto L74;
96  } else {
97  goto L80;
98  }
99  L74:
100  if (j - k != 0) {
101  goto L75;
102  } else {
103  goto L80;
104  }
105  L75:
106  array[i+j*nmax] += array[i+k*nmax] * array[k+j*nmax];
107  L80:
108  ;
109  }
110  }
111  for (j = 1; j <= *norder; ++j) {
112  if (j - k != 0) {
113  array[k + j * nmax] /= amax;
114  }
115  }
116  array[k + k * nmax] = (double)1. / amax;
117  *det *= amax;
118  }
119 
120  /* RESTORE ORDERING OF MATRIX */
121 
122  for (l = 1; l <= *norder; ++l) {
123  k = *norder - l + 1;
124  j = ik[k - 1];
125  if (j - k <= 0) {
126  goto L111;
127  } else {
128  goto L105;
129  }
130  L105:
131  for (i = 1; i <= *norder; ++i) {
132  save = array[i + k * nmax];
133  array[i + k * nmax] = -array[i + j * nmax];
134  array[i + j * nmax] = save;
135  }
136  L111:
137  i = jk[k - 1];
138  if (i - k <= 0) {
139  goto L130;
140  } else {
141  goto L113;
142  }
143  L113:
144  for (j = 1; j <= *norder; ++j) {
145  save = array[k + j * nmax];
146  array[k + j * nmax] = -array[i + j * nmax];
147  array[i + j * nmax] = save;
148  }
149  L130:
150  ;
151  }
152  return 0;
153 } /* Dcxmatinv */
int i
Definition: DBlmapReader.cc:9
int j
Definition: DBlmapReader.cc:9
int k[5][pyjets_maxn]