| 3729 | |
| 3730 | template<typename ftyp> |
| 3731 | static inline int |
| 3732 | init_gelsd(GELSD_PARAMS_t<ftyp> *params, |
| 3733 | fortran_int m, |
| 3734 | fortran_int n, |
| 3735 | fortran_int nrhs, |
| 3736 | scalar_trait) |
| 3737 | { |
| 3738 | npy_uint8 *mem_buff = NULL; |
| 3739 | npy_uint8 *mem_buff2 = NULL; |
| 3740 | npy_uint8 *a, *b, *s, *work, *iwork; |
| 3741 | fortran_int min_m_n = fortran_int_min(m, n); |
| 3742 | fortran_int max_m_n = fortran_int_max(m, n); |
| 3743 | size_t safe_min_m_n = min_m_n; |
| 3744 | size_t safe_max_m_n = max_m_n; |
| 3745 | size_t safe_m = m; |
| 3746 | size_t safe_n = n; |
| 3747 | size_t safe_nrhs = nrhs; |
| 3748 | |
| 3749 | size_t a_size = safe_m * safe_n * sizeof(ftyp); |
| 3750 | size_t b_size = safe_max_m_n * safe_nrhs * sizeof(ftyp); |
| 3751 | size_t s_size = safe_min_m_n * sizeof(ftyp); |
| 3752 | |
| 3753 | fortran_int work_count; |
| 3754 | size_t work_size; |
| 3755 | size_t iwork_size; |
| 3756 | fortran_int lda = fortran_int_max(1, m); |
| 3757 | fortran_int ldb = fortran_int_max(1, fortran_int_max(m,n)); |
| 3758 | |
| 3759 | size_t msize = a_size + b_size + s_size; |
| 3760 | mem_buff = (npy_uint8 *)malloc(msize != 0 ? msize : 1); |
| 3761 | |
| 3762 | if (!mem_buff) { |
| 3763 | goto no_memory; |
| 3764 | } |
| 3765 | a = mem_buff; |
| 3766 | b = a + a_size; |
| 3767 | s = b + b_size; |
| 3768 | |
| 3769 | params->M = m; |
| 3770 | params->N = n; |
| 3771 | params->NRHS = nrhs; |
| 3772 | params->A = (ftyp*)a; |
| 3773 | params->B = (ftyp*)b; |
| 3774 | params->S = (ftyp*)s; |
| 3775 | params->LDA = lda; |
| 3776 | params->LDB = ldb; |
| 3777 | |
| 3778 | { |
| 3779 | /* compute optimal work size */ |
| 3780 | ftyp work_size_query; |
| 3781 | fortran_int iwork_size_query; |
| 3782 | |
| 3783 | params->WORK = &work_size_query; |
| 3784 | params->IWORK = &iwork_size_query; |
| 3785 | params->RWORK = NULL; |
| 3786 | params->LWORK = -1; |
| 3787 | |
| 3788 | if (call_gelsd(params) != 0) { |
no test coverage detected