@@ -3159,6 +3159,9 @@ static void
31593159
31603160/**end repeat**/
31613161
3162+ /* -------------------------------------------------------------------------- */
3163+ /* qr common code (modes - reduced and complete) */
3164+
31623165typedef struct gqr_params_struct
31633166{
31643167 fortran_int M ;
@@ -3191,7 +3194,6 @@ call_@lapack_func@(GQR_PARAMS_t *params)
31913194/**end repeat**/
31923195
31933196/**begin repeat
3194- #TYPE=FLOAT,DOUBLE#
31953197 #lapack_func=sorgqr,dorgqr#
31963198 #ftyp=fortran_real,fortran_doublereal#
31973199 */
@@ -3275,73 +3277,27 @@ init_@lapack_func@_common(GQR_PARAMS_t *params,
32753277
32763278/**end repeat**/
32773279
3278- /* -------------------------------------------------------------------------- */
3279- /* qr (modes - reduced) */
3280-
3281-
3282- static inline void
3283- dump_gqr_params (const char * name ,
3284- GQR_PARAMS_t * params )
3285- {
3286- TRACE_TXT ("\n%s:\n" \
3287-
3288- "%14s: %18p\n" \
3289- "%14s: %18p\n" \
3290- "%14s: %18p\n" \
3291- "%14s: %18d\n" \
3292- "%14s: %18d\n" \
3293- "%14s: %18d\n" \
3294- "%14s: %18d\n" \
3295- "%14s: %18d\n" ,
3296-
3297- name ,
3298-
3299- "Q" , params -> Q ,
3300- "TAU" , params -> TAU ,
3301- "WORK" , params -> WORK ,
3302-
3303- "M" , (int )params -> M ,
3304- "MC" , (int )params -> MC ,
3305- "MN" , (int )params -> MN ,
3306- "LDA" , (int )params -> LDA ,
3307- "LWORK" , (int )params -> LWORK );
3308- }
3309-
3310- /**begin repeat
3311- #TYPE=FLOAT,DOUBLE#
3312- #lapack_func=sorgqr,dorgqr#
3313- #ftyp=fortran_real,fortran_doublereal#
3314- */
3315- static inline int
3316- init_ @lapack_func @(GQR_PARAMS_t * params ,
3317- fortran_int m ,
3318- fortran_int n )
3319- {
3320- return init_ @lapack_func @_common (params , m , n , fortran_int_min (m , n ));
3321- }
3322-
3323- /**end repeat**/
3324-
33253280/**begin repeat
3326- #TYPE=CFLOAT,CDOUBLE#
33273281 #lapack_func=cungqr,zungqr#
33283282 #ftyp=fortran_complex,fortran_doublecomplex#
33293283 */
33303284static inline int
3331- init_ @lapack_func @(GQR_PARAMS_t * params ,
3332- fortran_int m ,
3333- fortran_int n )
3285+ init_ @lapack_func @_common (GQR_PARAMS_t * params ,
3286+ fortran_int m ,
3287+ fortran_int n ,
3288+ fortran_int mc )
33343289{
33353290 npy_uint8 * mem_buff = NULL ;
33363291 npy_uint8 * mem_buff2 = NULL ;
33373292 npy_uint8 * a , * q , * tau , * work ;
33383293 fortran_int min_m_n = fortran_int_min (m , n );
3294+ size_t safe_mc = mc ;
33393295 size_t safe_min_m_n = min_m_n ;
33403296 size_t safe_m = m ;
33413297 size_t safe_n = n ;
33423298
33433299 size_t a_size = safe_m * safe_n * sizeof (@ftyp @);
3344- size_t q_size = safe_m * safe_min_m_n * sizeof (@ftyp @);
3300+ size_t q_size = safe_m * safe_mc * sizeof (@ftyp @);
33453301 size_t tau_size = safe_min_m_n * sizeof (@ftyp @);
33463302
33473303 fortran_int work_count_r , work_count_i , work_count ;
@@ -3359,7 +3315,7 @@ init_@lapack_func@(GQR_PARAMS_t *params,
33593315
33603316
33613317 params -> M = m ;
3362- params -> MC = min_m_n ;
3318+ params -> MC = mc ;
33633319 params -> MN = min_m_n ;
33643320 params -> A = a ;
33653321 params -> Q = q ;
@@ -3411,6 +3367,54 @@ init_@lapack_func@(GQR_PARAMS_t *params,
34113367
34123368/**end repeat**/
34133369
3370+ /* -------------------------------------------------------------------------- */
3371+ /* qr (modes - reduced) */
3372+
3373+
3374+ static inline void
3375+ dump_gqr_params (const char * name ,
3376+ GQR_PARAMS_t * params )
3377+ {
3378+ TRACE_TXT ("\n%s:\n" \
3379+
3380+ "%14s: %18p\n" \
3381+ "%14s: %18p\n" \
3382+ "%14s: %18p\n" \
3383+ "%14s: %18d\n" \
3384+ "%14s: %18d\n" \
3385+ "%14s: %18d\n" \
3386+ "%14s: %18d\n" \
3387+ "%14s: %18d\n" ,
3388+
3389+ name ,
3390+
3391+ "Q" , params -> Q ,
3392+ "TAU" , params -> TAU ,
3393+ "WORK" , params -> WORK ,
3394+
3395+ "M" , (int )params -> M ,
3396+ "MC" , (int )params -> MC ,
3397+ "MN" , (int )params -> MN ,
3398+ "LDA" , (int )params -> LDA ,
3399+ "LWORK" , (int )params -> LWORK );
3400+ }
3401+
3402+ /**begin repeat
3403+ #lapack_func=sorgqr,dorgqr,cungqr,zungqr#
3404+ #ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex#
3405+ */
3406+ static inline int
3407+ init_ @lapack_func @(GQR_PARAMS_t * params ,
3408+ fortran_int m ,
3409+ fortran_int n )
3410+ {
3411+ return init_ @lapack_func @_common (
3412+ params , m , n ,
3413+ fortran_int_min (m , n ));
3414+ }
3415+
3416+ /**end repeat**/
3417+
34143418/**begin repeat
34153419 #lapack_func=sorgqr,dorgqr,cungqr,zungqr#
34163420 */
@@ -3486,9 +3490,8 @@ static void
34863490 /* qr (modes - complete) */
34873491
34883492/**begin repeat
3489- #TYPE=FLOAT,DOUBLE#
3490- #lapack_func=sorgqr,dorgqr#
3491- #ftyp=fortran_real,fortran_doublereal#
3493+ #lapack_func=sorgqr,dorgqr,cungqr,zungqr#
3494+ #ftyp=fortran_real,fortran_doublereal,fortran_complex,fortran_doublecomplex#
34923495 */
34933496static inline int
34943497init_ @lapack_func @_complete (GQR_PARAMS_t * params ,
@@ -3500,94 +3503,6 @@ init_@lapack_func@_complete(GQR_PARAMS_t *params,
35003503
35013504/**end repeat**/
35023505
3503- /**begin repeat
3504- #TYPE=CFLOAT,CDOUBLE#
3505- #lapack_func=cungqr,zungqr#
3506- #ftyp=fortran_complex,fortran_doublecomplex#
3507- */
3508- static inline int
3509- init_ @lapack_func @_complete (GQR_PARAMS_t * params ,
3510- fortran_int m ,
3511- fortran_int n )
3512- {
3513- npy_uint8 * mem_buff = NULL ;
3514- npy_uint8 * mem_buff2 = NULL ;
3515- npy_uint8 * a , * q , * tau , * work ;
3516- fortran_int min_m_n = fortran_int_min (m , n );
3517- size_t safe_min_m_n = min_m_n ;
3518- size_t safe_m = m ;
3519- size_t safe_n = n ;
3520-
3521- size_t a_size = safe_m * safe_n * sizeof (@ftyp @);
3522- size_t q_size = safe_m * safe_m * sizeof (@ftyp @);
3523- size_t tau_size = safe_min_m_n * sizeof (@ftyp @);
3524-
3525- fortran_int work_count_r , work_count_i , work_count ;
3526- size_t work_size ;
3527- fortran_int lda = fortran_int_max (1 , m );
3528-
3529- mem_buff = malloc (q_size + tau_size + a_size );
3530-
3531- if (!mem_buff )
3532- goto error ;
3533-
3534- q = mem_buff ;
3535- tau = q + q_size ;
3536- a = tau + tau_size ;
3537-
3538-
3539- params -> M = m ;
3540- params -> MC = m ;
3541- params -> MN = min_m_n ;
3542- params -> A = a ;
3543- params -> Q = q ;
3544- params -> TAU = tau ;
3545- params -> LDA = lda ;
3546-
3547- {
3548- /* compute optimal work size */
3549- @ftyp @ work_size_query ;
3550-
3551- params -> WORK = & work_size_query ;
3552- params -> LWORK = -1 ;
3553-
3554- if (call_ @lapack_func @(params ) != 0 )
3555- goto error ;
3556-
3557- work_count_r = (fortran_int ) ((@ftyp @* )params -> WORK )-> r ;
3558- work_count_i = (fortran_int ) ((@ftyp @* )params -> WORK )-> i ;
3559-
3560- work_count = (fortran_int ) sqrt ((fortran_doublereal ) work_count_r * work_count_r +
3561- (fortran_doublereal ) work_count_i * work_count_i );
3562-
3563- }
3564-
3565- params -> LWORK = fortran_int_max (fortran_int_max (1 , n ),
3566- work_count );
3567-
3568- work_size = (size_t ) params -> LWORK * sizeof (@ftyp @);
3569- mem_buff2 = malloc (work_size );
3570- if (!mem_buff2 )
3571- goto error ;
3572-
3573- work = mem_buff2 ;
3574- memset (work , 0 , work_size );
3575-
3576- params -> WORK = work ;
3577- params -> LWORK = work_count ;
3578-
3579- return 1 ;
3580- error :
3581- TRACE_TXT ("%s failed init\n" , __FUNCTION__ );
3582- free (mem_buff );
3583- free (mem_buff2 );
3584- memset (params , 0 , sizeof (* params ));
3585-
3586- return 0 ;
3587- }
3588-
3589- /**end repeat**/
3590-
35913506/**begin repeat
35923507 #TYPE=FLOAT,DOUBLE,CFLOAT,CDOUBLE#
35933508 #REALTYPE=FLOAT,DOUBLE,FLOAT,DOUBLE#
0 commit comments