1 // LAPACK++ (V. 1.1)
2 // (C) 1992-1996 All Rights Reserved.
3
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7
8 #include "arch.h"
9 #include "lapack.h"
10 #include "f2c.h"
11 #include "lapackpp.h"
12
13 #ifdef _LA_TRIDIAG_MAT_DOUBLE_H_
LaGenerateMatDouble(LaTridiagMatDouble & A)14 void LaGenerateMatDouble(LaTridiagMatDouble &A)
15 {
16 // the lapack dtimmg() routine assumes that the three
17 // diagonals of A are stored contiguously. This is not
18 // a typical requirement of tridiagonal matrices, so
19 // we first create a tmp vector hold the contiguous values
20 // to be initalized, and then copy this back into A.
21
22 integer N = A.size();
23 LaVectorDouble tmp(3 * N - 2);
24 integer iflag = -12, ku = 0, kl = 0;
25 integer m = 3 * N - 2, n = 1;
26
27 F77NAME(dtimmg)(&iflag, &m, &n, &tmp(0), &m, &kl, &ku);
28
29 A.diag(-1) = tmp(LaIndex(0, N - 2));
30 A.diag(0) = tmp(LaIndex(N - 1, 2 * N - 2));
31 A.diag(1) = tmp(LaIndex(2 * N - 1, 3 * N - 3));
32 }
33 #endif
34
35 #ifdef _LA_SYMM_TRIDIAG_MAT_DOUBLE_H_
LaGenerateMatDouble(LaSymmTridiagMatDouble & A)36 void LaGenerateMatDouble(LaSymmTridiagMatDouble &A)
37 {
38 // the lapack dtimmg() routine assumes that the
39 // diagonals of A are stored contiguously.
40 // We first create a tmp vector hold the contiguous values
41 // to be initalized, and then copy this back into A.
42
43 integer N = A.size();
44 LaVectorDouble tmp(2 * N - 1);
45 integer iflag = -13, ku = 0, kl = 0;
46 integer m = 2 * N - 1, n = 1;
47
48 F77NAME(dtimmg)(&iflag, &m, &n, &tmp(0), &m, &kl, &ku);
49
50 //std::cout << tmp << std::endl;
51 //std::cout << tmp(LaIndex(0,N-2)) << std::endl;
52
53 A.diag(-1) = tmp(LaIndex(0, N - 2));
54 A.diag(0) = tmp(LaIndex(N - 1, 2 * N - 2));
55 }
56 #endif
57
58 #ifdef _LA_GEN_MAT_DOUBLE_H_
LaGenerateMatDouble(LaGenMatDouble & A)59 void LaGenerateMatDouble(LaGenMatDouble &A)
60 {
61 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
62 integer iflag = 0, ku = 0, kl = 0;
63
64 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
65 }
66
67 #if !(defined(OS_WIN32) || LAPACK_OS_WIN32)
68 #endif
69
LaRandUniform(LaGenMatDouble & A,double low,double high)70 LaGenMatDouble& LaRandUniform(LaGenMatDouble &A,
71 double low, double high)
72 {
73 int M = A.size(0), N = A.size(1);
74 int i, j;
75
76 double scale = high - low;
77 for (j = 0; j < N; j++)
78 for (i = 0; i < M; i++)
79 A(i, j) = low + scale *
80 #if defined(OS_WIN32) || LAPACK_OS_WIN32
81 double(rand()) / double(RAND_MAX)
82 #else
83 drand48()
84 #endif
85 ;
86 return A;
87 }
88
89 #ifdef _LA_GEN_MAT_COMPLEX_H_
LaRandUniform(LaGenMatComplex & A,double low,double high)90 LaGenMatComplex& LaRandUniform(LaGenMatComplex &A,
91 double low, double high)
92 {
93 int M = A.size(0), N = A.size(1);
94 int i, j;
95
96 double scale = high - low;
97 for (j = 0; j < N; j++)
98 for (i = 0; i < M; i++)
99 A(i, j) = LaComplex(low + scale *
100 #if defined(OS_WIN32) || LAPACK_OS_WIN32
101 double(rand()) / double(RAND_MAX)
102 #else
103 drand48()
104 #endif
105 , low + scale *
106 #if defined(OS_WIN32) || LAPACK_OS_WIN32
107 double(rand()) / double(RAND_MAX)
108 #else
109 drand48()
110 #endif
111 );
112 return A;
113 }
114 #endif // _LA_GEN_MAT_COMPLEX_H_
115
116 #endif // _LA_GEN_MAT_DOUBLE_H_
117
118 #ifdef _LA_UPPER_TRIANG_MAT_DOUBLE_H_
LaGenerateMatDouble(LaUpperTriangMatDouble & A)119 void LaGenerateMatDouble(LaUpperTriangMatDouble &A)
120 {
121 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
122 integer iflag = 9, ku = 0, kl = 0;
123
124 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
125 }
126 #endif
127
128 #ifdef _LA_LOWER_TRIANG_MAT_DOUBLE_H_
LaGenerateMatDouble(LaLowerTriangMatDouble & A)129 void LaGenerateMatDouble(LaLowerTriangMatDouble &A)
130 {
131 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
132 integer iflag = -9, ku = 0, kl = 0;
133
134 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
135 }
136 #endif
137
138
139 #ifdef _LA_SYMM_MAT_DOUBLE_H_
LaGenerateMatDouble(LaSymmMatDouble & A)140 void LaGenerateMatDouble(LaSymmMatDouble &A)
141 {
142 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
143 integer iflag = -6, ku = 0, kl = 0;
144
145 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
146 }
147 #endif
148
149 #ifdef _LA_SPD_MAT_DOUBLE_H_
LaGenerateMatDouble(LaSpdMatDouble & A)150 void LaGenerateMatDouble(LaSpdMatDouble &A)
151 {
152 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
153 integer iflag = -3;
154 integer ku = 0;
155 integer kl = 0;
156
157 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
158 }
159 #endif
160
161 #ifdef _LA_SPD_BAND_MAT_DOUBLE_H_
LaGenerateMatDouble(LaSpdBandMatDouble & A)162 void LaGenerateMatDouble(LaSpdBandMatDouble &A)
163 {
164 integer m = A.size(0), n = A.size(1), lda = A.gdim(0);
165 integer iflag = -5;
166 integer ku = A.subdiags();
167 integer kl = A.subdiags();
168
169 F77NAME(dtimmg)(&iflag, &m, &n, &A(0, 0), &lda, &ku, &kl);
170 }
171 #endif
172
173
174 #ifdef _LA_BAND_MAT_DOUBLE_H_
LaGenerateMatDouble(LaBandMatDouble & A)175 void LaGenerateMatDouble(LaBandMatDouble &A)
176 {
177 integer iflag = 2, ku = A.superdiags(), kl = A.subdiags();
178 integer m = A.size(1), n = A.size(1), lda = A.gdim(0); // changed 11/8
179
180 F77NAME(dtimmg)(&iflag, &m, &n, &A(-kl, 0), &lda, &ku, &kl);
181 }
182 #endif
183
184
185
186