| 3319 | } |
| 3320 | |
| 3321 | static inline int |
| 3322 | init_gqr_common(GQR_PARAMS_t<fortran_doublereal> *params, |
| 3323 | fortran_int m, |
| 3324 | fortran_int n, |
| 3325 | fortran_int mc) |
| 3326 | { |
| 3327 | using ftyp = fortran_doublereal; |
| 3328 | npy_uint8 *mem_buff = NULL; |
| 3329 | npy_uint8 *mem_buff2 = NULL; |
| 3330 | npy_uint8 *a, *q, *tau, *work; |
| 3331 | fortran_int min_m_n = fortran_int_min(m, n); |
| 3332 | size_t safe_mc = mc; |
| 3333 | size_t safe_min_m_n = min_m_n; |
| 3334 | size_t safe_m = m; |
| 3335 | size_t safe_n = n; |
| 3336 | size_t a_size = safe_m * safe_n * sizeof(ftyp); |
| 3337 | size_t q_size = safe_m * safe_mc * sizeof(ftyp); |
| 3338 | size_t tau_size = safe_min_m_n * sizeof(ftyp); |
| 3339 | |
| 3340 | fortran_int work_count; |
| 3341 | size_t work_size; |
| 3342 | fortran_int lda = fortran_int_max(1, m); |
| 3343 | |
| 3344 | mem_buff = (npy_uint8 *)malloc(q_size + tau_size + a_size); |
| 3345 | |
| 3346 | if (!mem_buff) |
| 3347 | goto error; |
| 3348 | |
| 3349 | q = mem_buff; |
| 3350 | tau = q + q_size; |
| 3351 | a = tau + tau_size; |
| 3352 | |
| 3353 | |
| 3354 | params->M = m; |
| 3355 | params->MC = mc; |
| 3356 | params->MN = min_m_n; |
| 3357 | params->A = a; |
| 3358 | params->Q = (ftyp*)q; |
| 3359 | params->TAU = (ftyp*)tau; |
| 3360 | params->LDA = lda; |
| 3361 | |
| 3362 | { |
| 3363 | /* compute optimal work size */ |
| 3364 | ftyp work_size_query; |
| 3365 | |
| 3366 | params->WORK = &work_size_query; |
| 3367 | params->LWORK = -1; |
| 3368 | |
| 3369 | if (call_gqr(params) != 0) |
| 3370 | goto error; |
| 3371 | |
| 3372 | work_count = (fortran_int) *(ftyp*) params->WORK; |
| 3373 | |
| 3374 | } |
| 3375 | |
| 3376 | params->LWORK = fortran_int_max(fortran_int_max(1, n), work_count); |
| 3377 | |
| 3378 | work_size = (size_t) params->LWORK * sizeof(ftyp); |
no test coverage detected