26 #include "solvers/linear_matrix_solver.h"
39 int i, imax = 0, j, k;
40 double big, dum, sum, temp;
41 double *vv =
new double[n];
44 for (i = 0; i < n; i++)
47 for (j = 0; j < n; j++)
48 if((temp = fabs(a[i][j])) > big)
57 for (j = 0; j < n; j++)
59 for (i = 0; i < j; i++)
62 for (k = 0; k < i; k++) sum -= a[i][k]*a[k][j];
66 for (i = j; i < n; i++)
69 for (k = 0; k < j; k++) sum -= a[i][k]*a[k][j];
71 if((dum = vv[i]*fabs(sum)) >= big)
79 for (k = 0; k < n; k++)
89 if(a[j][j] == 0.0) a[j][j] = 1.0e-20;
92 dum = 1.0 / (a[j][j]);
93 for (i = j + 1; i < n; i++) a[i][j] *= dum;
102 for (i = 0; i < n; i++)
104 for (j = i; j < n; j++)
106 double sum = a[i][j];
108 while (--k >= 0) sum -= a[i][k] * a[j][k];
113 else p[i] = sqrt(sum);
115 else a[j][i] = sum / p[i];
120 template<
typename Scalar>
130 template<
typename Scalar>
140 template<
typename Scalar>
145 for (
unsigned int i = 0; i < this->size; i++)
152 template<
typename Scalar>
157 pages =
new Page *[n];
158 memset(pages, 0, n *
sizeof(
Page *));
161 template<
typename Scalar>
164 if(pages[col] == NULL || pages[col]->count >= PAGE_SIZE)
168 new_page->
next = pages[col];
169 pages[col] = new_page;
171 pages[col]->
idx[pages[col]->count++] = row;
174 template<
typename Scalar>
181 memcpy(end, page->
idx,
sizeof(
int) * page->
count);
191 for (
int *p = buffer, last = -1; p < end; p++)
if(*p != last) *q++= last = *p;
196 template<
typename Scalar>
200 for (
unsigned int i = 0; i < this->size; i++)
201 for (
Page *page = pages[i]; page != NULL; page = page->
next)
202 total += page->count;
207 template<
typename Scalar>
212 case Hermes::SOLVER_AMESOS:
214 #if defined HAVE_AMESOS && defined HAVE_EPETRA
215 return new EpetraMatrix<Scalar>;
221 case Hermes::SOLVER_AZTECOO:
223 #if defined HAVE_AZTECOO && defined HAVE_EPETRA
224 return new EpetraMatrix<Scalar>;
230 case Hermes::SOLVER_MUMPS:
233 return new MumpsMatrix<Scalar>;
239 case Hermes::SOLVER_PETSC:
242 return new PetscMatrix<Scalar>;
248 case Hermes::SOLVER_UMFPACK:
251 return new UMFPackMatrix<Scalar>;
257 case Hermes::SOLVER_SUPERLU:
260 return new SuperLUMatrix<Scalar>;
272 template<
typename Scalar>
277 case Hermes::SOLVER_AMESOS:
279 #if defined HAVE_AMESOS && defined HAVE_EPETRA
280 return new EpetraVector<Scalar>;
286 case Hermes::SOLVER_AZTECOO:
288 #if defined HAVE_AZTECOO && defined HAVE_EPETRA
289 return new EpetraVector<Scalar>;
295 case Hermes::SOLVER_MUMPS:
298 return new MumpsVector<Scalar>;
304 case Hermes::SOLVER_PETSC:
307 return new PetscVector<Scalar>;
313 case Hermes::SOLVER_UMFPACK:
316 return new UMFPackVector<Scalar>;
322 case Hermes::SOLVER_SUPERLU:
325 return new SuperLUVector<Scalar>;