FEDRA emulsion software from the OPERA Collaboration
VtSqMatrix.C File Reference
#include "Riostream.h"
#include <string.h>
#include "vt++/VtSqMatrix.hh"
#include "vt++/VtVector.hh"
Include dependency graph for VtSqMatrix.C:

Namespaces

namespace  MATRIX
 

Functions

void Dfact1 (int *n, double *a, int *idim, double *ir, int *ifail, double *det, int *jfail)
 
void Dfactir1 (int *n, double *a, int *idim, int *ir, int *ifail, double *det, int *jfail)
 
void Dfinv1 (int *n, double *a, int *idim, int *ir, int *ifail)
 
void Dinv1 (int *n, double *a, int *idim, double *ir, int *ifail)
 

Function Documentation

◆ Dfact1()

void Dfact1 ( int *  n,
double *  a,
int *  idim,
double *  ir,
int *  ifail,
double *  det,
int *  jfail 
)
225{
226 /* Local variables */
227 static int nxch, i, j, k, l;
228 static double p, q, tf;
229
230 *ifail = 0;
231 *jfail = 0;
232
233 if (*idim < *n || *n <= 0) {
234 *ifail =-1;
235 return;
236 }
237
238 /* Parameter adjustments */
239 a -= *idim + 1;
240
241 /* Function Body */
242
243 // fact.inc
244
245 nxch = 0;
246 *det = 1.;
247 for (j = 1; j <= *n; ++j) {
248 const int ji = j * (*idim);
249 const int jj = j + ji;
250
251 k = j;
252 p = fabs(a[jj]);
253
254 if (j != *n) {
255 for (i = j + 1; i <= *n; ++i) {
256 q = fabs(a[i + ji]);
257 if (q > p) {
258 k = i;
259 p = q;
260 }
261 } // for i
262 if (k != j) {
263 for (l = 1; l <= *n; ++l) {
264 const int li = l*(*idim);
265 const int jli = j + li;
266 const int kli = k + li;
267 tf = a[jli];
268 a[jli] = a[kli];
269 a[kli] = tf;
270 } // for l
271 ++nxch;
272 } // if k != j
273 } // if j!=n
274
275 if (p <= 0.) {
276 *det = 0;
277 *ifail = -1;
278 return;
279 }
280
281 *det *= a[jj];
282
283// t = fabs(*det);
284// if (t < 1e-19 || t > 1e19) {
285// *det = 0;
286// *ifail = -1;
287// return;
288// }
289
290 a[jj] = 1. / a[jj];
291 if (j == *n) {
292 continue;
293 }
294
295 const int jm1 = j - 1;
296 const int jpi = (j + 1) * (*idim);
297 const int jjpi = j + jpi;
298
299 for (k = j + 1; k <= *n; ++k) {
300 const int ki = k * (*idim);
301 const int jki = j + ki;
302 const int kji = k + jpi;
303 if (j != 1) {
304 for (i = 1; i <= jm1; ++i) {
305 const int ii = i * (*idim);
306 a[jki] -= a[i + ki] * a[j + ii];
307 a[kji] -= a[i + jpi] * a[k + ii];
308 } // for i
309 }
310 a[jki] *= a[jj];
311 a[kji] -= a[jjpi] * a[k + ji];
312 } // for k
313 } // for j
314
315 if (nxch % 2 != 0) {
316 *det = -(*det);
317 }
318 return;
319} // end of Dfact1
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
void a()
Definition: check_aligned.C:59
q
Definition: testBGReduction_AllMethods.C:55
p
Definition: testBGReduction_AllMethods.C:8

◆ Dfactir1()

