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