FEDRA emulsion software from the OPERA Collaboration
Dfinv.hh
Go to the documentation of this file.
1#ifndef __DFINV_HH
2#define __DFINV_HH
3// ********************************************************************
4//
5// source:
6//
7// type: source code
8//
9// created: 03. Apr 2001
10//
11// author: Thorsten Glebe
12// HERA-B Collaboration
13// Max-Planck-Institut fuer Kernphysik
14// Saupfercheckweg 1
15// 69117 Heidelberg
16// Germany
17// E-mail: T.Glebe@mpi-hd.mpg.de
18//
19// Description: Matrix inversion
20// Code was taken from CERNLIB::kernlib dfinv function, translated
21// from FORTRAN to C++ and optimized.
22//
23// changes:
24// 03 Apr 2001 (TG) creation
25//
26// ********************************************************************
27
35template <class Matrix, unsigned int n, unsigned int idim>
36bool Dfinv(Matrix& rhs, unsigned int* ir) {
37#ifdef XXX
38 if (idim < n || n <= 0 || n==1) {
39 return false;
40 }
41#endif
42
43 typename Matrix::value_type* a = rhs.Array();
44
45 /* Local variables */
46 static unsigned int nxch, i, j, k, m, ij;
47 static unsigned int im2, nm1, nmi;
48 static typename Matrix::value_type s31, s34, ti;
49
50 /* Parameter adjustments */
51 a -= idim + 1;
52 --ir;
53
54 /* Function Body */
55
56 /* finv.inc */
57
58 a[idim + 2] = -a[(idim << 1) + 2] * (a[idim + 1] * a[idim + 2]);
59 a[(idim << 1) + 1] = -a[(idim << 1) + 1];
60
61 if (n != 2) {
62 for (i = 3; i <= n; ++i) {
63 const unsigned int ii = i * idim;
64 const unsigned int iii = i + ii;
65 const unsigned int imi = ii - idim;
66 const unsigned int iimi = i + imi;
67 im2 = i - 2;
68 for (j = 1; j <= im2; ++j) {
69 const unsigned int ji = j * idim;
70 const unsigned int jii = j + ii;
71 s31 = 0.;
72 for (k = j; k <= im2; ++k) {
73 s31 += a[k + ji] * a[i + k * idim];
74 a[jii] += a[j + (k + 1) * idim] * a[k + 1 + ii];
75 } // for k
76 a[i + ji] = -a[iii] * (a[i - 1 + ji] * a[iimi] + s31);
77 a[jii] *= -1;
78 } // for j
79 a[iimi] = -a[iii] * (a[i - 1 + imi] * a[iimi]);
80 a[i - 1 + ii] *= -1;
81 } // for i
82 } // if n!=2
83
84 nm1 = n - 1;
85 for (i = 1; i <= nm1; ++i) {
86 const unsigned int ii = i * idim;
87 nmi = n - i;
88 for (j = 1; j <= i; ++j) {
89 const unsigned int ji = j * idim;
90 const unsigned int iji = i + ji;
91 for (k = 1; k <= nmi; ++k) {
92 a[iji] += a[i + k + ji] * a[i + (i + k) * idim];
93 } // for k
94 } // for j
95
96 for (j = 1; j <= nmi; ++j) {
97 const unsigned int ji = j * idim;
98 s34 = 0.;
99 for (k = j; k <= nmi; ++k) {
100 s34 += a[i + k + ii + ji] * a[i + (i + k) * idim];
101 } // for k
102 a[i + ii + ji] = s34;
103 } // for j
104 } // for i
105
106 nxch = ir[n];
107 if (nxch == 0) {
108 return true;
109 }
110
111 for (m = 1; m <= nxch; ++m) {
112 k = nxch - m + 1;
113 ij = ir[k];
114 i = ij / 4096;
115 j = ij % 4096;
116 const unsigned int ii = i * idim;
117 const unsigned int ji = j * idim;
118 for (k = 1; k <= n; ++k) {
119 ti = a[k + ii];
120 a[k + ii] = a[k + ji];
121 a[k + ji] = ti;
122 } // for k
123 } // for m
124
125 return true;
126} // Dfinv
127
128#endif
bool Dfinv(Matrix &rhs, unsigned int *ir)
Definition: Dfinv.hh:36
EdbTrackP * ti[10]
Definition: RecDispMC_Profiles.C:54
void a()
Definition: check_aligned.C:59