void Dfactir1 ( int *  n,
double *  a,
int *  idim,
int *  ir,
int *  ifail,
double *  det,
int *  jfail 
)
32{
33 /* Local variables */
34 static int nxch, i, j, k, l;
35 static double p, q, tf;
36
37 *ifail = 0;
38 *jfail = 0;
39
40 if (*idim < *n || *n <= 0) {
41 *ifail = -1;
42 return;
43 }
44
45
46 /* Parameter adjustments */
47 a -= *idim + 1;
48 --ir;
49
50 /* Function Body */
51
52 // fact.inc
53 nxch = 0;
54 *det = 1.;
55 for (j = 1; j <= *n; ++j) {
56 const int ji = j * (*idim);
57 const int jj = j + ji;
58
59 k = j;
60 p = fabs(a[jj]);
61
62 if (j != *n) {
63 for (i = j + 1; i <= *n; ++i) {
64 q = fabs(a[i + ji]);
65 if (q > p) {
66 k = i;
67 p = q;
68 }
69 } // for i
70
71 if (k != j) {
72 for (l = 1; l <= *n; ++l) {
73 const int li = l*(*idim);
74 const int jli = j + li;
75 const int kli = k + li;
76 tf = a[jli];
77 a[jli] = a[kli];
78 a[kli] = tf;
79 } // for l
80 ++nxch;
81 ir[nxch] = (j << 12) + k;
82 } // if k != j
83 } // if j!=n
84
85 if (p <= 0.) {
86 *det = 0;
87 *ifail = -1;
88 return;
89 }
90
91 *det *= a[jj];
92// t = fabs(*det);
93// if (t < 1e-19 || t > 1e19) {
94// *det = 0;
95// *ifail = -1;
96// return;
97// }
98
99 a[jj] = 1. / a[jj];
100 if (j == *n) {
101 continue;
102 }
103
104 const int jm1 = j - 1;
105 const int jpi = (j + 1) * (*idim);
106 const int jjpi = j + jpi;
107
108 for (k = j + 1; k <= *n; ++k) {
109 const int ki = k * (*idim);
110 const int jki = j + ki;
111 const int kji = k + jpi;
112 if (j != 1) {
113 for (i = 1; i <= jm1; ++i) {
114 const int ii = i * (*idim);
115 a[jki] -= a[i + ki] * a[j + ii];
116 a[kji] -= a[i + jpi] * a[k + ii];
117 } // for i
118 }
119 a[jki] *= a[jj];
120 a[kji] -= a[jjpi] * a[k + ji];
121 } // for k
122 } // for j
123
124 if (nxch % 2 != 0) {
125 *det = -(*det);
126 }
127 ir[*n] = nxch;
128 return;
129} // end of Dfactir1

◆ Dfinv1()

void Dfinv1 ( int *  n,
double *  a,
int *  idim,
int *  ir,
int *  ifail 
)
132{
133 /* Local variables */
134 static int nxch, i, j, k, m, ij;
135 static int im2, nm1, nmi;
136 static double s31, s34, ti;
137
138 *ifail = 0;
139
140 if (*idim < *n || *n <= 0 || *n==1) {
141 *ifail = -1;
142 return;
143 }
144
145
146 /* Parameter adjustments */
147 a -= *idim + 1;
148 --ir;
149
150 /* Function Body */
151
152 /* finv.inc */
153
154 a[*idim + 2] = -a[(*idim << 1) + 2] * (a[*idim + 1] * a[*idim + 2]);
155 a[(*idim << 1) + 1] = -a[(*idim << 1) + 1];
156
157 if (*n != 2) {
158 for (i = 3; i <= *n; ++i) {
159 const int ii = i * (*idim);
160 const int iii = i + ii;
161 const int imi = ii - *idim;
162 const int iimi = i + imi;
163 im2 = i - 2;
164 for (j = 1; j <= im2; ++j) {
165 const int ji = j * (*idim);
166 const int jii = j + ii;
167 s31 = 0.;
168 for (k = j; k <= im2; ++k) {
169 s31 += a[k + ji] * a[i + k * (*idim)];
170 a[jii] += a[j + (k + 1) * (*idim)] * a[k + 1 + ii];
171 } // for k
172 a[i + ji] = -a[iii] * (a[i - 1 + ji] * a[iimi] + s31);
173 a[jii] *= -1;
174 } // for j
175 a[iimi] = -a[iii] * (a[i - 1 + imi] * a[iimi]);
176 a[i - 1 + ii] *= -1;
177 } // for i
178 } // if n!=2
179
180 nm1 = *n - 1;
181 for (i = 1; i <= nm1; ++i) {
182 const int ii = i * (*idim);
183 nmi = *n - i;
184 for (j = 1; j <= i; ++j) {
185 const int ji = j * (*idim);
186 const int iji = i + ji;
187 for (k = 1; k <= nmi; ++k) {
188 a[iji] += a[i + k + ji] * a[i + (i + k) * (*idim)];
189 } // for k
190 } // for j
191
192 for (j = 1; j <= nmi; ++j) {
193 const int ji = j * (*idim);
194 s34 = 0.;
195 for (k = j; k <= nmi; ++k) {
196 s34 += a[i + k + ii + ji] * a[i + (i + k) * (*idim)];
197 } // for k
198 a[i + ii + ji] = s34;
199 } // for j
200 } // for i
201
202 nxch = ir[*n];
203 if (nxch == 0) {
204 return;
205 }
206
207 for (m = 1; m <= nxch; ++m) {
208 k = nxch - m + 1;
209 ij = ir[k];
210 i = ij / 4096;
211 j = ij % 4096;
212 const int ii = i * (*idim);
213 const int ji = j * (*idim);
214 for (k = 1; k <= *n; ++k) {
215 ti = a[k + ii];
216 a[k + ii] = a[k + ji];
217 a[k + ji] = ti;
218 } // for k
219 } // for m
220
221 return;
222} // Dfinv1
EdbTrackP * ti[10]
Definition: RecDispMC_Profiles.C:54

