FEDRA emulsion software from the OPERA Collaboration
VtSymMatrix.hh File Reference
#include "VtSqMatrix.hh"
Include dependency graph for VtSymMatrix.hh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  MATRIX::VtSymMatrix
 

Namespaces

namespace  MATRIX
 

Functions

void Dsfact1 (int *idim, double *a, int *n, int *ifail, double *det, int *jfail)
 
void Dsinv1 (int *idim, double *a, int *n, int *ifail)
 
std::ostream & MATRIX::operator<< (std::ostream &os, const VtSymMatrix &t)
 

Function Documentation

◆ Dsfact1()

void Dsfact1 ( int *  idim,
double *  a,
int *  n,
int *  ifail,
double *  det,
int *  jfail 
)
44{
45 /* Local variables */
46 static unsigned int i, j, l;
47 *ifail = 0;
48 *jfail = 0;
49
50 /* Function Body */
51 if (*idim < *n || *n <= 0) {
52 *ifail= -1;
53 return;
54 }
55
56
57 /* Parameter adjustments */
58 a -= *idim + 1;
59
60 /* sfactd.inc */
61 *det = 1.;
62 for (j = 1; j <= (unsigned int)(*n); ++j) {
63 const unsigned int ji = j * (*idim);
64 const unsigned int jj = j + ji;
65
66 if (a[jj] <= 0.) {
67 *det = 0.;
68 *ifail = -1;
69 return;
70 }
71
72 const unsigned int jp1 = j + 1;
73 const unsigned int jpi = jp1 * (*idim);
74
75 (*det) *= a[jj];
76 a[jj] = 1. / a[jj];
77
78 for (l = jp1; l <= (unsigned int)(*n); ++l) {
79 a[j + l * (*idim)] = a[jj] * a[l + ji];
80
81 const unsigned int lj = l + jpi;
82
83 for (i = 1; i <= j; ++i) {
84 a[lj] -= a[l + i * (*idim)] * a[i + jpi];
85 } // for i
86 } // for l
87 } // for j
88
89 return;
90} // end of Dsfact1
void a()
Definition: check_aligned.C:59

◆ Dsinv1()

void Dsinv1 ( int *  idim,
double *  a,
int *  n,
int *  ifail 
)
92 {
93
94 /* Local variables */
95 static int i, j, k, l;
96 static double s31, s32;
97 static int jm1, jp1;
98 *ifail = 0;
99
100 /* Parameter adjustments */
101 a -= *idim + 1;
102
103 /* Function Body */
104 if (*idim < *n || *n <= 1) {
105 *ifail = -1;
106 return;
107 }
108
109 /* sfact.inc */
110 for (j = 1; j <= *n; ++j) {
111 const int ja = j * (*idim);
112 const int jj = j + ja;
113 const int ja1 = ja + (*idim);
114
115 if (a[jj] <= 0.) { *ifail = -1; return; }
116 a[jj] = 1. / a[jj];
117 if (j == *n) { break; }
118
119 for (l = j + 1; l <= *n; ++l) {
120 a[j + l * (*idim)] = a[jj] * a[l + ja];
121 const int lj = l + ja1;
122 for (i = 1; i <= j; ++i) {
123 a[lj] -= a[l + i * (*idim)] * a[i + ja1];
124 }
125 }
126 }
127
128 /* sfinv.inc */
129 // idim << 1 is equal to idim * 2
130 // compiler will compute the arguments!
131 a[(*idim << 1) + 1] = -a[(*idim << 1) + 1];
132 a[*idim + 2] = a[(*idim << 1) + 1] * a[(*idim << 1) + 2];
133
134 if(*n > 2) {
135
136 for (j = 3; j <= *n; ++j) {
137 const int jm2 = j - 2;
138 const int ja = j * (*idim);
139 const int jj = j + ja;
140 const int j1 = j - 1 + ja;
141
142 for (k = 1; k <= jm2; ++k) {
143 s31 = a[k + ja];
144
145 for (i = k; i <= jm2; ++i) {
146 s31 += a[k + (i + 1) * (*idim)] * a[i + 1 + ja];
147 } // for i
148 a[k + ja] = -s31;
149 a[j + k * (*idim)] = -s31 * a[jj];
150 } // for k
151 a[j1] *= -1;
152 // a[j1] = -a[j1];
153 a[jj - (*idim)] = a[j1] * a[jj];
154 } // for j
155 } // if (*n>2)
156
157 j = 1;
158 do {
159 const int jad = j * (*idim);
160 const int jj = j + jad;
161
162 jp1 = j + 1;
163 for (i = jp1; i <= *n; ++i) {
164 a[jj] += a[j + i * (*idim)] * a[i + jad];
165 } // for i
166
167 jm1 = j;
168 j = jp1;
169 const int ja = j * (*idim);
170
171 for (k = 1; k <= jm1; ++k) {
172 s32 = 0.;
173 for (i = j; i <= *n; ++i) {
174 s32 += a[k + i * (*idim)] * a[i + ja];
175 } // for i
176 a[k + ja] = a[j + k * (*idim)] = s32;
177 } // for k
178 } while(j < *n);
179
180 return;
181} // end of Dsinv1