LAPACK 3.11.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ LAPACKE_stf_nancheck()

lapack_logical LAPACKE_stf_nancheck ( int  matrix_layout,
char  transr,
char  uplo,
char  diag,
lapack_int  n,
const float *  a 
)

Definition at line 36 of file lapacke_stf_nancheck.c.

40{
41 lapack_int len;
42 lapack_logical rowmaj, ntr, lower, unit;
43 lapack_int n1, n2, k;
44
45 if( a == NULL ) return (lapack_logical) 0;
46
47 rowmaj = (matrix_layout == LAPACK_ROW_MAJOR);
48 ntr = LAPACKE_lsame( transr, 'n' );
49 lower = LAPACKE_lsame( uplo, 'l' );
50 unit = LAPACKE_lsame( diag, 'u' );
51
52 if( ( !rowmaj && ( matrix_layout != LAPACK_COL_MAJOR ) ) ||
53 ( !ntr && !LAPACKE_lsame( transr, 't' )
54 && !LAPACKE_lsame( transr, 'c' ) ) ||
55 ( !lower && !LAPACKE_lsame( uplo, 'u' ) ) ||
56 ( !unit && !LAPACKE_lsame( diag, 'n' ) ) ) {
57 /* Just exit if any of input parameters are wrong */
58 return (lapack_logical) 0;
59 }
60
61 if( unit ) {
62 /* Unit case, diagonal should be excluded from the check for NaN.
63 * Decoding RFP and checking both triangulars and rectangular
64 * for NaNs.
65 */
66 if( lower ) {
67 n2 = n / 2;
68 n1 = n - n2;
69 } else {
70 n1 = n / 2;
71 n2 = n - n1;
72 }
73 if( n % 2 == 1 ) {
74 /* N is odd */
75 if( ( rowmaj || ntr ) && !( rowmaj && ntr ) ) {
76 /* N is odd and ( TRANSR = 'N' .XOR. ROWMAJOR) */
77 if( lower ) {
78 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'l', 'u',
79 n1, &a[0], n )
81 &a[n1], n )
83 n2, &a[n], n );
84 } else {
85 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'l', 'u',
86 n1, &a[n2], n )
88 &a[0], n )
90 n2, &a[n1], n );
91 }
92 } else {
93 /* N is odd and
94 ( ( TRANSR = 'C' || TRANSR = 'T' ) .XOR. COLMAJOR ) */
95 if( lower ) {
96 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'u', 'u',
97 n1, &a[0], n1 )
99 &a[1], n1 )
101 n2, &a[1], n1 );
102 } else {
103 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'u', 'u',
104 n1, &a[(size_t)n2*n2], n2 )
106 &a[0], n2 )
108 n2, &a[(size_t)n1*n2], n2 );
109 }
110 }
111 } else {
112 /* N is even */
113 k = n / 2;
114 if( ( rowmaj || ntr ) && !( rowmaj && ntr ) ) {
115 /* N is even and ( TRANSR = 'N' .XOR. ROWMAJOR) */
116 if( lower ) {
117 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'l', 'u',
118 k, &a[1], n+1 )
120 &a[k+1], n+1 )
122 k, &a[0], n+1 );
123 } else {
124 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'l', 'u',
125 k, &a[k+1], n+1 )
127 &a[0], n+1 )
129 k, &a[k], n+1 );
130 }
131 } else {
132 /* N is even and
133 * ( ( TRANSR = 'C' || TRANSR = 'T' ) .XOR. COLMAJOR )
134 */
135 if( lower ) {
136 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'u', 'u',
137 k, &a[k], k )
139 &a[(size_t)k*(k+1)], k )
141 k, &a[0], k );
142 } else {
143 return LAPACKE_str_nancheck( LAPACK_ROW_MAJOR, 'u', 'u',
144 k, &a[(size_t)k*(k+1)], k )
146 &a[0], k )
148 k, &a[(size_t)k*k], k );
149 }
150 }
151 }
152 } else {
153 /* Non-unit case - just check whole array for NaNs. */
154 len = n*(n+1)/2;
155 return LAPACKE_sge_nancheck( LAPACK_COL_MAJOR, len, 1, a, len );
156 }
157}
#define lapack_int
Definition: lapack.h:87
#define lapack_logical
Definition: lapack.h:103
#define LAPACK_COL_MAJOR
Definition: lapacke.h:53
#define LAPACK_ROW_MAJOR
Definition: lapacke.h:52
lapack_logical LAPACKE_lsame(char ca, char cb)
Definition: lapacke_lsame.c:35
lapack_logical LAPACKE_sge_nancheck(int matrix_layout, lapack_int m, lapack_int n, const float *a, lapack_int lda)
lapack_logical LAPACKE_str_nancheck(int matrix_layout, char uplo, char diag, lapack_int n, const float *a, lapack_int lda)
Here is the call graph for this function:
Here is the caller graph for this function: