| 2641 | |
| 2642 | template<typename ftyp> |
| 2643 | static inline int |
| 2644 | init_gesdd(GESDD_PARAMS_t<ftyp> *params, |
| 2645 | char jobz, |
| 2646 | fortran_int m, |
| 2647 | fortran_int n, scalar_trait) |
| 2648 | { |
| 2649 | npy_uint8 *mem_buff = NULL; |
| 2650 | npy_uint8 *mem_buff2 = NULL; |
| 2651 | npy_uint8 *a, *s, *u, *vt, *work, *iwork; |
| 2652 | size_t safe_m = m; |
| 2653 | size_t safe_n = n; |
| 2654 | size_t a_size = safe_m * safe_n * sizeof(ftyp); |
| 2655 | fortran_int min_m_n = fortran_int_min(m, n); |
| 2656 | size_t safe_min_m_n = min_m_n; |
| 2657 | size_t s_size = safe_min_m_n * sizeof(ftyp); |
| 2658 | fortran_int u_row_count, vt_column_count; |
| 2659 | size_t safe_u_row_count, safe_vt_column_count; |
| 2660 | size_t u_size, vt_size; |
| 2661 | fortran_int work_count; |
| 2662 | size_t work_size; |
| 2663 | size_t iwork_size = 8 * safe_min_m_n * sizeof(fortran_int); |
| 2664 | fortran_int ld = fortran_int_max(m, 1); |
| 2665 | |
| 2666 | if (!compute_urows_vtcolumns(jobz, m, n, &u_row_count, &vt_column_count)) { |
| 2667 | goto error; |
| 2668 | } |
| 2669 | |
| 2670 | safe_u_row_count = u_row_count; |
| 2671 | safe_vt_column_count = vt_column_count; |
| 2672 | |
| 2673 | u_size = safe_u_row_count * safe_m * sizeof(ftyp); |
| 2674 | vt_size = safe_n * safe_vt_column_count * sizeof(ftyp); |
| 2675 | |
| 2676 | mem_buff = (npy_uint8 *)malloc(a_size + s_size + u_size + vt_size + iwork_size); |
| 2677 | |
| 2678 | if (!mem_buff) { |
| 2679 | goto error; |
| 2680 | } |
| 2681 | |
| 2682 | a = mem_buff; |
| 2683 | s = a + a_size; |
| 2684 | u = s + s_size; |
| 2685 | vt = u + u_size; |
| 2686 | iwork = vt + vt_size; |
| 2687 | |
| 2688 | /* fix vt_column_count so that it is a valid lapack parameter (0 is not) */ |
| 2689 | vt_column_count = fortran_int_max(1, vt_column_count); |
| 2690 | |
| 2691 | params->M = m; |
| 2692 | params->N = n; |
| 2693 | params->A = (ftyp*)a; |
| 2694 | params->S = (ftyp*)s; |
| 2695 | params->U = (ftyp*)u; |
| 2696 | params->VT = (ftyp*)vt; |
| 2697 | params->RWORK = NULL; |
| 2698 | params->IWORK = (fortran_int*)iwork; |
| 2699 | params->LDA = ld; |
| 2700 | params->LDU = ld; |
no test coverage detected