Macaulay2 Engine
Loading...
Searching...
No Matches

◆ solve_via_lapack()

bool solve_via_lapack ( int size,
complex * A,
int bsize,
complex * b,
complex * x )

Definition at line 1165 of file NAG.cpp.

1171{
1172 bool ret = true;
1173 int info;
1174
1175 int* permutation = newarray_atomic(int, size);
1176 complex* At = newarray_atomic(complex, size * size);
1177 int i, j;
1178 for (i = 0; i < size; i++)
1179 for (j = 0; j < size; j++) // transpose the matrix: lapack solves A^t x = b
1180 *(At + i * size + j) = *(A + j * size + i);
1181 double* copyA = (double*)At;
1183 double* copyb = (double*)x; // result is stored in copyb
1184
1185 /*
1186 printf("-----------(solve)-----------------------------------\ncopyA:\n");
1187 for (i=0; i<size*size; i++)
1188 printf("(%lf %lf) ", *(copyA+2*i), *(copyA+2*i+1));
1189 printf("\nb:\n");
1190 for (i=0; i<size; i++)
1191 printf("(%lf %lf) ", *(copyb+2*i), *(copyb+2*i+1));
1192 */
1193 zgesv_(&size, &bsize, copyA, &size, permutation, copyb, &size, &info);
1194 /*
1195 printf("\nx = b:\n");
1196 for (i=0; i<size; i++)
1197 printf("(%lf %lf) ", *(copyb+2*i), *(copyb+2*i+1));
1198 printf("\n");
1199 */
1200 if (info > 0)
1201 {
1202 ERROR("according to zgesv, matrix is singular");
1203 ret = false;
1204 }
1205 else if (info < 0)
1206 {
1207 ERROR("argument passed to zgesv had an illegal value");
1208 ret = false;
1209 }
1210
1211 freemem(permutation);
1212 freemem(At);
1213
1214 return ret;
1215}
void copy_complex_array(int n, const typename Field::element_type *a, typename Field::element_type *b)
Definition NAG.hpp:381
int zgesv_(int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info)
void freemem(void *s)
Definition m2-mem.cpp:103
const int ERROR
Definition m2-mem.cpp:55
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
volatile int x

References copy_complex_array(), ERROR, freemem(), newarray_atomic, x, and zgesv_().