◆ Dinv1()

void Dinv1 ( int *  n,
double *  a,
int *  idim,
double *  ir,
int *  ifail 
)
322{
323 static double det = 0;
324
325 *ifail = 0;
326
327 if (*n < 1 || *n > *idim) {
328 *ifail = -1;
329 return;
330 }
331
332 if ( *n == 1)
333 {
334 if (a[0] == 0.) {
335 *ifail = -1;
336 return;
337 }
338 a[0] = 1. / a[0];
339 return;
340 }
341
342 if ( *n == 2)
343 {
344 det = a[0] * a[3] - a[2] * a[1];
345
346 if (det == 0.) { *ifail = -1; return; }
347
348 double s = 1. / det;
349 double c11 = s * a[3];
350
351 a[2] = -s * a[2];
352 a[1] = -s * a[1];
353 a[3] = s * a[0];
354 a[0] = c11;
355 return;
356 }
357
358
359
360 if ( *n == 3 )
361 {
362 static double t1, t2, t3, temp, s;
363 static double c11, c12, c13, c21, c22, c23, c31, c32, c33;
364
365 /* COMPUTE COFACTORS. */
366 c11 = a[4] * a[8] - a[7] * a[5];
367 c12 = a[7] * a[2] - a[1] * a[8];
368 c13 = a[1] * a[5] - a[4] * a[2];
369 c21 = a[5] * a[6] - a[8] * a[3];
370 c22 = a[8] * a[0] - a[2] * a[6];
371 c23 = a[2] * a[3] - a[5] * a[0];
372 c31 = a[3] * a[7] - a[6] * a[4];
373 c32 = a[6] * a[1] - a[0] * a[7];
374 c33 = a[0] * a[4] - a[3] * a[1];
375
376 t1 = fabs(a[0]);
377 t2 = fabs(a[1]);
378 t3 = fabs(a[2]);
379
380 /* (SET TEMP=PIVOT AND DET=PIVOT*DET.) */
381 if(t1 < t2) {
382 if (t3 < t2) {
383 /* (PIVOT IS A21) */
384 temp = a[1];
385 det = c13 * c32 - c12 * c33;
386 } else {
387 /* (PIVOT IS A31) */
388 temp = a[2];
389 det = c23 * c12 - c22 * c13;
390 }
391 } else {
392 if(t3 < t1) {
393 /* (PIVOT IS A11) */
394 temp = a[0];
395 det = c22 * c33 - c23 * c32;
396 } else {
397 /* (PIVOT IS A31) */
398 temp = a[2];
399 det = c23 * c12 - c22 * c13;
400 }
401 }
402
403 if (det == 0.) {
404 *ifail = -1;
405 return;
406 }
407
408 /* SET ELEMENTS OF INVERSE IN A. */
409 s = temp / det;
410 a[0] = s * c11;
411 a[3] = s * c21;
412 a[6] = s * c31;
413 a[1] = s * c12;
414 a[4] = s * c22;
415 a[7] = s * c32;
416 a[2] = s * c13;
417 a[5] = s * c23;
418 a[8] = s * c33;
419 return;
420 }
421
422 /* Initialized data */
423
424 static int work[100], jfail;
425 for(int i=0; i<*n; ++i) work[i] = 0;
426
427 /* Function Body */
428
429 /* N.GT.3 CASES. FACTORIZE MATRIX AND INVERT. */
430 Dfactir1(n, a, idim, work, ifail, &det, &jfail);
431 if (*ifail != 0)
432 {
433 cerr << "Dfactir failed!!" << endl;
434 return;
435 }
436 Dfinv1(n, a, idim, work, ifail);
437 return;
438} // Dinv1
void Dfinv1(int *n, double *a, int *idim, int *ir, int *ifail)
Definition: VtSqMatrix.C:131
void Dfactir1(int *n, double *a, int *idim, int *ir, int *ifail, double *det, int *jfail)
Definition: VtSqMatrix.C:31
s
Definition: check_shower.C:55