| 1299 | */ |
| 1300 | template<typename typ> |
| 1301 | static inline int |
| 1302 | init_evd(EIGH_PARAMS_t<typ>* params, char JOBZ, char UPLO, |
| 1303 | fortran_int N, scalar_trait) |
| 1304 | { |
| 1305 | npy_uint8 *mem_buff = NULL; |
| 1306 | npy_uint8 *mem_buff2 = NULL; |
| 1307 | fortran_int lwork; |
| 1308 | fortran_int liwork; |
| 1309 | npy_uint8 *a, *w, *work, *iwork; |
| 1310 | size_t safe_N = N; |
| 1311 | size_t alloc_size = safe_N * (safe_N + 1) * sizeof(typ); |
| 1312 | fortran_int lda = fortran_int_max(N, 1); |
| 1313 | |
| 1314 | mem_buff = (npy_uint8 *)malloc(alloc_size); |
| 1315 | |
| 1316 | if (!mem_buff) { |
| 1317 | goto error; |
| 1318 | } |
| 1319 | a = mem_buff; |
| 1320 | w = mem_buff + safe_N * safe_N * sizeof(typ); |
| 1321 | |
| 1322 | params->A = (typ*)a; |
| 1323 | params->W = (typ*)w; |
| 1324 | params->RWORK = NULL; /* unused */ |
| 1325 | params->N = N; |
| 1326 | params->LRWORK = 0; /* unused */ |
| 1327 | params->JOBZ = JOBZ; |
| 1328 | params->UPLO = UPLO; |
| 1329 | params->LDA = lda; |
| 1330 | |
| 1331 | /* Work size query */ |
| 1332 | { |
| 1333 | typ query_work_size; |
| 1334 | fortran_int query_iwork_size; |
| 1335 | |
| 1336 | params->LWORK = -1; |
| 1337 | params->LIWORK = -1; |
| 1338 | params->WORK = &query_work_size; |
| 1339 | params->IWORK = &query_iwork_size; |
| 1340 | |
| 1341 | if (call_evd(params) != 0) { |
| 1342 | goto error; |
| 1343 | } |
| 1344 | |
| 1345 | lwork = (fortran_int)query_work_size; |
| 1346 | liwork = query_iwork_size; |
| 1347 | } |
| 1348 | |
| 1349 | mem_buff2 = (npy_uint8 *)malloc(lwork*sizeof(typ) + liwork*sizeof(fortran_int)); |
| 1350 | if (!mem_buff2) { |
| 1351 | goto error; |
| 1352 | } |
| 1353 | |
| 1354 | work = mem_buff2; |
| 1355 | iwork = mem_buff2 + lwork*sizeof(typ); |
| 1356 | |
| 1357 | params->LWORK = lwork; |
| 1358 | params->WORK = (typ*)work; |
no test coverage detected