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

Namespaces

 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)
 

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