File: magma_dbulge.cpp

package info (click to toggle)
magma 2.9.0%2Bds-2
  • links: PTS, VCS
  • area: contrib
  • in suites: trixie
  • size: 83,212 kB
  • sloc: cpp: 709,115; fortran: 121,916; ansic: 32,343; python: 25,603; f90: 15,208; makefile: 942; xml: 253; csh: 232; sh: 203; perl: 104
file content (112 lines) | stat: -rw-r--r-- 3,707 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
    -- MAGMA (version 2.9.0) --
       Univ. of Tennessee, Knoxville
       Univ. of California, Berkeley
       Univ. of Colorado, Denver
       @date January 2025

       @author Azzam Haidar
       @generated from control/magma_zbulge.cpp, normal z -> d, Wed Jan 22 14:39:04 2025

*/
#include "magma_internal.h"
#define REAL


/******************************************************************************/
extern "C" magma_int_t
magma_get_dbulge_lq2(magma_int_t n, magma_int_t threads, magma_int_t wantz)
{
    if (wantz == 0)
        return 2*n*2;

    magma_int_t nb = magma_get_dbulge_nb(n, threads);
    magma_int_t Vblksiz = magma_get_dbulge_vblksiz(n, nb, threads);
    magma_int_t ldv = nb + Vblksiz;
    magma_int_t ldt = Vblksiz;

    return magma_bulge_get_blkcnt(n, nb, Vblksiz) * Vblksiz * (ldt + ldv + 1);
}


/******************************************************************************/
extern "C" void
magma_get_dbulge_VTsiz(magma_int_t n, magma_int_t nb, magma_int_t threads,
        magma_int_t *Vblksiz, magma_int_t *ldv, magma_int_t *ldt)
{
    Vblksiz[0] = magma_get_dbulge_vblksiz(n, nb, threads);
    ldv[0]     = nb + Vblksiz[0];
    ldt[0]     = Vblksiz[0];
}


/******************************************************************************/
extern "C" magma_int_t
magma_dbulge_getstg2size(magma_int_t n, magma_int_t nb, magma_int_t wantz,
                         magma_int_t Vblksiz, magma_int_t ldv, magma_int_t ldt,
                         magma_int_t *blkcnt, magma_int_t *sizTAU2,
                         magma_int_t *sizT2, magma_int_t *sizV2)
{
    blkcnt[0]  = magma_bulge_get_blkcnt(n, nb, Vblksiz);
    sizTAU2[0] = wantz == 0 ? 2*n :  blkcnt[0]*Vblksiz;
    sizV2[0]   = wantz == 0 ? 2*n :  blkcnt[0]*Vblksiz*ldv;
    sizT2[0]   = wantz == 0 ? 0   :  blkcnt[0]*Vblksiz*ldt;
    return sizTAU2[0] + sizT2[0] + sizV2[0];
}


/******************************************************************************/
extern "C" magma_int_t
magma_dbulge_getlwstg2(magma_int_t n, magma_int_t threads, magma_int_t wantz,
                       magma_int_t *Vblksiz, magma_int_t *ldv, magma_int_t *ldt,
                       magma_int_t *blkcnt, magma_int_t *sizTAU2,
                       magma_int_t *sizT2, magma_int_t *sizV2)
{
    magma_int_t nb      = magma_get_dbulge_nb(n, threads);
    magma_get_dbulge_VTsiz(n, nb, threads, Vblksiz, ldv, ldt);
    return magma_dbulge_getstg2size(n, nb, wantz, Vblksiz[0], ldv[0], ldt[0], blkcnt, sizTAU2, sizT2, sizV2);
}


/******************************************************************************/
extern "C" void
magma_dsyevdx_getworksize(magma_int_t n, magma_int_t threads,
        magma_int_t wantz,
        magma_int_t *lwmin,
        #ifdef COMPLEX
        magma_int_t *lrwmin,
        #endif
        magma_int_t *liwmin)
{
    magma_int_t lda2=0;
    magma_int_t Vblksiz;
    magma_int_t ldv;
    magma_int_t ldt;
    magma_int_t blkcnt;
    magma_int_t sizTAU2;
    magma_int_t sizT2;
    magma_int_t sizV2;
    magma_int_t nb     = magma_get_dbulge_nb( n, threads );
    magma_int_t lwstg1 = magma_bulge_getlwstg1( n, nb, &lda2 );
    magma_int_t lwstg2 = magma_dbulge_getlwstg2( n, threads, wantz, &Vblksiz, &ldv, &ldt, &blkcnt, &sizTAU2, &sizT2, &sizV2 );

    #ifdef COMPLEX
    if (wantz) {
        *lwmin  = lwstg2 + 2*n + max(lwstg1, n*n);
        *lrwmin = 1 + 5*n + 2*n*n;
        *liwmin = 5*n + 3;
    } else {
        *lwmin  = lwstg2 + n + lwstg1;
        *lrwmin = n;
        *liwmin = 1;
    }
    #else
    if (wantz) {
        *lwmin  = lwstg2 + 1 + 6*n + max(lwstg1, 2*n*n);
        *liwmin = 5*n + 3;
    } else {
        *lwmin  = lwstg2 + 2*n + lwstg1;
        *liwmin = 1;
    }
    #endif
}