source: trunk/source/error_propagation/src/G4ErrorMatrix.cc@ 1168

Last change on this file since 1168 was 1058, checked in by garnier, 17 years ago

file release beta

File size: 67.2 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id: G4ErrorMatrix.cc,v 1.3 2007/06/21 15:04:06 gunter Exp $
27// GEANT4 tag $Name: geant4-09-02-ref-02 $
28//
29// ------------------------------------------------------------
30// GEANT 4 class implementation file
31// ------------------------------------------------------------
32
33#include "globals.hh"
34
35#include <cmath>
36#include <iostream>
37
38#include "G4ErrorMatrix.hh"
39#include "G4ErrorSymMatrix.hh"
40
41// Simple operation for all elements
42
43#define SIMPLE_UOP(OPER) \
44 G4ErrorMatrixIter a=m.begin(); \
45 G4ErrorMatrixIter e=m.end(); \
46 for(;a!=e; a++) (*a) OPER t;
47
48#define SIMPLE_BOP(OPER) \
49 G4ErrorMatrixIter a=m.begin(); \
50 G4ErrorMatrixConstIter b=m2.m.begin(); \
51 G4ErrorMatrixIter e=m.end(); \
52 for(;a!=e; a++, b++) (*a) OPER (*b);
53
54#define SIMPLE_TOP(OPER) \
55 G4ErrorMatrixConstIter a=m1.m.begin(); \
56 G4ErrorMatrixConstIter b=m2.m.begin(); \
57 G4ErrorMatrixIter t=mret.m.begin(); \
58 G4ErrorMatrixConstIter e=m1.m.end(); \
59 for(;a!=e; a++, b++, t++) (*t) = (*a) OPER (*b);
60
61// Static functions.
62
63#define CHK_DIM_2(r1,r2,c1,c2,fun) \
64 if (r1!=r2 || c1!=c2) { \
65 G4ErrorMatrix::error("Range error in Matrix function " #fun "(1)."); \
66 }
67
68#define CHK_DIM_1(c1,r2,fun) \
69 if (c1!=r2) { \
70 G4ErrorMatrix::error("Range error in Matrix function " #fun "(2)."); \
71 }
72
73// Constructors. (Default constructors are inlined and in .icc file)
74
75G4ErrorMatrix::G4ErrorMatrix(G4int p,G4int q)
76 : m(p*q), nrow(p), ncol(q)
77{
78 size = nrow * ncol;
79}
80
81G4ErrorMatrix::G4ErrorMatrix(G4int p,G4int q,G4int init)
82 : m(p*q), nrow(p), ncol(q)
83{
84 size = nrow * ncol;
85
86 if (size > 0)
87 {
88 switch(init)
89 {
90 case 0:
91 break;
92
93 case 1:
94 {
95 if ( ncol == nrow )
96 {
97 G4ErrorMatrixIter a = m.begin();
98 G4ErrorMatrixIter b = m.end();
99 for( ; a<b; a+=(ncol+1)) *a = 1.0;
100 } else {
101 error("Invalid dimension in G4ErrorMatrix(G4int,G4int,1).");
102 }
103 break;
104 }
105 default:
106 error("G4ErrorMatrix: initialization must be either 0 or 1.");
107 }
108 }
109}
110
111//
112// Destructor
113//
114G4ErrorMatrix::~G4ErrorMatrix()
115{
116}
117
118G4ErrorMatrix::G4ErrorMatrix(const G4ErrorMatrix &m1)
119 : m(m1.size), nrow(m1.nrow), ncol(m1.ncol), size(m1.size)
120{
121 m = m1.m;
122}
123
124G4ErrorMatrix::G4ErrorMatrix(const G4ErrorSymMatrix &m1)
125 : m(m1.nrow*m1.nrow), nrow(m1.nrow), ncol(m1.nrow)
126{
127 size = nrow * ncol;
128
129 G4int n = ncol;
130 G4ErrorMatrixConstIter sjk = m1.m.begin();
131 G4ErrorMatrixIter m1j = m.begin();
132 G4ErrorMatrixIter mj = m.begin();
133 // j >= k
134 for(G4int j=1;j<=nrow;j++)
135 {
136 G4ErrorMatrixIter mjk = mj;
137 G4ErrorMatrixIter mkj = m1j;
138 for(G4int k=1;k<=j;k++)
139 {
140 *(mjk++) = *sjk;
141 if(j!=k) *mkj = *sjk;
142 sjk++;
143 mkj += n;
144 }
145 mj += n;
146 m1j++;
147 }
148}
149
150//
151//
152// Sub matrix
153//
154//
155
156G4ErrorMatrix G4ErrorMatrix::sub(G4int min_row, G4int max_row,
157 G4int min_col,G4int max_col) const
158{
159 G4ErrorMatrix mret(max_row-min_row+1,max_col-min_col+1);
160 if(max_row > num_row() || max_col >num_col())
161 { error("G4ErrorMatrix::sub: Index out of range"); }
162 G4ErrorMatrixIter a = mret.m.begin();
163 G4int nc = num_col();
164 G4ErrorMatrixConstIter b1 = m.begin() + (min_row - 1) * nc + min_col - 1;
165
166 for(G4int irow=1; irow<=mret.num_row(); irow++)
167 {
168 G4ErrorMatrixConstIter brc = b1;
169 for(G4int icol=1; icol<=mret.num_col(); icol++)
170 {
171 *(a++) = *(brc++);
172 }
173 b1 += nc;
174 }
175 return mret;
176}
177
178void G4ErrorMatrix::sub(G4int row,G4int col,const G4ErrorMatrix &m1)
179{
180 if(row <1 || row+m1.num_row()-1 > num_row() ||
181 col <1 || col+m1.num_col()-1 > num_col() )
182 { error("G4ErrorMatrix::sub: Index out of range"); }
183 G4ErrorMatrixConstIter a = m1.m.begin();
184 G4int nc = num_col();
185 G4ErrorMatrixIter b1 = m.begin() + (row - 1) * nc + col - 1;
186
187 for(G4int irow=1; irow<=m1.num_row(); irow++)
188 {
189 G4ErrorMatrixIter brc = b1;
190 for(G4int icol=1; icol<=m1.num_col(); icol++)
191 {
192 *(brc++) = *(a++);
193 }
194 b1 += nc;
195 }
196}
197
198//
199// Direct sum of two matricies
200//
201
202G4ErrorMatrix dsum(const G4ErrorMatrix &m1, const G4ErrorMatrix &m2)
203{
204 G4ErrorMatrix mret(m1.num_row() + m2.num_row(), m1.num_col() + m2.num_col(),
205 0);
206 mret.sub(1,1,m1);
207 mret.sub(m1.num_row()+1,m1.num_col()+1,m2);
208 return mret;
209}
210
211/* -----------------------------------------------------------------------
212 This section contains support routines for matrix.h. This section contains
213 The two argument functions +,-. They call the copy constructor and +=,-=.
214 ----------------------------------------------------------------------- */
215
216G4ErrorMatrix G4ErrorMatrix::operator- () const
217{
218 G4ErrorMatrix m2(nrow, ncol);
219 G4ErrorMatrixConstIter a=m.begin();
220 G4ErrorMatrixIter b=m2.m.begin();
221 G4ErrorMatrixConstIter e=m.end();
222 for(;a<e; a++, b++) (*b) = -(*a);
223 return m2;
224}
225
226G4ErrorMatrix operator+(const G4ErrorMatrix &m1,const G4ErrorMatrix &m2)
227{
228 G4ErrorMatrix mret(m1.nrow, m1.ncol);
229 CHK_DIM_2(m1.num_row(),m2.num_row(), m1.num_col(),m2.num_col(),+);
230 SIMPLE_TOP(+)
231 return mret;
232}
233
234//
235// operator -
236//
237
238G4ErrorMatrix operator-(const G4ErrorMatrix &m1,const G4ErrorMatrix &m2)
239{
240 G4ErrorMatrix mret(m1.num_row(), m1.num_col());
241 CHK_DIM_2(m1.num_row(),m2.num_row(),
242 m1.num_col(),m2.num_col(),-);
243 SIMPLE_TOP(-)
244 return mret;
245}
246
247/* -----------------------------------------------------------------------
248 This section contains support routines for matrix.h. This file contains
249 The two argument functions *,/. They call copy constructor and then /=,*=.
250 ----------------------------------------------------------------------- */
251
252G4ErrorMatrix operator/(const G4ErrorMatrix &m1,G4double t)
253{
254 G4ErrorMatrix mret(m1);
255 mret /= t;
256 return mret;
257}
258
259G4ErrorMatrix operator*(const G4ErrorMatrix &m1,G4double t)
260{
261 G4ErrorMatrix mret(m1);
262 mret *= t;
263 return mret;
264}
265
266G4ErrorMatrix operator*(G4double t,const G4ErrorMatrix &m1)
267{
268 G4ErrorMatrix mret(m1);
269 mret *= t;
270 return mret;
271}
272
273G4ErrorMatrix operator*(const G4ErrorMatrix &m1,const G4ErrorMatrix &m2)
274{
275 // initialize matrix to 0.0
276 G4ErrorMatrix mret(m1.nrow,m2.ncol,0);
277 CHK_DIM_1(m1.ncol,m2.nrow,*);
278
279 G4int m1cols = m1.ncol;
280 G4int m2cols = m2.ncol;
281
282 for (G4int i=0; i<m1.nrow; i++)
283 {
284 for (G4int j=0; j<m1cols; j++)
285 {
286 G4double temp = m1.m[i*m1cols+j];
287 G4ErrorMatrixIter pt = mret.m.begin() + i*m2cols;
288
289 // Loop over k (the column index in matrix m2)
290 G4ErrorMatrixConstIter pb = m2.m.begin() + m2cols*j;
291 const G4ErrorMatrixConstIter pblast = pb + m2cols;
292 while (pb < pblast)
293 {
294 (*pt) += temp * (*pb);
295 pb++;
296 pt++;
297 }
298 }
299 }
300 return mret;
301}
302
303/* -----------------------------------------------------------------------
304 This section contains the assignment and inplace operators =,+=,-=,*=,/=.
305 ----------------------------------------------------------------------- */
306
307G4ErrorMatrix & G4ErrorMatrix::operator+=(const G4ErrorMatrix &m2)
308{
309 CHK_DIM_2(num_row(),m2.num_row(),num_col(),m2.num_col(),+=);
310 SIMPLE_BOP(+=)
311 return (*this);
312}
313
314G4ErrorMatrix & G4ErrorMatrix::operator-=(const G4ErrorMatrix &m2)
315{
316 CHK_DIM_2(num_row(),m2.num_row(),num_col(),m2.num_col(),-=);
317 SIMPLE_BOP(-=)
318 return (*this);
319}
320
321G4ErrorMatrix & G4ErrorMatrix::operator/=(G4double t)
322{
323 SIMPLE_UOP(/=)
324 return (*this);
325}
326
327G4ErrorMatrix & G4ErrorMatrix::operator*=(G4double t)
328{
329 SIMPLE_UOP(*=)
330 return (*this);
331}
332
333G4ErrorMatrix & G4ErrorMatrix::operator=(const G4ErrorMatrix &m1)
334{
335 if(m1.nrow*m1.ncol != size) //??fixme?? m1.size != size
336 {
337 size = m1.nrow * m1.ncol;
338 m.resize(size); //??fixme?? if (size < m1.size) m.resize(m1.size);
339 }
340 nrow = m1.nrow;
341 ncol = m1.ncol;
342 m = m1.m;
343 return (*this);
344}
345
346
347// Print the G4ErrorMatrix.
348
349std::ostream& operator<<(std::ostream &s, const G4ErrorMatrix &q)
350{
351 s << "\n";
352
353 // Fixed format needs 3 extra characters for field,
354 // while scientific needs 7
355
356 G4int width;
357 if(s.flags() & std::ios::fixed)
358 { width = s.precision()+3; }
359 else
360 { width = s.precision()+7; }
361 for(G4int irow = 1; irow<= q.num_row(); irow++)
362 {
363 for(G4int icol = 1; icol <= q.num_col(); icol++)
364 {
365 s.width(width);
366 s << q(irow,icol) << " ";
367 }
368 s << G4endl;
369 }
370 return s;
371}
372
373G4ErrorMatrix G4ErrorMatrix::T() const
374{
375 G4ErrorMatrix mret(ncol,nrow);
376 G4ErrorMatrixConstIter pl = m.end();
377 G4ErrorMatrixConstIter pme = m.begin();
378 G4ErrorMatrixIter pt = mret.m.begin();
379 G4ErrorMatrixIter ptl = mret.m.end();
380 for (; pme < pl; pme++, pt+=nrow)
381 {
382 if (pt >= ptl) { pt -= (size-1); }
383 (*pt) = (*pme);
384 }
385 return mret;
386}
387
388G4ErrorMatrix
389G4ErrorMatrix::apply(G4double (*f)(G4double, G4int, G4int)) const
390{
391 G4ErrorMatrix mret(num_row(),num_col());
392 G4ErrorMatrixConstIter a = m.begin();
393 G4ErrorMatrixIter b = mret.m.begin();
394 for(G4int ir=1;ir<=num_row();ir++)
395 {
396 for(G4int ic=1;ic<=num_col();ic++)
397 {
398 *(b++) = (*f)(*(a++), ir, ic);
399 }
400 }
401 return mret;
402}
403
404G4int G4ErrorMatrix::dfinv_matrix(G4int *ir) {
405 if (num_col()!=num_row())
406 { error("dfinv_matrix: G4ErrorMatrix is not NxN"); }
407 G4int n = num_col();
408 if (n==1) { return 0; }
409
410 G4double s31, s32;
411 G4double s33, s34;
412
413 G4ErrorMatrixIter m11 = m.begin();
414 G4ErrorMatrixIter m12 = m11 + 1;
415 G4ErrorMatrixIter m21 = m11 + n;
416 G4ErrorMatrixIter m22 = m12 + n;
417 *m21 = -(*m22) * (*m11) * (*m21);
418 *m12 = -(*m12);
419 if (n>2)
420 {
421 G4ErrorMatrixIter mi = m.begin() + 2 * n;
422 G4ErrorMatrixIter mii= m.begin() + 2 * n + 2;
423 G4ErrorMatrixIter mimim = m.begin() + n + 1;
424 for (G4int i=3;i<=n;i++)
425 {
426 G4int im2 = i - 2;
427 G4ErrorMatrixIter mj = m.begin();
428 G4ErrorMatrixIter mji = mj + i - 1;
429 G4ErrorMatrixIter mij = mi;
430 for (G4int j=1;j<=im2;j++)
431 {
432 s31 = 0.0;
433 s32 = *mji;
434 G4ErrorMatrixIter mkj = mj + j - 1;
435 G4ErrorMatrixIter mik = mi + j - 1;
436 G4ErrorMatrixIter mjkp = mj + j;
437 G4ErrorMatrixIter mkpi = mj + n + i - 1;
438 for (G4int k=j;k<=im2;k++)
439 {
440 s31 += (*mkj) * (*(mik++));
441 s32 += (*(mjkp++)) * (*mkpi);
442 mkj += n;
443 mkpi += n;
444 }
445 *mij = -(*mii) * (((*(mij-n)))*( (*(mii-1)))+(s31));
446 *mji = -s32;
447 mj += n;
448 mji += n;
449 mij++;
450 }
451 *(mii-1) = -(*mii) * (*mimim) * (*(mii-1));
452 *(mimim+1) = -(*(mimim+1));
453 mi += n;
454 mimim += (n+1);
455 mii += (n+1);
456 }
457 }
458 G4ErrorMatrixIter mi = m.begin();
459 G4ErrorMatrixIter mii = m.begin();
460 for (G4int i=1;i<n;i++)
461 {
462 G4int ni = n - i;
463 G4ErrorMatrixIter mij = mi;
464 G4int j;
465 for (j=1; j<=i;j++)
466 {
467 s33 = *mij;
468 G4ErrorMatrixIter mikj = mi + n + j - 1;
469 G4ErrorMatrixIter miik = mii + 1;
470 G4ErrorMatrixIter min_end = mi + n;
471 for (;miik<min_end;)
472 {
473 s33 += (*mikj) * (*(miik++));
474 mikj += n;
475 }
476 *(mij++) = s33;
477 }
478 for (j=1;j<=ni;j++)
479 {
480 s34 = 0.0;
481 G4ErrorMatrixIter miik = mii + j;
482 G4ErrorMatrixIter mikij = mii + j * n + j;
483 for (G4int k=j;k<=ni;k++)
484 {
485 s34 += *mikij * (*(miik++));
486 mikij += n;
487 }
488 *(mii+j) = s34;
489 }
490 mi += n;
491 mii += (n+1);
492 }
493 G4int nxch = ir[n];
494 if (nxch==0) return 0;
495 for (G4int mm=1;mm<=nxch;mm++)
496 {
497 G4int k = nxch - mm + 1;
498 G4int ij = ir[k];
499 G4int i = ij >> 12;
500 G4int j = ij%4096;
501 G4ErrorMatrixIter mki = m.begin() + i - 1;
502 G4ErrorMatrixIter mkj = m.begin() + j - 1;
503 for (k=1; k<=n;k++)
504 {
505 // 2/24/05 David Sachs fix of improper swap bug that was present
506 // for many years:
507 G4double ti = *mki; // 2/24/05
508 *mki = *mkj;
509 *mkj = ti; // 2/24/05
510 mki += n;
511 mkj += n;
512 }
513 }
514 return 0;
515}
516
517G4int G4ErrorMatrix::dfact_matrix(G4double &det, G4int *ir)
518{
519 if (ncol!=nrow)
520 error("dfact_matrix: G4ErrorMatrix is not NxN");
521
522 G4int ifail, jfail;
523 G4int n = ncol;
524
525 G4double tf;
526 G4double g1 = 1.0e-19, g2 = 1.0e19;
527
528 G4double p, q, t;
529 G4double s11, s12;
530
531 G4double epsilon = 8*DBL_EPSILON;
532 // could be set to zero (like it was before)
533 // but then the algorithm often doesn't detect
534 // that a matrix is singular
535
536 G4int normal = 0, imposs = -1;
537 G4int jrange = 0, jover = 1, junder = -1;
538 ifail = normal;
539 jfail = jrange;
540 G4int nxch = 0;
541 det = 1.0;
542 G4ErrorMatrixIter mj = m.begin();
543 G4ErrorMatrixIter mjj = mj;
544 for (G4int j=1;j<=n;j++)
545 {
546 G4int k = j;
547 p = (std::fabs(*mjj));
548 if (j!=n) {
549 G4ErrorMatrixIter mij = mj + n + j - 1;
550 for (G4int i=j+1;i<=n;i++)
551 {
552 q = (std::fabs(*(mij)));
553 if (q > p)
554 {
555 k = i;
556 p = q;
557 }
558 mij += n;
559 }
560 if (k==j)
561 {
562 if (p <= epsilon)
563 {
564 det = 0;
565 ifail = imposs;
566 jfail = jrange;
567 return ifail;
568 }
569 det = -det; // in this case the sign of the determinant
570 // must not change. So I change it twice.
571 }
572 G4ErrorMatrixIter mjl = mj;
573 G4ErrorMatrixIter mkl = m.begin() + (k-1)*n;
574 for (G4int l=1;l<=n;l++)
575 {
576 tf = *mjl;
577 *(mjl++) = *mkl;
578 *(mkl++) = tf;
579 }
580 nxch = nxch + 1; // this makes the determinant change its sign
581 ir[nxch] = (((j)<<12)+(k));
582 }
583 else
584 {
585 if (p <= epsilon)
586 {
587 det = 0.0;
588 ifail = imposs;
589 jfail = jrange;
590 return ifail;
591 }
592 }
593 det *= *mjj;
594 *mjj = 1.0 / *mjj;
595 t = (std::fabs(det));
596 if (t < g1)
597 {
598 det = 0.0;
599 if (jfail == jrange) jfail = junder;
600 }
601 else if (t > g2)
602 {
603 det = 1.0;
604 if (jfail==jrange) jfail = jover;
605 }
606 if (j!=n)
607 {
608 G4ErrorMatrixIter mk = mj + n;
609 G4ErrorMatrixIter mkjp = mk + j;
610 G4ErrorMatrixIter mjk = mj + j;
611 for (k=j+1;k<=n;k++)
612 {
613 s11 = - (*mjk);
614 s12 = - (*mkjp);
615 if (j!=1)
616 {
617 G4ErrorMatrixIter mik = m.begin() + k - 1;
618 G4ErrorMatrixIter mijp = m.begin() + j;
619 G4ErrorMatrixIter mki = mk;
620 G4ErrorMatrixIter mji = mj;
621 for (G4int i=1;i<j;i++)
622 {
623 s11 += (*mik) * (*(mji++));
624 s12 += (*mijp) * (*(mki++));
625 mik += n;
626 mijp += n;
627 }
628 }
629 *(mjk++) = -s11 * (*mjj);
630 *(mkjp) = -(((*(mjj+1)))*((*(mkjp-1)))+(s12));
631 mk += n;
632 mkjp += n;
633 }
634 }
635 mj += n;
636 mjj += (n+1);
637 }
638 if (nxch%2==1) det = -det;
639 if (jfail !=jrange) det = 0.0;
640 ir[n] = nxch;
641 return 0;
642}
643
644void G4ErrorMatrix::invert(G4int &ierr)
645{
646 if(ncol != nrow)
647 { error("G4ErrorMatrix::invert: G4ErrorMatrix is not NxN"); }
648
649 static G4int max_array = 20;
650 static G4int *ir = new G4int [max_array+1];
651
652 if (ncol > max_array)
653 {
654 delete [] ir;
655 max_array = nrow;
656 ir = new G4int [max_array+1];
657 }
658 G4double t1, t2, t3;
659 G4double det, temp, s;
660 G4int ifail;
661 switch(nrow)
662 {
663 case 3:
664 G4double c11,c12,c13,c21,c22,c23,c31,c32,c33;
665 ifail = 0;
666 c11 = (*(m.begin()+4)) * (*(m.begin()+8))
667 - (*(m.begin()+5)) * (*(m.begin()+7));
668 c12 = (*(m.begin()+5)) * (*(m.begin()+6))
669 - (*(m.begin()+3)) * (*(m.begin()+8));
670 c13 = (*(m.begin()+3)) * (*(m.begin()+7))
671 - (*(m.begin()+4)) * (*(m.begin()+6));
672 c21 = (*(m.begin()+7)) * (*(m.begin()+2))
673 - (*(m.begin()+8)) * (*(m.begin()+1));
674 c22 = (*(m.begin()+8)) * (*m.begin())
675 - (*(m.begin()+6)) * (*(m.begin()+2));
676 c23 = (*(m.begin()+6)) * (*(m.begin()+1))
677 - (*(m.begin()+7)) * (*m.begin());
678 c31 = (*(m.begin()+1)) * (*(m.begin()+5))
679 - (*(m.begin()+2)) * (*(m.begin()+4));
680 c32 = (*(m.begin()+2)) * (*(m.begin()+3))
681 - (*m.begin()) * (*(m.begin()+5));
682 c33 = (*m.begin()) * (*(m.begin()+4))
683 - (*(m.begin()+1)) * (*(m.begin()+3));
684 t1 = std::fabs(*m.begin());
685 t2 = std::fabs(*(m.begin()+3));
686 t3 = std::fabs(*(m.begin()+6));
687 if (t1 >= t2)
688 {
689 if (t3 >= t1)
690 {
691 temp = *(m.begin()+6);
692 det = c23*c12-c22*c13;
693 }
694 else
695 {
696 temp = *(m.begin());
697 det = c22*c33-c23*c32;
698 }
699 }
700 else if (t3 >= t2)
701 {
702 temp = *(m.begin()+6);
703 det = c23*c12-c22*c13;
704 }
705 else
706 {
707 temp = *(m.begin()+3);
708 det = c13*c32-c12*c33;
709 }
710 if (det==0)
711 {
712 ierr = 1;
713 return;
714 }
715 {
716 G4double s = temp/det;
717 G4ErrorMatrixIter mm = m.begin();
718 *(mm++) = s*c11;
719 *(mm++) = s*c21;
720 *(mm++) = s*c31;
721 *(mm++) = s*c12;
722 *(mm++) = s*c22;
723 *(mm++) = s*c32;
724 *(mm++) = s*c13;
725 *(mm++) = s*c23;
726 *(mm) = s*c33;
727 }
728 break;
729 case 2:
730 ifail = 0;
731 det = (*m.begin())*(*(m.begin()+3)) - (*(m.begin()+1))*(*(m.begin()+2));
732 if (det==0)
733 {
734 ierr = 1;
735 return;
736 }
737 s = 1.0/det;
738 temp = s*(*(m.begin()+3));
739 *(m.begin()+1) *= -s;
740 *(m.begin()+2) *= -s;
741 *(m.begin()+3) = s*(*m.begin());
742 *(m.begin()) = temp;
743 break;
744 case 1:
745 ifail = 0;
746 if ((*(m.begin()))==0)
747 {
748 ierr = 1;
749 return;
750 }
751 *(m.begin()) = 1.0/(*(m.begin()));
752 break;
753 case 4:
754 invertHaywood4(ierr);
755 return;
756 case 5:
757 invertHaywood5(ierr);
758 return;
759 case 6:
760 invertHaywood6(ierr);
761 return;
762 default:
763 ifail = dfact_matrix(det, ir);
764 if(ifail) {
765 ierr = 1;
766 return;
767 }
768 dfinv_matrix(ir);
769 break;
770 }
771 ierr = 0;
772 return;
773}
774
775G4double G4ErrorMatrix::determinant() const
776{
777 static G4int max_array = 20;
778 static G4int *ir = new G4int [max_array+1];
779 if(ncol != nrow)
780 { error("G4ErrorMatrix::determinant: G4ErrorMatrix is not NxN"); }
781 if (ncol > max_array)
782 {
783 delete [] ir;
784 max_array = nrow;
785 ir = new G4int [max_array+1];
786 }
787 G4double det;
788 G4ErrorMatrix mt(*this);
789 G4int i = mt.dfact_matrix(det, ir);
790 if(i==0) return det;
791 return 0;
792}
793
794G4double G4ErrorMatrix::trace() const
795{
796 G4double t = 0.0;
797 for (G4ErrorMatrixConstIter d = m.begin(); d < m.end(); d += (ncol+1) )
798 {
799 t += *d;
800 }
801 return t;
802}
803
804void G4ErrorMatrix::error(const char *s)
805{
806 G4cerr << s << G4endl;
807 G4cerr << "---Exiting to System." << G4endl;
808 abort();
809}
810
811
812// Aij are indices for a 6x6 matrix.
813// Mij are indices for a 5x5 matrix.
814// Fij are indices for a 4x4 matrix.
815
816#define A00 0
817#define A01 1
818#define A02 2
819#define A03 3
820#define A04 4
821#define A05 5
822
823#define A10 6
824#define A11 7
825#define A12 8
826#define A13 9
827#define A14 10
828#define A15 11
829
830#define A20 12
831#define A21 13
832#define A22 14
833#define A23 15
834#define A24 16
835#define A25 17
836
837#define A30 18
838#define A31 19
839#define A32 20
840#define A33 21
841#define A34 22
842#define A35 23
843
844#define A40 24
845#define A41 25
846#define A42 26
847#define A43 27
848#define A44 28
849#define A45 29
850
851#define A50 30
852#define A51 31
853#define A52 32
854#define A53 33
855#define A54 34
856#define A55 35
857
858#define M00 0
859#define M01 1
860#define M02 2
861#define M03 3
862#define M04 4
863
864#define M10 5
865#define M11 6
866#define M12 7
867#define M13 8
868#define M14 9
869
870#define M20 10
871#define M21 11
872#define M22 12
873#define M23 13
874#define M24 14
875
876#define M30 15
877#define M31 16
878#define M32 17
879#define M33 18
880#define M34 19
881
882#define M40 20
883#define M41 21
884#define M42 22
885#define M43 23
886#define M44 24
887
888#define F00 0
889#define F01 1
890#define F02 2
891#define F03 3
892
893#define F10 4
894#define F11 5
895#define F12 6
896#define F13 7
897
898#define F20 8
899#define F21 9
900#define F22 10
901#define F23 11
902
903#define F30 12
904#define F31 13
905#define F32 14
906#define F33 15
907
908
909void G4ErrorMatrix::invertHaywood4 (G4int & ifail)
910{
911 ifail = 0;
912
913 // Find all NECESSARY 2x2 dets: (18 of them)
914
915 G4double Det2_12_01 = m[F10]*m[F21] - m[F11]*m[F20];
916 G4double Det2_12_02 = m[F10]*m[F22] - m[F12]*m[F20];
917 G4double Det2_12_03 = m[F10]*m[F23] - m[F13]*m[F20];
918 G4double Det2_12_13 = m[F11]*m[F23] - m[F13]*m[F21];
919 G4double Det2_12_23 = m[F12]*m[F23] - m[F13]*m[F22];
920 G4double Det2_12_12 = m[F11]*m[F22] - m[F12]*m[F21];
921 G4double Det2_13_01 = m[F10]*m[F31] - m[F11]*m[F30];
922 G4double Det2_13_02 = m[F10]*m[F32] - m[F12]*m[F30];
923 G4double Det2_13_03 = m[F10]*m[F33] - m[F13]*m[F30];
924 G4double Det2_13_12 = m[F11]*m[F32] - m[F12]*m[F31];
925 G4double Det2_13_13 = m[F11]*m[F33] - m[F13]*m[F31];
926 G4double Det2_13_23 = m[F12]*m[F33] - m[F13]*m[F32];
927 G4double Det2_23_01 = m[F20]*m[F31] - m[F21]*m[F30];
928 G4double Det2_23_02 = m[F20]*m[F32] - m[F22]*m[F30];
929 G4double Det2_23_03 = m[F20]*m[F33] - m[F23]*m[F30];
930 G4double Det2_23_12 = m[F21]*m[F32] - m[F22]*m[F31];
931 G4double Det2_23_13 = m[F21]*m[F33] - m[F23]*m[F31];
932 G4double Det2_23_23 = m[F22]*m[F33] - m[F23]*m[F32];
933
934 // Find all NECESSARY 3x3 dets: (16 of them)
935
936 G4double Det3_012_012 = m[F00]*Det2_12_12 - m[F01]*Det2_12_02
937 + m[F02]*Det2_12_01;
938 G4double Det3_012_013 = m[F00]*Det2_12_13 - m[F01]*Det2_12_03
939 + m[F03]*Det2_12_01;
940 G4double Det3_012_023 = m[F00]*Det2_12_23 - m[F02]*Det2_12_03
941 + m[F03]*Det2_12_02;
942 G4double Det3_012_123 = m[F01]*Det2_12_23 - m[F02]*Det2_12_13
943 + m[F03]*Det2_12_12;
944 G4double Det3_013_012 = m[F00]*Det2_13_12 - m[F01]*Det2_13_02
945 + m[F02]*Det2_13_01;
946 G4double Det3_013_013 = m[F00]*Det2_13_13 - m[F01]*Det2_13_03
947 + m[F03]*Det2_13_01;
948 G4double Det3_013_023 = m[F00]*Det2_13_23 - m[F02]*Det2_13_03
949 + m[F03]*Det2_13_02;
950 G4double Det3_013_123 = m[F01]*Det2_13_23 - m[F02]*Det2_13_13
951 + m[F03]*Det2_13_12;
952 G4double Det3_023_012 = m[F00]*Det2_23_12 - m[F01]*Det2_23_02
953 + m[F02]*Det2_23_01;
954 G4double Det3_023_013 = m[F00]*Det2_23_13 - m[F01]*Det2_23_03
955 + m[F03]*Det2_23_01;
956 G4double Det3_023_023 = m[F00]*Det2_23_23 - m[F02]*Det2_23_03
957 + m[F03]*Det2_23_02;
958 G4double Det3_023_123 = m[F01]*Det2_23_23 - m[F02]*Det2_23_13
959 + m[F03]*Det2_23_12;
960 G4double Det3_123_012 = m[F10]*Det2_23_12 - m[F11]*Det2_23_02
961 + m[F12]*Det2_23_01;
962 G4double Det3_123_013 = m[F10]*Det2_23_13 - m[F11]*Det2_23_03
963 + m[F13]*Det2_23_01;
964 G4double Det3_123_023 = m[F10]*Det2_23_23 - m[F12]*Det2_23_03
965 + m[F13]*Det2_23_02;
966 G4double Det3_123_123 = m[F11]*Det2_23_23 - m[F12]*Det2_23_13
967 + m[F13]*Det2_23_12;
968
969 // Find the 4x4 det:
970
971 G4double det = m[F00]*Det3_123_123
972 - m[F01]*Det3_123_023
973 + m[F02]*Det3_123_013
974 - m[F03]*Det3_123_012;
975
976 if ( det == 0 )
977 {
978 ifail = 1;
979 return;
980 }
981
982 G4double oneOverDet = 1.0/det;
983 G4double mn1OverDet = - oneOverDet;
984
985 m[F00] = Det3_123_123 * oneOverDet;
986 m[F01] = Det3_023_123 * mn1OverDet;
987 m[F02] = Det3_013_123 * oneOverDet;
988 m[F03] = Det3_012_123 * mn1OverDet;
989
990 m[F10] = Det3_123_023 * mn1OverDet;
991 m[F11] = Det3_023_023 * oneOverDet;
992 m[F12] = Det3_013_023 * mn1OverDet;
993 m[F13] = Det3_012_023 * oneOverDet;
994
995 m[F20] = Det3_123_013 * oneOverDet;
996 m[F21] = Det3_023_013 * mn1OverDet;
997 m[F22] = Det3_013_013 * oneOverDet;
998 m[F23] = Det3_012_013 * mn1OverDet;
999
1000 m[F30] = Det3_123_012 * mn1OverDet;
1001 m[F31] = Det3_023_012 * oneOverDet;
1002 m[F32] = Det3_013_012 * mn1OverDet;
1003 m[F33] = Det3_012_012 * oneOverDet;
1004
1005 return;
1006}
1007
1008void G4ErrorMatrix::invertHaywood5 (G4int & ifail)
1009{
1010 ifail = 0;
1011
1012 // Find all NECESSARY 2x2 dets: (30 of them)
1013
1014 G4double Det2_23_01 = m[M20]*m[M31] - m[M21]*m[M30];
1015 G4double Det2_23_02 = m[M20]*m[M32] - m[M22]*m[M30];
1016 G4double Det2_23_03 = m[M20]*m[M33] - m[M23]*m[M30];
1017 G4double Det2_23_04 = m[M20]*m[M34] - m[M24]*m[M30];
1018 G4double Det2_23_12 = m[M21]*m[M32] - m[M22]*m[M31];
1019 G4double Det2_23_13 = m[M21]*m[M33] - m[M23]*m[M31];
1020 G4double Det2_23_14 = m[M21]*m[M34] - m[M24]*m[M31];
1021 G4double Det2_23_23 = m[M22]*m[M33] - m[M23]*m[M32];
1022 G4double Det2_23_24 = m[M22]*m[M34] - m[M24]*m[M32];
1023 G4double Det2_23_34 = m[M23]*m[M34] - m[M24]*m[M33];
1024 G4double Det2_24_01 = m[M20]*m[M41] - m[M21]*m[M40];
1025 G4double Det2_24_02 = m[M20]*m[M42] - m[M22]*m[M40];
1026 G4double Det2_24_03 = m[M20]*m[M43] - m[M23]*m[M40];
1027 G4double Det2_24_04 = m[M20]*m[M44] - m[M24]*m[M40];
1028 G4double Det2_24_12 = m[M21]*m[M42] - m[M22]*m[M41];
1029 G4double Det2_24_13 = m[M21]*m[M43] - m[M23]*m[M41];
1030 G4double Det2_24_14 = m[M21]*m[M44] - m[M24]*m[M41];
1031 G4double Det2_24_23 = m[M22]*m[M43] - m[M23]*m[M42];
1032 G4double Det2_24_24 = m[M22]*m[M44] - m[M24]*m[M42];
1033 G4double Det2_24_34 = m[M23]*m[M44] - m[M24]*m[M43];
1034 G4double Det2_34_01 = m[M30]*m[M41] - m[M31]*m[M40];
1035 G4double Det2_34_02 = m[M30]*m[M42] - m[M32]*m[M40];
1036 G4double Det2_34_03 = m[M30]*m[M43] - m[M33]*m[M40];
1037 G4double Det2_34_04 = m[M30]*m[M44] - m[M34]*m[M40];
1038 G4double Det2_34_12 = m[M31]*m[M42] - m[M32]*m[M41];
1039 G4double Det2_34_13 = m[M31]*m[M43] - m[M33]*m[M41];
1040 G4double Det2_34_14 = m[M31]*m[M44] - m[M34]*m[M41];
1041 G4double Det2_34_23 = m[M32]*m[M43] - m[M33]*m[M42];
1042 G4double Det2_34_24 = m[M32]*m[M44] - m[M34]*m[M42];
1043 G4double Det2_34_34 = m[M33]*m[M44] - m[M34]*m[M43];
1044
1045 // Find all NECESSARY 3x3 dets: (40 of them)
1046
1047 G4double Det3_123_012 = m[M10]*Det2_23_12 - m[M11]*Det2_23_02
1048 + m[M12]*Det2_23_01;
1049 G4double Det3_123_013 = m[M10]*Det2_23_13 - m[M11]*Det2_23_03
1050 + m[M13]*Det2_23_01;
1051 G4double Det3_123_014 = m[M10]*Det2_23_14 - m[M11]*Det2_23_04
1052 + m[M14]*Det2_23_01;
1053 G4double Det3_123_023 = m[M10]*Det2_23_23 - m[M12]*Det2_23_03
1054 + m[M13]*Det2_23_02;
1055 G4double Det3_123_024 = m[M10]*Det2_23_24 - m[M12]*Det2_23_04
1056 + m[M14]*Det2_23_02;
1057 G4double Det3_123_034 = m[M10]*Det2_23_34 - m[M13]*Det2_23_04
1058 + m[M14]*Det2_23_03;
1059 G4double Det3_123_123 = m[M11]*Det2_23_23 - m[M12]*Det2_23_13
1060 + m[M13]*Det2_23_12;
1061 G4double Det3_123_124 = m[M11]*Det2_23_24 - m[M12]*Det2_23_14
1062 + m[M14]*Det2_23_12;
1063 G4double Det3_123_134 = m[M11]*Det2_23_34 - m[M13]*Det2_23_14
1064 + m[M14]*Det2_23_13;
1065 G4double Det3_123_234 = m[M12]*Det2_23_34 - m[M13]*Det2_23_24
1066 + m[M14]*Det2_23_23;
1067 G4double Det3_124_012 = m[M10]*Det2_24_12 - m[M11]*Det2_24_02
1068 + m[M12]*Det2_24_01;
1069 G4double Det3_124_013 = m[M10]*Det2_24_13 - m[M11]*Det2_24_03
1070 + m[M13]*Det2_24_01;
1071 G4double Det3_124_014 = m[M10]*Det2_24_14 - m[M11]*Det2_24_04
1072 + m[M14]*Det2_24_01;
1073 G4double Det3_124_023 = m[M10]*Det2_24_23 - m[M12]*Det2_24_03
1074 + m[M13]*Det2_24_02;
1075 G4double Det3_124_024 = m[M10]*Det2_24_24 - m[M12]*Det2_24_04
1076 + m[M14]*Det2_24_02;
1077 G4double Det3_124_034 = m[M10]*Det2_24_34 - m[M13]*Det2_24_04
1078 + m[M14]*Det2_24_03;
1079 G4double Det3_124_123 = m[M11]*Det2_24_23 - m[M12]*Det2_24_13
1080 + m[M13]*Det2_24_12;
1081 G4double Det3_124_124 = m[M11]*Det2_24_24 - m[M12]*Det2_24_14
1082 + m[M14]*Det2_24_12;
1083 G4double Det3_124_134 = m[M11]*Det2_24_34 - m[M13]*Det2_24_14
1084 + m[M14]*Det2_24_13;
1085 G4double Det3_124_234 = m[M12]*Det2_24_34 - m[M13]*Det2_24_24
1086 + m[M14]*Det2_24_23;
1087 G4double Det3_134_012 = m[M10]*Det2_34_12 - m[M11]*Det2_34_02
1088 + m[M12]*Det2_34_01;
1089 G4double Det3_134_013 = m[M10]*Det2_34_13 - m[M11]*Det2_34_03
1090 + m[M13]*Det2_34_01;
1091 G4double Det3_134_014 = m[M10]*Det2_34_14 - m[M11]*Det2_34_04
1092 + m[M14]*Det2_34_01;
1093 G4double Det3_134_023 = m[M10]*Det2_34_23 - m[M12]*Det2_34_03
1094 + m[M13]*Det2_34_02;
1095 G4double Det3_134_024 = m[M10]*Det2_34_24 - m[M12]*Det2_34_04
1096 + m[M14]*Det2_34_02;
1097 G4double Det3_134_034 = m[M10]*Det2_34_34 - m[M13]*Det2_34_04
1098 + m[M14]*Det2_34_03;
1099 G4double Det3_134_123 = m[M11]*Det2_34_23 - m[M12]*Det2_34_13
1100 + m[M13]*Det2_34_12;
1101 G4double Det3_134_124 = m[M11]*Det2_34_24 - m[M12]*Det2_34_14
1102 + m[M14]*Det2_34_12;
1103 G4double Det3_134_134 = m[M11]*Det2_34_34 - m[M13]*Det2_34_14
1104 + m[M14]*Det2_34_13;
1105 G4double Det3_134_234 = m[M12]*Det2_34_34 - m[M13]*Det2_34_24
1106 + m[M14]*Det2_34_23;
1107 G4double Det3_234_012 = m[M20]*Det2_34_12 - m[M21]*Det2_34_02
1108 + m[M22]*Det2_34_01;
1109 G4double Det3_234_013 = m[M20]*Det2_34_13 - m[M21]*Det2_34_03
1110 + m[M23]*Det2_34_01;
1111 G4double Det3_234_014 = m[M20]*Det2_34_14 - m[M21]*Det2_34_04
1112 + m[M24]*Det2_34_01;
1113 G4double Det3_234_023 = m[M20]*Det2_34_23 - m[M22]*Det2_34_03
1114 + m[M23]*Det2_34_02;
1115 G4double Det3_234_024 = m[M20]*Det2_34_24 - m[M22]*Det2_34_04
1116 + m[M24]*Det2_34_02;
1117 G4double Det3_234_034 = m[M20]*Det2_34_34 - m[M23]*Det2_34_04
1118 + m[M24]*Det2_34_03;
1119 G4double Det3_234_123 = m[M21]*Det2_34_23 - m[M22]*Det2_34_13
1120 + m[M23]*Det2_34_12;
1121 G4double Det3_234_124 = m[M21]*Det2_34_24 - m[M22]*Det2_34_14
1122 + m[M24]*Det2_34_12;
1123 G4double Det3_234_134 = m[M21]*Det2_34_34 - m[M23]*Det2_34_14
1124 + m[M24]*Det2_34_13;
1125 G4double Det3_234_234 = m[M22]*Det2_34_34 - m[M23]*Det2_34_24
1126 + m[M24]*Det2_34_23;
1127
1128 // Find all NECESSARY 4x4 dets: (25 of them)
1129
1130 G4double Det4_0123_0123 = m[M00]*Det3_123_123 - m[M01]*Det3_123_023
1131 + m[M02]*Det3_123_013 - m[M03]*Det3_123_012;
1132 G4double Det4_0123_0124 = m[M00]*Det3_123_124 - m[M01]*Det3_123_024
1133 + m[M02]*Det3_123_014 - m[M04]*Det3_123_012;
1134 G4double Det4_0123_0134 = m[M00]*Det3_123_134 - m[M01]*Det3_123_034
1135 + m[M03]*Det3_123_014 - m[M04]*Det3_123_013;
1136 G4double Det4_0123_0234 = m[M00]*Det3_123_234 - m[M02]*Det3_123_034
1137 + m[M03]*Det3_123_024 - m[M04]*Det3_123_023;
1138 G4double Det4_0123_1234 = m[M01]*Det3_123_234 - m[M02]*Det3_123_134
1139 + m[M03]*Det3_123_124 - m[M04]*Det3_123_123;
1140 G4double Det4_0124_0123 = m[M00]*Det3_124_123 - m[M01]*Det3_124_023
1141 + m[M02]*Det3_124_013 - m[M03]*Det3_124_012;
1142 G4double Det4_0124_0124 = m[M00]*Det3_124_124 - m[M01]*Det3_124_024
1143 + m[M02]*Det3_124_014 - m[M04]*Det3_124_012;
1144 G4double Det4_0124_0134 = m[M00]*Det3_124_134 - m[M01]*Det3_124_034
1145 + m[M03]*Det3_124_014 - m[M04]*Det3_124_013;
1146 G4double Det4_0124_0234 = m[M00]*Det3_124_234 - m[M02]*Det3_124_034
1147 + m[M03]*Det3_124_024 - m[M04]*Det3_124_023;
1148 G4double Det4_0124_1234 = m[M01]*Det3_124_234 - m[M02]*Det3_124_134
1149 + m[M03]*Det3_124_124 - m[M04]*Det3_124_123;
1150 G4double Det4_0134_0123 = m[M00]*Det3_134_123 - m[M01]*Det3_134_023
1151 + m[M02]*Det3_134_013 - m[M03]*Det3_134_012;
1152 G4double Det4_0134_0124 = m[M00]*Det3_134_124 - m[M01]*Det3_134_024
1153 + m[M02]*Det3_134_014 - m[M04]*Det3_134_012;
1154 G4double Det4_0134_0134 = m[M00]*Det3_134_134 - m[M01]*Det3_134_034
1155 + m[M03]*Det3_134_014 - m[M04]*Det3_134_013;
1156 G4double Det4_0134_0234 = m[M00]*Det3_134_234 - m[M02]*Det3_134_034
1157 + m[M03]*Det3_134_024 - m[M04]*Det3_134_023;
1158 G4double Det4_0134_1234 = m[M01]*Det3_134_234 - m[M02]*Det3_134_134
1159 + m[M03]*Det3_134_124 - m[M04]*Det3_134_123;
1160 G4double Det4_0234_0123 = m[M00]*Det3_234_123 - m[M01]*Det3_234_023
1161 + m[M02]*Det3_234_013 - m[M03]*Det3_234_012;
1162 G4double Det4_0234_0124 = m[M00]*Det3_234_124 - m[M01]*Det3_234_024
1163 + m[M02]*Det3_234_014 - m[M04]*Det3_234_012;
1164 G4double Det4_0234_0134 = m[M00]*Det3_234_134 - m[M01]*Det3_234_034
1165 + m[M03]*Det3_234_014 - m[M04]*Det3_234_013;
1166 G4double Det4_0234_0234 = m[M00]*Det3_234_234 - m[M02]*Det3_234_034
1167 + m[M03]*Det3_234_024 - m[M04]*Det3_234_023;
1168 G4double Det4_0234_1234 = m[M01]*Det3_234_234 - m[M02]*Det3_234_134
1169 + m[M03]*Det3_234_124 - m[M04]*Det3_234_123;
1170 G4double Det4_1234_0123 = m[M10]*Det3_234_123 - m[M11]*Det3_234_023
1171 + m[M12]*Det3_234_013 - m[M13]*Det3_234_012;
1172 G4double Det4_1234_0124 = m[M10]*Det3_234_124 - m[M11]*Det3_234_024
1173 + m[M12]*Det3_234_014 - m[M14]*Det3_234_012;
1174 G4double Det4_1234_0134 = m[M10]*Det3_234_134 - m[M11]*Det3_234_034
1175 + m[M13]*Det3_234_014 - m[M14]*Det3_234_013;
1176 G4double Det4_1234_0234 = m[M10]*Det3_234_234 - m[M12]*Det3_234_034
1177 + m[M13]*Det3_234_024 - m[M14]*Det3_234_023;
1178 G4double Det4_1234_1234 = m[M11]*Det3_234_234 - m[M12]*Det3_234_134
1179 + m[M13]*Det3_234_124 - m[M14]*Det3_234_123;
1180
1181 // Find the 5x5 det:
1182
1183 G4double det = m[M00]*Det4_1234_1234
1184 - m[M01]*Det4_1234_0234
1185 + m[M02]*Det4_1234_0134
1186 - m[M03]*Det4_1234_0124
1187 + m[M04]*Det4_1234_0123;
1188
1189 if ( det == 0 )
1190 {
1191 ifail = 1;
1192 return;
1193 }
1194
1195 G4double oneOverDet = 1.0/det;
1196 G4double mn1OverDet = - oneOverDet;
1197
1198 m[M00] = Det4_1234_1234 * oneOverDet;
1199 m[M01] = Det4_0234_1234 * mn1OverDet;
1200 m[M02] = Det4_0134_1234 * oneOverDet;
1201 m[M03] = Det4_0124_1234 * mn1OverDet;
1202 m[M04] = Det4_0123_1234 * oneOverDet;
1203
1204 m[M10] = Det4_1234_0234 * mn1OverDet;
1205 m[M11] = Det4_0234_0234 * oneOverDet;
1206 m[M12] = Det4_0134_0234 * mn1OverDet;
1207 m[M13] = Det4_0124_0234 * oneOverDet;
1208 m[M14] = Det4_0123_0234 * mn1OverDet;
1209
1210 m[M20] = Det4_1234_0134 * oneOverDet;
1211 m[M21] = Det4_0234_0134 * mn1OverDet;
1212 m[M22] = Det4_0134_0134 * oneOverDet;
1213 m[M23] = Det4_0124_0134 * mn1OverDet;
1214 m[M24] = Det4_0123_0134 * oneOverDet;
1215
1216 m[M30] = Det4_1234_0124 * mn1OverDet;
1217 m[M31] = Det4_0234_0124 * oneOverDet;
1218 m[M32] = Det4_0134_0124 * mn1OverDet;
1219 m[M33] = Det4_0124_0124 * oneOverDet;
1220 m[M34] = Det4_0123_0124 * mn1OverDet;
1221
1222 m[M40] = Det4_1234_0123 * oneOverDet;
1223 m[M41] = Det4_0234_0123 * mn1OverDet;
1224 m[M42] = Det4_0134_0123 * oneOverDet;
1225 m[M43] = Det4_0124_0123 * mn1OverDet;
1226 m[M44] = Det4_0123_0123 * oneOverDet;
1227
1228 return;
1229}
1230
1231void G4ErrorMatrix::invertHaywood6 (G4int & ifail)
1232{
1233 ifail = 0;
1234
1235 // Find all NECESSARY 2x2 dets: (45 of them)
1236
1237 G4double Det2_34_01 = m[A30]*m[A41] - m[A31]*m[A40];
1238 G4double Det2_34_02 = m[A30]*m[A42] - m[A32]*m[A40];
1239 G4double Det2_34_03 = m[A30]*m[A43] - m[A33]*m[A40];
1240 G4double Det2_34_04 = m[A30]*m[A44] - m[A34]*m[A40];
1241 G4double Det2_34_05 = m[A30]*m[A45] - m[A35]*m[A40];
1242 G4double Det2_34_12 = m[A31]*m[A42] - m[A32]*m[A41];
1243 G4double Det2_34_13 = m[A31]*m[A43] - m[A33]*m[A41];
1244 G4double Det2_34_14 = m[A31]*m[A44] - m[A34]*m[A41];
1245 G4double Det2_34_15 = m[A31]*m[A45] - m[A35]*m[A41];
1246 G4double Det2_34_23 = m[A32]*m[A43] - m[A33]*m[A42];
1247 G4double Det2_34_24 = m[A32]*m[A44] - m[A34]*m[A42];
1248 G4double Det2_34_25 = m[A32]*m[A45] - m[A35]*m[A42];
1249 G4double Det2_34_34 = m[A33]*m[A44] - m[A34]*m[A43];
1250 G4double Det2_34_35 = m[A33]*m[A45] - m[A35]*m[A43];
1251 G4double Det2_34_45 = m[A34]*m[A45] - m[A35]*m[A44];
1252 G4double Det2_35_01 = m[A30]*m[A51] - m[A31]*m[A50];
1253 G4double Det2_35_02 = m[A30]*m[A52] - m[A32]*m[A50];
1254 G4double Det2_35_03 = m[A30]*m[A53] - m[A33]*m[A50];
1255 G4double Det2_35_04 = m[A30]*m[A54] - m[A34]*m[A50];
1256 G4double Det2_35_05 = m[A30]*m[A55] - m[A35]*m[A50];
1257 G4double Det2_35_12 = m[A31]*m[A52] - m[A32]*m[A51];
1258 G4double Det2_35_13 = m[A31]*m[A53] - m[A33]*m[A51];
1259 G4double Det2_35_14 = m[A31]*m[A54] - m[A34]*m[A51];
1260 G4double Det2_35_15 = m[A31]*m[A55] - m[A35]*m[A51];
1261 G4double Det2_35_23 = m[A32]*m[A53] - m[A33]*m[A52];
1262 G4double Det2_35_24 = m[A32]*m[A54] - m[A34]*m[A52];
1263 G4double Det2_35_25 = m[A32]*m[A55] - m[A35]*m[A52];
1264 G4double Det2_35_34 = m[A33]*m[A54] - m[A34]*m[A53];
1265 G4double Det2_35_35 = m[A33]*m[A55] - m[A35]*m[A53];
1266 G4double Det2_35_45 = m[A34]*m[A55] - m[A35]*m[A54];
1267 G4double Det2_45_01 = m[A40]*m[A51] - m[A41]*m[A50];
1268 G4double Det2_45_02 = m[A40]*m[A52] - m[A42]*m[A50];
1269 G4double Det2_45_03 = m[A40]*m[A53] - m[A43]*m[A50];
1270 G4double Det2_45_04 = m[A40]*m[A54] - m[A44]*m[A50];
1271 G4double Det2_45_05 = m[A40]*m[A55] - m[A45]*m[A50];
1272 G4double Det2_45_12 = m[A41]*m[A52] - m[A42]*m[A51];
1273 G4double Det2_45_13 = m[A41]*m[A53] - m[A43]*m[A51];
1274 G4double Det2_45_14 = m[A41]*m[A54] - m[A44]*m[A51];
1275 G4double Det2_45_15 = m[A41]*m[A55] - m[A45]*m[A51];
1276 G4double Det2_45_23 = m[A42]*m[A53] - m[A43]*m[A52];
1277 G4double Det2_45_24 = m[A42]*m[A54] - m[A44]*m[A52];
1278 G4double Det2_45_25 = m[A42]*m[A55] - m[A45]*m[A52];
1279 G4double Det2_45_34 = m[A43]*m[A54] - m[A44]*m[A53];
1280 G4double Det2_45_35 = m[A43]*m[A55] - m[A45]*m[A53];
1281 G4double Det2_45_45 = m[A44]*m[A55] - m[A45]*m[A54];
1282
1283 // Find all NECESSARY 3x3 dets: (80 of them)
1284
1285 G4double Det3_234_012 = m[A20]*Det2_34_12 - m[A21]*Det2_34_02
1286 + m[A22]*Det2_34_01;
1287 G4double Det3_234_013 = m[A20]*Det2_34_13 - m[A21]*Det2_34_03
1288 + m[A23]*Det2_34_01;
1289 G4double Det3_234_014 = m[A20]*Det2_34_14 - m[A21]*Det2_34_04
1290 + m[A24]*Det2_34_01;
1291 G4double Det3_234_015 = m[A20]*Det2_34_15 - m[A21]*Det2_34_05
1292 + m[A25]*Det2_34_01;
1293 G4double Det3_234_023 = m[A20]*Det2_34_23 - m[A22]*Det2_34_03
1294 + m[A23]*Det2_34_02;
1295 G4double Det3_234_024 = m[A20]*Det2_34_24 - m[A22]*Det2_34_04
1296 + m[A24]*Det2_34_02;
1297 G4double Det3_234_025 = m[A20]*Det2_34_25 - m[A22]*Det2_34_05
1298 + m[A25]*Det2_34_02;
1299 G4double Det3_234_034 = m[A20]*Det2_34_34 - m[A23]*Det2_34_04
1300 + m[A24]*Det2_34_03;
1301 G4double Det3_234_035 = m[A20]*Det2_34_35 - m[A23]*Det2_34_05
1302 + m[A25]*Det2_34_03;
1303 G4double Det3_234_045 = m[A20]*Det2_34_45 - m[A24]*Det2_34_05
1304 + m[A25]*Det2_34_04;
1305 G4double Det3_234_123 = m[A21]*Det2_34_23 - m[A22]*Det2_34_13
1306 + m[A23]*Det2_34_12;
1307 G4double Det3_234_124 = m[A21]*Det2_34_24 - m[A22]*Det2_34_14
1308 + m[A24]*Det2_34_12;
1309 G4double Det3_234_125 = m[A21]*Det2_34_25 - m[A22]*Det2_34_15
1310 + m[A25]*Det2_34_12;
1311 G4double Det3_234_134 = m[A21]*Det2_34_34 - m[A23]*Det2_34_14
1312 + m[A24]*Det2_34_13;
1313 G4double Det3_234_135 = m[A21]*Det2_34_35 - m[A23]*Det2_34_15
1314 + m[A25]*Det2_34_13;
1315 G4double Det3_234_145 = m[A21]*Det2_34_45 - m[A24]*Det2_34_15
1316 + m[A25]*Det2_34_14;
1317 G4double Det3_234_234 = m[A22]*Det2_34_34 - m[A23]*Det2_34_24
1318 + m[A24]*Det2_34_23;
1319 G4double Det3_234_235 = m[A22]*Det2_34_35 - m[A23]*Det2_34_25
1320 + m[A25]*Det2_34_23;
1321 G4double Det3_234_245 = m[A22]*Det2_34_45 - m[A24]*Det2_34_25
1322 + m[A25]*Det2_34_24;
1323 G4double Det3_234_345 = m[A23]*Det2_34_45 - m[A24]*Det2_34_35
1324 + m[A25]*Det2_34_34;
1325 G4double Det3_235_012 = m[A20]*Det2_35_12 - m[A21]*Det2_35_02
1326 + m[A22]*Det2_35_01;
1327 G4double Det3_235_013 = m[A20]*Det2_35_13 - m[A21]*Det2_35_03
1328 + m[A23]*Det2_35_01;
1329 G4double Det3_235_014 = m[A20]*Det2_35_14 - m[A21]*Det2_35_04
1330 + m[A24]*Det2_35_01;
1331 G4double Det3_235_015 = m[A20]*Det2_35_15 - m[A21]*Det2_35_05
1332 + m[A25]*Det2_35_01;
1333 G4double Det3_235_023 = m[A20]*Det2_35_23 - m[A22]*Det2_35_03
1334 + m[A23]*Det2_35_02;
1335 G4double Det3_235_024 = m[A20]*Det2_35_24 - m[A22]*Det2_35_04
1336 + m[A24]*Det2_35_02;
1337 G4double Det3_235_025 = m[A20]*Det2_35_25 - m[A22]*Det2_35_05
1338 + m[A25]*Det2_35_02;
1339 G4double Det3_235_034 = m[A20]*Det2_35_34 - m[A23]*Det2_35_04
1340 + m[A24]*Det2_35_03;
1341 G4double Det3_235_035 = m[A20]*Det2_35_35 - m[A23]*Det2_35_05
1342 + m[A25]*Det2_35_03;
1343 G4double Det3_235_045 = m[A20]*Det2_35_45 - m[A24]*Det2_35_05
1344 + m[A25]*Det2_35_04;
1345 G4double Det3_235_123 = m[A21]*Det2_35_23 - m[A22]*Det2_35_13
1346 + m[A23]*Det2_35_12;
1347 G4double Det3_235_124 = m[A21]*Det2_35_24 - m[A22]*Det2_35_14
1348 + m[A24]*Det2_35_12;
1349 G4double Det3_235_125 = m[A21]*Det2_35_25 - m[A22]*Det2_35_15
1350 + m[A25]*Det2_35_12;
1351 G4double Det3_235_134 = m[A21]*Det2_35_34 - m[A23]*Det2_35_14
1352 + m[A24]*Det2_35_13;
1353 G4double Det3_235_135 = m[A21]*Det2_35_35 - m[A23]*Det2_35_15
1354 + m[A25]*Det2_35_13;
1355 G4double Det3_235_145 = m[A21]*Det2_35_45 - m[A24]*Det2_35_15
1356 + m[A25]*Det2_35_14;
1357 G4double Det3_235_234 = m[A22]*Det2_35_34 - m[A23]*Det2_35_24
1358 + m[A24]*Det2_35_23;
1359 G4double Det3_235_235 = m[A22]*Det2_35_35 - m[A23]*Det2_35_25
1360 + m[A25]*Det2_35_23;
1361 G4double Det3_235_245 = m[A22]*Det2_35_45 - m[A24]*Det2_35_25
1362 + m[A25]*Det2_35_24;
1363 G4double Det3_235_345 = m[A23]*Det2_35_45 - m[A24]*Det2_35_35
1364 + m[A25]*Det2_35_34;
1365 G4double Det3_245_012 = m[A20]*Det2_45_12 - m[A21]*Det2_45_02
1366 + m[A22]*Det2_45_01;
1367 G4double Det3_245_013 = m[A20]*Det2_45_13 - m[A21]*Det2_45_03
1368 + m[A23]*Det2_45_01;
1369 G4double Det3_245_014 = m[A20]*Det2_45_14 - m[A21]*Det2_45_04
1370 + m[A24]*Det2_45_01;
1371 G4double Det3_245_015 = m[A20]*Det2_45_15 - m[A21]*Det2_45_05
1372 + m[A25]*Det2_45_01;
1373 G4double Det3_245_023 = m[A20]*Det2_45_23 - m[A22]*Det2_45_03
1374 + m[A23]*Det2_45_02;
1375 G4double Det3_245_024 = m[A20]*Det2_45_24 - m[A22]*Det2_45_04
1376 + m[A24]*Det2_45_02;
1377 G4double Det3_245_025 = m[A20]*Det2_45_25 - m[A22]*Det2_45_05
1378 + m[A25]*Det2_45_02;
1379 G4double Det3_245_034 = m[A20]*Det2_45_34 - m[A23]*Det2_45_04
1380 + m[A24]*Det2_45_03;
1381 G4double Det3_245_035 = m[A20]*Det2_45_35 - m[A23]*Det2_45_05
1382 + m[A25]*Det2_45_03;
1383 G4double Det3_245_045 = m[A20]*Det2_45_45 - m[A24]*Det2_45_05
1384 + m[A25]*Det2_45_04;
1385 G4double Det3_245_123 = m[A21]*Det2_45_23 - m[A22]*Det2_45_13
1386 + m[A23]*Det2_45_12;
1387 G4double Det3_245_124 = m[A21]*Det2_45_24 - m[A22]*Det2_45_14
1388 + m[A24]*Det2_45_12;
1389 G4double Det3_245_125 = m[A21]*Det2_45_25 - m[A22]*Det2_45_15
1390 + m[A25]*Det2_45_12;
1391 G4double Det3_245_134 = m[A21]*Det2_45_34 - m[A23]*Det2_45_14
1392 + m[A24]*Det2_45_13;
1393 G4double Det3_245_135 = m[A21]*Det2_45_35 - m[A23]*Det2_45_15
1394 + m[A25]*Det2_45_13;
1395 G4double Det3_245_145 = m[A21]*Det2_45_45 - m[A24]*Det2_45_15
1396 + m[A25]*Det2_45_14;
1397 G4double Det3_245_234 = m[A22]*Det2_45_34 - m[A23]*Det2_45_24
1398 + m[A24]*Det2_45_23;
1399 G4double Det3_245_235 = m[A22]*Det2_45_35 - m[A23]*Det2_45_25
1400 + m[A25]*Det2_45_23;
1401 G4double Det3_245_245 = m[A22]*Det2_45_45 - m[A24]*Det2_45_25
1402 + m[A25]*Det2_45_24;
1403 G4double Det3_245_345 = m[A23]*Det2_45_45 - m[A24]*Det2_45_35
1404 + m[A25]*Det2_45_34;
1405 G4double Det3_345_012 = m[A30]*Det2_45_12 - m[A31]*Det2_45_02
1406 + m[A32]*Det2_45_01;
1407 G4double Det3_345_013 = m[A30]*Det2_45_13 - m[A31]*Det2_45_03
1408 + m[A33]*Det2_45_01;
1409 G4double Det3_345_014 = m[A30]*Det2_45_14 - m[A31]*Det2_45_04
1410 + m[A34]*Det2_45_01;
1411 G4double Det3_345_015 = m[A30]*Det2_45_15 - m[A31]*Det2_45_05
1412 + m[A35]*Det2_45_01;
1413 G4double Det3_345_023 = m[A30]*Det2_45_23 - m[A32]*Det2_45_03
1414 + m[A33]*Det2_45_02;
1415 G4double Det3_345_024 = m[A30]*Det2_45_24 - m[A32]*Det2_45_04
1416 + m[A34]*Det2_45_02;
1417 G4double Det3_345_025 = m[A30]*Det2_45_25 - m[A32]*Det2_45_05
1418 + m[A35]*Det2_45_02;
1419 G4double Det3_345_034 = m[A30]*Det2_45_34 - m[A33]*Det2_45_04
1420 + m[A34]*Det2_45_03;
1421 G4double Det3_345_035 = m[A30]*Det2_45_35 - m[A33]*Det2_45_05
1422 + m[A35]*Det2_45_03;
1423 G4double Det3_345_045 = m[A30]*Det2_45_45 - m[A34]*Det2_45_05
1424 + m[A35]*Det2_45_04;
1425 G4double Det3_345_123 = m[A31]*Det2_45_23 - m[A32]*Det2_45_13
1426 + m[A33]*Det2_45_12;
1427 G4double Det3_345_124 = m[A31]*Det2_45_24 - m[A32]*Det2_45_14
1428 + m[A34]*Det2_45_12;
1429 G4double Det3_345_125 = m[A31]*Det2_45_25 - m[A32]*Det2_45_15
1430 + m[A35]*Det2_45_12;
1431 G4double Det3_345_134 = m[A31]*Det2_45_34 - m[A33]*Det2_45_14
1432 + m[A34]*Det2_45_13;
1433 G4double Det3_345_135 = m[A31]*Det2_45_35 - m[A33]*Det2_45_15
1434 + m[A35]*Det2_45_13;
1435 G4double Det3_345_145 = m[A31]*Det2_45_45 - m[A34]*Det2_45_15
1436 + m[A35]*Det2_45_14;
1437 G4double Det3_345_234 = m[A32]*Det2_45_34 - m[A33]*Det2_45_24
1438 + m[A34]*Det2_45_23;
1439 G4double Det3_345_235 = m[A32]*Det2_45_35 - m[A33]*Det2_45_25
1440 + m[A35]*Det2_45_23;
1441 G4double Det3_345_245 = m[A32]*Det2_45_45 - m[A34]*Det2_45_25
1442 + m[A35]*Det2_45_24;
1443 G4double Det3_345_345 = m[A33]*Det2_45_45 - m[A34]*Det2_45_35
1444 + m[A35]*Det2_45_34;
1445
1446 // Find all NECESSARY 4x4 dets: (75 of them)
1447
1448 G4double Det4_1234_0123 = m[A10]*Det3_234_123 - m[A11]*Det3_234_023
1449 + m[A12]*Det3_234_013 - m[A13]*Det3_234_012;
1450 G4double Det4_1234_0124 = m[A10]*Det3_234_124 - m[A11]*Det3_234_024
1451 + m[A12]*Det3_234_014 - m[A14]*Det3_234_012;
1452 G4double Det4_1234_0125 = m[A10]*Det3_234_125 - m[A11]*Det3_234_025
1453 + m[A12]*Det3_234_015 - m[A15]*Det3_234_012;
1454 G4double Det4_1234_0134 = m[A10]*Det3_234_134 - m[A11]*Det3_234_034
1455 + m[A13]*Det3_234_014 - m[A14]*Det3_234_013;
1456 G4double Det4_1234_0135 = m[A10]*Det3_234_135 - m[A11]*Det3_234_035
1457 + m[A13]*Det3_234_015 - m[A15]*Det3_234_013;
1458 G4double Det4_1234_0145 = m[A10]*Det3_234_145 - m[A11]*Det3_234_045
1459 + m[A14]*Det3_234_015 - m[A15]*Det3_234_014;
1460 G4double Det4_1234_0234 = m[A10]*Det3_234_234 - m[A12]*Det3_234_034
1461 + m[A13]*Det3_234_024 - m[A14]*Det3_234_023;
1462 G4double Det4_1234_0235 = m[A10]*Det3_234_235 - m[A12]*Det3_234_035
1463 + m[A13]*Det3_234_025 - m[A15]*Det3_234_023;
1464 G4double Det4_1234_0245 = m[A10]*Det3_234_245 - m[A12]*Det3_234_045
1465 + m[A14]*Det3_234_025 - m[A15]*Det3_234_024;
1466 G4double Det4_1234_0345 = m[A10]*Det3_234_345 - m[A13]*Det3_234_045
1467 + m[A14]*Det3_234_035 - m[A15]*Det3_234_034;
1468 G4double Det4_1234_1234 = m[A11]*Det3_234_234 - m[A12]*Det3_234_134
1469 + m[A13]*Det3_234_124 - m[A14]*Det3_234_123;
1470 G4double Det4_1234_1235 = m[A11]*Det3_234_235 - m[A12]*Det3_234_135
1471 + m[A13]*Det3_234_125 - m[A15]*Det3_234_123;
1472 G4double Det4_1234_1245 = m[A11]*Det3_234_245 - m[A12]*Det3_234_145
1473 + m[A14]*Det3_234_125 - m[A15]*Det3_234_124;
1474 G4double Det4_1234_1345 = m[A11]*Det3_234_345 - m[A13]*Det3_234_145
1475 + m[A14]*Det3_234_135 - m[A15]*Det3_234_134;
1476 G4double Det4_1234_2345 = m[A12]*Det3_234_345 - m[A13]*Det3_234_245
1477 + m[A14]*Det3_234_235 - m[A15]*Det3_234_234;
1478 G4double Det4_1235_0123 = m[A10]*Det3_235_123 - m[A11]*Det3_235_023
1479 + m[A12]*Det3_235_013 - m[A13]*Det3_235_012;
1480 G4double Det4_1235_0124 = m[A10]*Det3_235_124 - m[A11]*Det3_235_024
1481 + m[A12]*Det3_235_014 - m[A14]*Det3_235_012;
1482 G4double Det4_1235_0125 = m[A10]*Det3_235_125 - m[A11]*Det3_235_025
1483 + m[A12]*Det3_235_015 - m[A15]*Det3_235_012;
1484 G4double Det4_1235_0134 = m[A10]*Det3_235_134 - m[A11]*Det3_235_034
1485 + m[A13]*Det3_235_014 - m[A14]*Det3_235_013;
1486 G4double Det4_1235_0135 = m[A10]*Det3_235_135 - m[A11]*Det3_235_035
1487 + m[A13]*Det3_235_015 - m[A15]*Det3_235_013;
1488 G4double Det4_1235_0145 = m[A10]*Det3_235_145 - m[A11]*Det3_235_045
1489 + m[A14]*Det3_235_015 - m[A15]*Det3_235_014;
1490 G4double Det4_1235_0234 = m[A10]*Det3_235_234 - m[A12]*Det3_235_034
1491 + m[A13]*Det3_235_024 - m[A14]*Det3_235_023;
1492 G4double Det4_1235_0235 = m[A10]*Det3_235_235 - m[A12]*Det3_235_035
1493 + m[A13]*Det3_235_025 - m[A15]*Det3_235_023;
1494 G4double Det4_1235_0245 = m[A10]*Det3_235_245 - m[A12]*Det3_235_045
1495 + m[A14]*Det3_235_025 - m[A15]*Det3_235_024;
1496 G4double Det4_1235_0345 = m[A10]*Det3_235_345 - m[A13]*Det3_235_045
1497 + m[A14]*Det3_235_035 - m[A15]*Det3_235_034;
1498 G4double Det4_1235_1234 = m[A11]*Det3_235_234 - m[A12]*Det3_235_134
1499 + m[A13]*Det3_235_124 - m[A14]*Det3_235_123;
1500 G4double Det4_1235_1235 = m[A11]*Det3_235_235 - m[A12]*Det3_235_135
1501 + m[A13]*Det3_235_125 - m[A15]*Det3_235_123;
1502 G4double Det4_1235_1245 = m[A11]*Det3_235_245 - m[A12]*Det3_235_145
1503 + m[A14]*Det3_235_125 - m[A15]*Det3_235_124;
1504 G4double Det4_1235_1345 = m[A11]*Det3_235_345 - m[A13]*Det3_235_145
1505 + m[A14]*Det3_235_135 - m[A15]*Det3_235_134;
1506 G4double Det4_1235_2345 = m[A12]*Det3_235_345 - m[A13]*Det3_235_245
1507 + m[A14]*Det3_235_235 - m[A15]*Det3_235_234;
1508 G4double Det4_1245_0123 = m[A10]*Det3_245_123 - m[A11]*Det3_245_023
1509 + m[A12]*Det3_245_013 - m[A13]*Det3_245_012;
1510 G4double Det4_1245_0124 = m[A10]*Det3_245_124 - m[A11]*Det3_245_024
1511 + m[A12]*Det3_245_014 - m[A14]*Det3_245_012;
1512 G4double Det4_1245_0125 = m[A10]*Det3_245_125 - m[A11]*Det3_245_025
1513 + m[A12]*Det3_245_015 - m[A15]*Det3_245_012;
1514 G4double Det4_1245_0134 = m[A10]*Det3_245_134 - m[A11]*Det3_245_034
1515 + m[A13]*Det3_245_014 - m[A14]*Det3_245_013;
1516 G4double Det4_1245_0135 = m[A10]*Det3_245_135 - m[A11]*Det3_245_035
1517 + m[A13]*Det3_245_015 - m[A15]*Det3_245_013;
1518 G4double Det4_1245_0145 = m[A10]*Det3_245_145 - m[A11]*Det3_245_045
1519 + m[A14]*Det3_245_015 - m[A15]*Det3_245_014;
1520 G4double Det4_1245_0234 = m[A10]*Det3_245_234 - m[A12]*Det3_245_034
1521 + m[A13]*Det3_245_024 - m[A14]*Det3_245_023;
1522 G4double Det4_1245_0235 = m[A10]*Det3_245_235 - m[A12]*Det3_245_035
1523 + m[A13]*Det3_245_025 - m[A15]*Det3_245_023;
1524 G4double Det4_1245_0245 = m[A10]*Det3_245_245 - m[A12]*Det3_245_045
1525 + m[A14]*Det3_245_025 - m[A15]*Det3_245_024;
1526 G4double Det4_1245_0345 = m[A10]*Det3_245_345 - m[A13]*Det3_245_045
1527 + m[A14]*Det3_245_035 - m[A15]*Det3_245_034;
1528 G4double Det4_1245_1234 = m[A11]*Det3_245_234 - m[A12]*Det3_245_134
1529 + m[A13]*Det3_245_124 - m[A14]*Det3_245_123;
1530 G4double Det4_1245_1235 = m[A11]*Det3_245_235 - m[A12]*Det3_245_135
1531 + m[A13]*Det3_245_125 - m[A15]*Det3_245_123;
1532 G4double Det4_1245_1245 = m[A11]*Det3_245_245 - m[A12]*Det3_245_145
1533 + m[A14]*Det3_245_125 - m[A15]*Det3_245_124;
1534 G4double Det4_1245_1345 = m[A11]*Det3_245_345 - m[A13]*Det3_245_145
1535 + m[A14]*Det3_245_135 - m[A15]*Det3_245_134;
1536 G4double Det4_1245_2345 = m[A12]*Det3_245_345 - m[A13]*Det3_245_245
1537 + m[A14]*Det3_245_235 - m[A15]*Det3_245_234;
1538 G4double Det4_1345_0123 = m[A10]*Det3_345_123 - m[A11]*Det3_345_023
1539 + m[A12]*Det3_345_013 - m[A13]*Det3_345_012;
1540 G4double Det4_1345_0124 = m[A10]*Det3_345_124 - m[A11]*Det3_345_024
1541 + m[A12]*Det3_345_014 - m[A14]*Det3_345_012;
1542 G4double Det4_1345_0125 = m[A10]*Det3_345_125 - m[A11]*Det3_345_025
1543 + m[A12]*Det3_345_015 - m[A15]*Det3_345_012;
1544 G4double Det4_1345_0134 = m[A10]*Det3_345_134 - m[A11]*Det3_345_034
1545 + m[A13]*Det3_345_014 - m[A14]*Det3_345_013;
1546 G4double Det4_1345_0135 = m[A10]*Det3_345_135 - m[A11]*Det3_345_035
1547 + m[A13]*Det3_345_015 - m[A15]*Det3_345_013;
1548 G4double Det4_1345_0145 = m[A10]*Det3_345_145 - m[A11]*Det3_345_045
1549 + m[A14]*Det3_345_015 - m[A15]*Det3_345_014;
1550 G4double Det4_1345_0234 = m[A10]*Det3_345_234 - m[A12]*Det3_345_034
1551 + m[A13]*Det3_345_024 - m[A14]*Det3_345_023;
1552 G4double Det4_1345_0235 = m[A10]*Det3_345_235 - m[A12]*Det3_345_035
1553 + m[A13]*Det3_345_025 - m[A15]*Det3_345_023;
1554 G4double Det4_1345_0245 = m[A10]*Det3_345_245 - m[A12]*Det3_345_045
1555 + m[A14]*Det3_345_025 - m[A15]*Det3_345_024;
1556 G4double Det4_1345_0345 = m[A10]*Det3_345_345 - m[A13]*Det3_345_045
1557 + m[A14]*Det3_345_035 - m[A15]*Det3_345_034;
1558 G4double Det4_1345_1234 = m[A11]*Det3_345_234 - m[A12]*Det3_345_134
1559 + m[A13]*Det3_345_124 - m[A14]*Det3_345_123;
1560 G4double Det4_1345_1235 = m[A11]*Det3_345_235 - m[A12]*Det3_345_135
1561 + m[A13]*Det3_345_125 - m[A15]*Det3_345_123;
1562 G4double Det4_1345_1245 = m[A11]*Det3_345_245 - m[A12]*Det3_345_145
1563 + m[A14]*Det3_345_125 - m[A15]*Det3_345_124;
1564 G4double Det4_1345_1345 = m[A11]*Det3_345_345 - m[A13]*Det3_345_145
1565 + m[A14]*Det3_345_135 - m[A15]*Det3_345_134;
1566 G4double Det4_1345_2345 = m[A12]*Det3_345_345 - m[A13]*Det3_345_245
1567 + m[A14]*Det3_345_235 - m[A15]*Det3_345_234;
1568 G4double Det4_2345_0123 = m[A20]*Det3_345_123 - m[A21]*Det3_345_023
1569 + m[A22]*Det3_345_013 - m[A23]*Det3_345_012;
1570 G4double Det4_2345_0124 = m[A20]*Det3_345_124 - m[A21]*Det3_345_024
1571 + m[A22]*Det3_345_014 - m[A24]*Det3_345_012;
1572 G4double Det4_2345_0125 = m[A20]*Det3_345_125 - m[A21]*Det3_345_025
1573 + m[A22]*Det3_345_015 - m[A25]*Det3_345_012;
1574 G4double Det4_2345_0134 = m[A20]*Det3_345_134 - m[A21]*Det3_345_034
1575 + m[A23]*Det3_345_014 - m[A24]*Det3_345_013;
1576 G4double Det4_2345_0135 = m[A20]*Det3_345_135 - m[A21]*Det3_345_035
1577 + m[A23]*Det3_345_015 - m[A25]*Det3_345_013;
1578 G4double Det4_2345_0145 = m[A20]*Det3_345_145 - m[A21]*Det3_345_045
1579 + m[A24]*Det3_345_015 - m[A25]*Det3_345_014;
1580 G4double Det4_2345_0234 = m[A20]*Det3_345_234 - m[A22]*Det3_345_034
1581 + m[A23]*Det3_345_024 - m[A24]*Det3_345_023;
1582 G4double Det4_2345_0235 = m[A20]*Det3_345_235 - m[A22]*Det3_345_035
1583 + m[A23]*Det3_345_025 - m[A25]*Det3_345_023;
1584 G4double Det4_2345_0245 = m[A20]*Det3_345_245 - m[A22]*Det3_345_045
1585 + m[A24]*Det3_345_025 - m[A25]*Det3_345_024;
1586 G4double Det4_2345_0345 = m[A20]*Det3_345_345 - m[A23]*Det3_345_045
1587 + m[A24]*Det3_345_035 - m[A25]*Det3_345_034;
1588 G4double Det4_2345_1234 = m[A21]*Det3_345_234 - m[A22]*Det3_345_134
1589 + m[A23]*Det3_345_124 - m[A24]*Det3_345_123;
1590 G4double Det4_2345_1235 = m[A21]*Det3_345_235 - m[A22]*Det3_345_135
1591 + m[A23]*Det3_345_125 - m[A25]*Det3_345_123;
1592 G4double Det4_2345_1245 = m[A21]*Det3_345_245 - m[A22]*Det3_345_145
1593 + m[A24]*Det3_345_125 - m[A25]*Det3_345_124;
1594 G4double Det4_2345_1345 = m[A21]*Det3_345_345 - m[A23]*Det3_345_145
1595 + m[A24]*Det3_345_135 - m[A25]*Det3_345_134;
1596 G4double Det4_2345_2345 = m[A22]*Det3_345_345 - m[A23]*Det3_345_245
1597 + m[A24]*Det3_345_235 - m[A25]*Det3_345_234;
1598
1599 // Find all NECESSARY 5x5 dets: (36 of them)
1600
1601 G4double Det5_01234_01234 = m[A00]*Det4_1234_1234 - m[A01]*Det4_1234_0234
1602 + m[A02]*Det4_1234_0134 - m[A03]*Det4_1234_0124 + m[A04]*Det4_1234_0123;
1603 G4double Det5_01234_01235 = m[A00]*Det4_1234_1235 - m[A01]*Det4_1234_0235
1604 + m[A02]*Det4_1234_0135 - m[A03]*Det4_1234_0125 + m[A05]*Det4_1234_0123;
1605 G4double Det5_01234_01245 = m[A00]*Det4_1234_1245 - m[A01]*Det4_1234_0245
1606 + m[A02]*Det4_1234_0145 - m[A04]*Det4_1234_0125 + m[A05]*Det4_1234_0124;
1607 G4double Det5_01234_01345 = m[A00]*Det4_1234_1345 - m[A01]*Det4_1234_0345
1608 + m[A03]*Det4_1234_0145 - m[A04]*Det4_1234_0135 + m[A05]*Det4_1234_0134;
1609 G4double Det5_01234_02345 = m[A00]*Det4_1234_2345 - m[A02]*Det4_1234_0345
1610 + m[A03]*Det4_1234_0245 - m[A04]*Det4_1234_0235 + m[A05]*Det4_1234_0234;
1611 G4double Det5_01234_12345 = m[A01]*Det4_1234_2345 - m[A02]*Det4_1234_1345
1612 + m[A03]*Det4_1234_1245 - m[A04]*Det4_1234_1235 + m[A05]*Det4_1234_1234;
1613 G4double Det5_01235_01234 = m[A00]*Det4_1235_1234 - m[A01]*Det4_1235_0234
1614 + m[A02]*Det4_1235_0134 - m[A03]*Det4_1235_0124 + m[A04]*Det4_1235_0123;
1615 G4double Det5_01235_01235 = m[A00]*Det4_1235_1235 - m[A01]*Det4_1235_0235
1616 + m[A02]*Det4_1235_0135 - m[A03]*Det4_1235_0125 + m[A05]*Det4_1235_0123;
1617 G4double Det5_01235_01245 = m[A00]*Det4_1235_1245 - m[A01]*Det4_1235_0245
1618 + m[A02]*Det4_1235_0145 - m[A04]*Det4_1235_0125 + m[A05]*Det4_1235_0124;
1619 G4double Det5_01235_01345 = m[A00]*Det4_1235_1345 - m[A01]*Det4_1235_0345
1620 + m[A03]*Det4_1235_0145 - m[A04]*Det4_1235_0135 + m[A05]*Det4_1235_0134;
1621 G4double Det5_01235_02345 = m[A00]*Det4_1235_2345 - m[A02]*Det4_1235_0345
1622 + m[A03]*Det4_1235_0245 - m[A04]*Det4_1235_0235 + m[A05]*Det4_1235_0234;
1623 G4double Det5_01235_12345 = m[A01]*Det4_1235_2345 - m[A02]*Det4_1235_1345
1624 + m[A03]*Det4_1235_1245 - m[A04]*Det4_1235_1235 + m[A05]*Det4_1235_1234;
1625 G4double Det5_01245_01234 = m[A00]*Det4_1245_1234 - m[A01]*Det4_1245_0234
1626 + m[A02]*Det4_1245_0134 - m[A03]*Det4_1245_0124 + m[A04]*Det4_1245_0123;
1627 G4double Det5_01245_01235 = m[A00]*Det4_1245_1235 - m[A01]*Det4_1245_0235
1628 + m[A02]*Det4_1245_0135 - m[A03]*Det4_1245_0125 + m[A05]*Det4_1245_0123;
1629 G4double Det5_01245_01245 = m[A00]*Det4_1245_1245 - m[A01]*Det4_1245_0245
1630 + m[A02]*Det4_1245_0145 - m[A04]*Det4_1245_0125 + m[A05]*Det4_1245_0124;
1631 G4double Det5_01245_01345 = m[A00]*Det4_1245_1345 - m[A01]*Det4_1245_0345
1632 + m[A03]*Det4_1245_0145 - m[A04]*Det4_1245_0135 + m[A05]*Det4_1245_0134;
1633 G4double Det5_01245_02345 = m[A00]*Det4_1245_2345 - m[A02]*Det4_1245_0345
1634 + m[A03]*Det4_1245_0245 - m[A04]*Det4_1245_0235 + m[A05]*Det4_1245_0234;
1635 G4double Det5_01245_12345 = m[A01]*Det4_1245_2345 - m[A02]*Det4_1245_1345
1636 + m[A03]*Det4_1245_1245 - m[A04]*Det4_1245_1235 + m[A05]*Det4_1245_1234;
1637 G4double Det5_01345_01234 = m[A00]*Det4_1345_1234 - m[A01]*Det4_1345_0234
1638 + m[A02]*Det4_1345_0134 - m[A03]*Det4_1345_0124 + m[A04]*Det4_1345_0123;
1639 G4double Det5_01345_01235 = m[A00]*Det4_1345_1235 - m[A01]*Det4_1345_0235
1640 + m[A02]*Det4_1345_0135 - m[A03]*Det4_1345_0125 + m[A05]*Det4_1345_0123;
1641 G4double Det5_01345_01245 = m[A00]*Det4_1345_1245 - m[A01]*Det4_1345_0245
1642 + m[A02]*Det4_1345_0145 - m[A04]*Det4_1345_0125 + m[A05]*Det4_1345_0124;
1643 G4double Det5_01345_01345 = m[A00]*Det4_1345_1345 - m[A01]*Det4_1345_0345
1644 + m[A03]*Det4_1345_0145 - m[A04]*Det4_1345_0135 + m[A05]*Det4_1345_0134;
1645 G4double Det5_01345_02345 = m[A00]*Det4_1345_2345 - m[A02]*Det4_1345_0345
1646 + m[A03]*Det4_1345_0245 - m[A04]*Det4_1345_0235 + m[A05]*Det4_1345_0234;
1647 G4double Det5_01345_12345 = m[A01]*Det4_1345_2345 - m[A02]*Det4_1345_1345
1648 + m[A03]*Det4_1345_1245 - m[A04]*Det4_1345_1235 + m[A05]*Det4_1345_1234; //
1649 G4double Det5_02345_01234 = m[A00]*Det4_2345_1234 - m[A01]*Det4_2345_0234
1650 + m[A02]*Det4_2345_0134 - m[A03]*Det4_2345_0124 + m[A04]*Det4_2345_0123;
1651 G4double Det5_02345_01235 = m[A00]*Det4_2345_1235 - m[A01]*Det4_2345_0235
1652 + m[A02]*Det4_2345_0135 - m[A03]*Det4_2345_0125 + m[A05]*Det4_2345_0123;
1653 G4double Det5_02345_01245 = m[A00]*Det4_2345_1245 - m[A01]*Det4_2345_0245
1654 + m[A02]*Det4_2345_0145 - m[A04]*Det4_2345_0125 + m[A05]*Det4_2345_0124;
1655 G4double Det5_02345_01345 = m[A00]*Det4_2345_1345 - m[A01]*Det4_2345_0345
1656 + m[A03]*Det4_2345_0145 - m[A04]*Det4_2345_0135 + m[A05]*Det4_2345_0134;
1657 G4double Det5_02345_02345 = m[A00]*Det4_2345_2345 - m[A02]*Det4_2345_0345
1658 + m[A03]*Det4_2345_0245 - m[A04]*Det4_2345_0235 + m[A05]*Det4_2345_0234;
1659 G4double Det5_02345_12345 = m[A01]*Det4_2345_2345 - m[A02]*Det4_2345_1345
1660 + m[A03]*Det4_2345_1245 - m[A04]*Det4_2345_1235 + m[A05]*Det4_2345_1234;
1661 G4double Det5_12345_01234 = m[A10]*Det4_2345_1234 - m[A11]*Det4_2345_0234
1662 + m[A12]*Det4_2345_0134 - m[A13]*Det4_2345_0124 + m[A14]*Det4_2345_0123;
1663 G4double Det5_12345_01235 = m[A10]*Det4_2345_1235 - m[A11]*Det4_2345_0235
1664 + m[A12]*Det4_2345_0135 - m[A13]*Det4_2345_0125 + m[A15]*Det4_2345_0123;
1665 G4double Det5_12345_01245 = m[A10]*Det4_2345_1245 - m[A11]*Det4_2345_0245
1666 + m[A12]*Det4_2345_0145 - m[A14]*Det4_2345_0125 + m[A15]*Det4_2345_0124;
1667 G4double Det5_12345_01345 = m[A10]*Det4_2345_1345 - m[A11]*Det4_2345_0345
1668 + m[A13]*Det4_2345_0145 - m[A14]*Det4_2345_0135 + m[A15]*Det4_2345_0134;
1669 G4double Det5_12345_02345 = m[A10]*Det4_2345_2345 - m[A12]*Det4_2345_0345
1670 + m[A13]*Det4_2345_0245 - m[A14]*Det4_2345_0235 + m[A15]*Det4_2345_0234;
1671 G4double Det5_12345_12345 = m[A11]*Det4_2345_2345 - m[A12]*Det4_2345_1345
1672 + m[A13]*Det4_2345_1245 - m[A14]*Det4_2345_1235 + m[A15]*Det4_2345_1234;
1673
1674 // Find the determinant
1675
1676 G4double det = m[A00]*Det5_12345_12345
1677 - m[A01]*Det5_12345_02345
1678 + m[A02]*Det5_12345_01345
1679 - m[A03]*Det5_12345_01245
1680 + m[A04]*Det5_12345_01235
1681 - m[A05]*Det5_12345_01234;
1682
1683 if ( det == 0 )
1684 {
1685 ifail = 1;
1686 return;
1687 }
1688
1689 G4double oneOverDet = 1.0/det;
1690 G4double mn1OverDet = - oneOverDet;
1691
1692 m[A00] = Det5_12345_12345*oneOverDet;
1693 m[A01] = Det5_02345_12345*mn1OverDet;
1694 m[A02] = Det5_01345_12345*oneOverDet;
1695 m[A03] = Det5_01245_12345*mn1OverDet;
1696 m[A04] = Det5_01235_12345*oneOverDet;
1697 m[A05] = Det5_01234_12345*mn1OverDet;
1698
1699 m[A10] = Det5_12345_02345*mn1OverDet;
1700 m[A11] = Det5_02345_02345*oneOverDet;
1701 m[A12] = Det5_01345_02345*mn1OverDet;
1702 m[A13] = Det5_01245_02345*oneOverDet;
1703 m[A14] = Det5_01235_02345*mn1OverDet;
1704 m[A15] = Det5_01234_02345*oneOverDet;
1705
1706 m[A20] = Det5_12345_01345*oneOverDet;
1707 m[A21] = Det5_02345_01345*mn1OverDet;
1708 m[A22] = Det5_01345_01345*oneOverDet;
1709 m[A23] = Det5_01245_01345*mn1OverDet;
1710 m[A24] = Det5_01235_01345*oneOverDet;
1711 m[A25] = Det5_01234_01345*mn1OverDet;
1712
1713 m[A30] = Det5_12345_01245*mn1OverDet;
1714 m[A31] = Det5_02345_01245*oneOverDet;
1715 m[A32] = Det5_01345_01245*mn1OverDet;
1716 m[A33] = Det5_01245_01245*oneOverDet;
1717 m[A34] = Det5_01235_01245*mn1OverDet;
1718 m[A35] = Det5_01234_01245*oneOverDet;
1719
1720 m[A40] = Det5_12345_01235*oneOverDet;
1721 m[A41] = Det5_02345_01235*mn1OverDet;
1722 m[A42] = Det5_01345_01235*oneOverDet;
1723 m[A43] = Det5_01245_01235*mn1OverDet;
1724 m[A44] = Det5_01235_01235*oneOverDet;
1725 m[A45] = Det5_01234_01235*mn1OverDet;
1726
1727 m[A50] = Det5_12345_01234*mn1OverDet;
1728 m[A51] = Det5_02345_01234*oneOverDet;
1729 m[A52] = Det5_01345_01234*mn1OverDet;
1730 m[A53] = Det5_01245_01234*oneOverDet;
1731 m[A54] = Det5_01235_01234*mn1OverDet;
1732 m[A55] = Det5_01234_01234*oneOverDet;
1733
1734 return;
1735}
Note: See TracBrowser for help on using the repository browser.