1 |
aw0a |
1 |
********************************************************************* |
2 |
|
|
* |
3 |
|
|
* File mi15blas fortran. |
4 |
|
|
* |
5 |
|
|
* dasum daxpy dcopy ddot dnrm2 dscal idamax |
6 |
|
|
* |
7 |
|
|
* These correspond to members of the BLAS package (Basic Linear |
8 |
|
|
* Algebra Subprograms, Lawson et al. (1979), ACM TOMS 5, 3). |
9 |
|
|
* If possible, they should be replaced by authentic BLAS routines |
10 |
|
|
* tuned to the machine being used. |
11 |
|
|
* |
12 |
|
|
* The following utilities are also used: |
13 |
|
|
* |
14 |
|
|
* dddiv ddscl dload dnorm1 |
15 |
|
|
* hcopy hload icopy iload iload1 |
16 |
|
|
* |
17 |
|
|
* These could be tuned to the machine being used. |
18 |
|
|
* dload is used the most. |
19 |
|
|
* |
20 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
21 |
|
|
|
22 |
|
|
*** dasum thru idamax taken |
23 |
|
|
*** from netlib, Thu May 16 21:00:13 EDT 1991 *** |
24 |
|
|
*** Declarations of the form dx(1) changed to dx(*) |
25 |
|
|
|
26 |
|
|
double precision function dasum(n,dx,incx) |
27 |
|
|
c |
28 |
|
|
c takes the sum of the absolute values. |
29 |
|
|
c jack dongarra, linpack, 3/11/78. |
30 |
|
|
c |
31 |
|
|
double precision dx(*),dtemp |
32 |
|
|
integer i,incx,m,mp1,n,nincx |
33 |
|
|
c |
34 |
|
|
dasum = 0.0d0 |
35 |
|
|
dtemp = 0.0d0 |
36 |
|
|
if(n.le.0)return |
37 |
|
|
if(incx.eq.1)go to 20 |
38 |
|
|
c |
39 |
|
|
c code for increment not equal to 1 |
40 |
|
|
c |
41 |
|
|
nincx = n*incx |
42 |
|
|
do 10 i = 1,nincx,incx |
43 |
|
|
dtemp = dtemp + dabs(dx(i)) |
44 |
|
|
10 continue |
45 |
|
|
dasum = dtemp |
46 |
|
|
return |
47 |
|
|
c |
48 |
|
|
c code for increment equal to 1 |
49 |
|
|
c |
50 |
|
|
c |
51 |
|
|
c clean-up loop |
52 |
|
|
c |
53 |
|
|
20 m = mod(n,6) |
54 |
|
|
if( m .eq. 0 ) go to 40 |
55 |
|
|
do 30 i = 1,m |
56 |
|
|
dtemp = dtemp + dabs(dx(i)) |
57 |
|
|
30 continue |
58 |
|
|
if( n .lt. 6 ) go to 60 |
59 |
|
|
40 mp1 = m + 1 |
60 |
|
|
do 50 i = mp1,n,6 |
61 |
|
|
dtemp = dtemp + dabs(dx(i)) + dabs(dx(i + 1)) + dabs(dx(i + 2)) |
62 |
|
|
* + dabs(dx(i + 3)) + dabs(dx(i + 4)) + dabs(dx(i + 5)) |
63 |
|
|
50 continue |
64 |
|
|
60 dasum = dtemp |
65 |
|
|
return |
66 |
|
|
end |
67 |
|
|
|
68 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
69 |
|
|
|
70 |
|
|
subroutine daxpy(n,da,dx,incx,dy,incy) |
71 |
|
|
c |
72 |
|
|
c constant times a vector plus a vector. |
73 |
|
|
c uses unrolled loops for increments equal to one. |
74 |
|
|
c jack dongarra, linpack, 3/11/78. |
75 |
|
|
c |
76 |
|
|
double precision dx(*),dy(*),da |
77 |
|
|
integer i,incx,incy,ix,iy,m,mp1,n |
78 |
|
|
c |
79 |
|
|
if(n.le.0)return |
80 |
|
|
if (da .eq. 0.0d0) return |
81 |
|
|
if(incx.eq.1.and.incy.eq.1)go to 20 |
82 |
|
|
c |
83 |
|
|
c code for unequal increments or equal increments |
84 |
|
|
c not equal to 1 |
85 |
|
|
c |
86 |
|
|
ix = 1 |
87 |
|
|
iy = 1 |
88 |
|
|
if(incx.lt.0)ix = (-n+1)*incx + 1 |
89 |
|
|
if(incy.lt.0)iy = (-n+1)*incy + 1 |
90 |
|
|
do 10 i = 1,n |
91 |
|
|
dy(iy) = dy(iy) + da*dx(ix) |
92 |
|
|
ix = ix + incx |
93 |
|
|
iy = iy + incy |
94 |
|
|
10 continue |
95 |
|
|
return |
96 |
|
|
c |
97 |
|
|
c code for both increments equal to 1 |
98 |
|
|
c |
99 |
|
|
c |
100 |
|
|
c clean-up loop |
101 |
|
|
c |
102 |
|
|
20 m = mod(n,4) |
103 |
|
|
if( m .eq. 0 ) go to 40 |
104 |
|
|
do 30 i = 1,m |
105 |
|
|
dy(i) = dy(i) + da*dx(i) |
106 |
|
|
30 continue |
107 |
|
|
if( n .lt. 4 ) return |
108 |
|
|
40 mp1 = m + 1 |
109 |
|
|
do 50 i = mp1,n,4 |
110 |
|
|
dy(i) = dy(i) + da*dx(i) |
111 |
|
|
dy(i + 1) = dy(i + 1) + da*dx(i + 1) |
112 |
|
|
dy(i + 2) = dy(i + 2) + da*dx(i + 2) |
113 |
|
|
dy(i + 3) = dy(i + 3) + da*dx(i + 3) |
114 |
|
|
50 continue |
115 |
|
|
return |
116 |
|
|
end |
117 |
|
|
|
118 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
119 |
|
|
|
120 |
|
|
subroutine dcopy(n,dx,incx,dy,incy) |
121 |
|
|
c |
122 |
|
|
c copies a vector, x, to a vector, y. |
123 |
|
|
c uses unrolled loops for increments equal to one. |
124 |
|
|
c jack dongarra, linpack, 3/11/78. |
125 |
|
|
c |
126 |
|
|
double precision dx(*),dy(*) |
127 |
|
|
integer i,incx,incy,ix,iy,m,mp1,n |
128 |
|
|
c |
129 |
|
|
if(n.le.0)return |
130 |
|
|
if(incx.eq.1.and.incy.eq.1)go to 20 |
131 |
|
|
c |
132 |
|
|
c code for unequal increments or equal increments |
133 |
|
|
c not equal to 1 |
134 |
|
|
c |
135 |
|
|
ix = 1 |
136 |
|
|
iy = 1 |
137 |
|
|
if(incx.lt.0)ix = (-n+1)*incx + 1 |
138 |
|
|
if(incy.lt.0)iy = (-n+1)*incy + 1 |
139 |
|
|
do 10 i = 1,n |
140 |
|
|
dy(iy) = dx(ix) |
141 |
|
|
ix = ix + incx |
142 |
|
|
iy = iy + incy |
143 |
|
|
10 continue |
144 |
|
|
return |
145 |
|
|
c |
146 |
|
|
c code for both increments equal to 1 |
147 |
|
|
c |
148 |
|
|
c |
149 |
|
|
c clean-up loop |
150 |
|
|
c |
151 |
|
|
20 m = mod(n,7) |
152 |
|
|
if( m .eq. 0 ) go to 40 |
153 |
|
|
do 30 i = 1,m |
154 |
|
|
dy(i) = dx(i) |
155 |
|
|
30 continue |
156 |
|
|
if( n .lt. 7 ) return |
157 |
|
|
40 mp1 = m + 1 |
158 |
|
|
do 50 i = mp1,n,7 |
159 |
|
|
dy(i) = dx(i) |
160 |
|
|
dy(i + 1) = dx(i + 1) |
161 |
|
|
dy(i + 2) = dx(i + 2) |
162 |
|
|
dy(i + 3) = dx(i + 3) |
163 |
|
|
dy(i + 4) = dx(i + 4) |
164 |
|
|
dy(i + 5) = dx(i + 5) |
165 |
|
|
dy(i + 6) = dx(i + 6) |
166 |
|
|
50 continue |
167 |
|
|
return |
168 |
|
|
end |
169 |
|
|
|
170 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
171 |
|
|
|
172 |
|
|
double precision function ddot(n,dx,incx,dy,incy) |
173 |
|
|
c |
174 |
|
|
c forms the dot product of two vectors. |
175 |
|
|
c uses unrolled loops for increments equal to one. |
176 |
|
|
c jack dongarra, linpack, 3/11/78. |
177 |
|
|
c |
178 |
|
|
double precision dx(*),dy(*),dtemp |
179 |
|
|
integer i,incx,incy,ix,iy,m,mp1,n |
180 |
|
|
c |
181 |
|
|
ddot = 0.0d0 |
182 |
|
|
dtemp = 0.0d0 |
183 |
|
|
if(n.le.0)return |
184 |
|
|
if(incx.eq.1.and.incy.eq.1)go to 20 |
185 |
|
|
c |
186 |
|
|
c code for unequal increments or equal increments |
187 |
|
|
c not equal to 1 |
188 |
|
|
c |
189 |
|
|
ix = 1 |
190 |
|
|
iy = 1 |
191 |
|
|
if(incx.lt.0)ix = (-n+1)*incx + 1 |
192 |
|
|
if(incy.lt.0)iy = (-n+1)*incy + 1 |
193 |
|
|
do 10 i = 1,n |
194 |
|
|
dtemp = dtemp + dx(ix)*dy(iy) |
195 |
|
|
ix = ix + incx |
196 |
|
|
iy = iy + incy |
197 |
|
|
10 continue |
198 |
|
|
ddot = dtemp |
199 |
|
|
return |
200 |
|
|
c |
201 |
|
|
c code for both increments equal to 1 |
202 |
|
|
c |
203 |
|
|
c |
204 |
|
|
c clean-up loop |
205 |
|
|
c |
206 |
|
|
20 m = mod(n,5) |
207 |
|
|
if( m .eq. 0 ) go to 40 |
208 |
|
|
do 30 i = 1,m |
209 |
|
|
dtemp = dtemp + dx(i)*dy(i) |
210 |
|
|
30 continue |
211 |
|
|
if( n .lt. 5 ) go to 60 |
212 |
|
|
40 mp1 = m + 1 |
213 |
|
|
do 50 i = mp1,n,5 |
214 |
|
|
dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + |
215 |
|
|
* dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4) |
216 |
|
|
50 continue |
217 |
|
|
60 ddot = dtemp |
218 |
|
|
return |
219 |
|
|
end |
220 |
|
|
|
221 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
222 |
|
|
|
223 |
|
|
double precision function dnrm2 ( n, dx, incx) |
224 |
|
|
integer next |
225 |
|
|
double precision dx(*), cutlo, cuthi, hitest, sum, xmax,zero,one |
226 |
|
|
data zero, one /0.0d0, 1.0d0/ |
227 |
|
|
c |
228 |
|
|
c euclidean norm of the n-vector stored in dx() with storage |
229 |
|
|
c increment incx . |
230 |
|
|
c if n .le. 0 return with result = 0. |
231 |
|
|
c if n .ge. 1 then incx must be .ge. 1 |
232 |
|
|
c |
233 |
|
|
c c.l.lawson, 1978 jan 08 |
234 |
|
|
c |
235 |
|
|
c four phase method using two built-in constants that are |
236 |
|
|
c hopefully applicable to all machines. |
237 |
|
|
c cutlo = maximum of dsqrt(u/eps) over all known machines. |
238 |
|
|
c cuthi = minimum of dsqrt(v) over all known machines. |
239 |
|
|
c where |
240 |
|
|
c eps = smallest no. such that eps + 1. .gt. 1. |
241 |
|
|
c u = smallest positive no. (underflow limit) |
242 |
|
|
c v = largest no. (overflow limit) |
243 |
|
|
c |
244 |
|
|
c brief outline of algorithm.. |
245 |
|
|
c |
246 |
|
|
c phase 1 scans zero components. |
247 |
|
|
c move to phase 2 when a component is nonzero and .le. cutlo |
248 |
|
|
c move to phase 3 when a component is .gt. cutlo |
249 |
|
|
c move to phase 4 when a component is .ge. cuthi/m |
250 |
|
|
c where m = n for x() real and m = 2*n for complex. |
251 |
|
|
c |
252 |
|
|
c values for cutlo and cuthi.. |
253 |
|
|
c from the environmental parameters listed in the imsl converter |
254 |
|
|
c document the limiting values are as follows.. |
255 |
|
|
c cutlo, s.p. u/eps = 2**(-102) for honeywell. close seconds are |
256 |
|
|
c univac and dec at 2**(-103) |
257 |
|
|
c thus cutlo = 2**(-51) = 4.44089e-16 |
258 |
|
|
c cuthi, s.p. v = 2**127 for univac, honeywell, and dec. |
259 |
|
|
c thus cuthi = 2**(63.5) = 1.30438e19 |
260 |
|
|
c cutlo, d.p. u/eps = 2**(-67) for honeywell and dec. |
261 |
|
|
c thus cutlo = 2**(-33.5) = 8.23181d-11 |
262 |
|
|
c cuthi, d.p. same as s.p. cuthi = 1.30438d19 |
263 |
|
|
c data cutlo, cuthi / 8.232d-11, 1.304d19 / |
264 |
|
|
c data cutlo, cuthi / 4.441e-16, 1.304e19 / |
265 |
|
|
data cutlo, cuthi / 8.232d-11, 1.304d19 / |
266 |
|
|
c |
267 |
|
|
if(n .gt. 0) go to 10 |
268 |
|
|
dnrm2 = zero |
269 |
|
|
go to 300 |
270 |
|
|
c |
271 |
|
|
10 assign 30 to next |
272 |
|
|
sum = zero |
273 |
|
|
nn = n * incx |
274 |
|
|
c begin main loop |
275 |
|
|
i = 1 |
276 |
|
|
20 go to next,(30, 50, 70, 110) |
277 |
|
|
30 if( dabs(dx(i)) .gt. cutlo) go to 85 |
278 |
|
|
assign 50 to next |
279 |
|
|
xmax = zero |
280 |
|
|
c |
281 |
|
|
c phase 1. sum is zero |
282 |
|
|
c |
283 |
|
|
50 if( dx(i) .eq. zero) go to 200 |
284 |
|
|
if( dabs(dx(i)) .gt. cutlo) go to 85 |
285 |
|
|
c |
286 |
|
|
c prepare for phase 2. |
287 |
|
|
assign 70 to next |
288 |
|
|
go to 105 |
289 |
|
|
c |
290 |
|
|
c prepare for phase 4. |
291 |
|
|
c |
292 |
|
|
100 i = j |
293 |
|
|
assign 110 to next |
294 |
|
|
sum = (sum / dx(i)) / dx(i) |
295 |
|
|
105 xmax = dabs(dx(i)) |
296 |
|
|
go to 115 |
297 |
|
|
c |
298 |
|
|
c phase 2. sum is small. |
299 |
|
|
c scale to avoid destructive underflow. |
300 |
|
|
c |
301 |
|
|
70 if( dabs(dx(i)) .gt. cutlo ) go to 75 |
302 |
|
|
c |
303 |
|
|
c common code for phases 2 and 4. |
304 |
|
|
c in phase 4 sum is large. scale to avoid overflow. |
305 |
|
|
c |
306 |
|
|
110 if( dabs(dx(i)) .le. xmax ) go to 115 |
307 |
|
|
sum = one + sum * (xmax / dx(i))**2 |
308 |
|
|
xmax = dabs(dx(i)) |
309 |
|
|
go to 200 |
310 |
|
|
c |
311 |
|
|
115 sum = sum + (dx(i)/xmax)**2 |
312 |
|
|
go to 200 |
313 |
|
|
c |
314 |
|
|
c |
315 |
|
|
c prepare for phase 3. |
316 |
|
|
c |
317 |
|
|
75 sum = (sum * xmax) * xmax |
318 |
|
|
c |
319 |
|
|
c |
320 |
|
|
c for real or d.p. set hitest = cuthi/n |
321 |
|
|
c for complex set hitest = cuthi/(2*n) |
322 |
|
|
c |
323 |
|
|
85 hitest = cuthi/float( n ) |
324 |
|
|
c |
325 |
|
|
c phase 3. sum is mid-range. no scaling. |
326 |
|
|
c |
327 |
|
|
do 95 j =i,nn,incx |
328 |
|
|
if(dabs(dx(j)) .ge. hitest) go to 100 |
329 |
|
|
95 sum = sum + dx(j)**2 |
330 |
|
|
dnrm2 = dsqrt( sum ) |
331 |
|
|
go to 300 |
332 |
|
|
c |
333 |
|
|
200 continue |
334 |
|
|
i = i + incx |
335 |
|
|
if ( i .le. nn ) go to 20 |
336 |
|
|
c |
337 |
|
|
c end of main loop. |
338 |
|
|
c |
339 |
|
|
c compute square root and adjust for scaling. |
340 |
|
|
c |
341 |
|
|
dnrm2 = xmax * dsqrt(sum) |
342 |
|
|
300 continue |
343 |
|
|
return |
344 |
|
|
end |
345 |
|
|
|
346 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
347 |
|
|
|
348 |
|
|
subroutine dscal(n,da,dx,incx) |
349 |
|
|
c |
350 |
|
|
c scales a vector by a constant. |
351 |
|
|
c uses unrolled loops for increment equal to one. |
352 |
|
|
c jack dongarra, linpack, 3/11/78. |
353 |
|
|
c |
354 |
|
|
double precision da,dx(*) |
355 |
|
|
integer i,incx,m,mp1,n,nincx |
356 |
|
|
c |
357 |
|
|
if(n.le.0)return |
358 |
|
|
if(incx.eq.1)go to 20 |
359 |
|
|
c |
360 |
|
|
c code for increment not equal to 1 |
361 |
|
|
c |
362 |
|
|
nincx = n*incx |
363 |
|
|
do 10 i = 1,nincx,incx |
364 |
|
|
dx(i) = da*dx(i) |
365 |
|
|
10 continue |
366 |
|
|
return |
367 |
|
|
c |
368 |
|
|
c code for increment equal to 1 |
369 |
|
|
c |
370 |
|
|
c |
371 |
|
|
c clean-up loop |
372 |
|
|
c |
373 |
|
|
20 m = mod(n,5) |
374 |
|
|
if( m .eq. 0 ) go to 40 |
375 |
|
|
do 30 i = 1,m |
376 |
|
|
dx(i) = da*dx(i) |
377 |
|
|
30 continue |
378 |
|
|
if( n .lt. 5 ) return |
379 |
|
|
40 mp1 = m + 1 |
380 |
|
|
do 50 i = mp1,n,5 |
381 |
|
|
dx(i) = da*dx(i) |
382 |
|
|
dx(i + 1) = da*dx(i + 1) |
383 |
|
|
dx(i + 2) = da*dx(i + 2) |
384 |
|
|
dx(i + 3) = da*dx(i + 3) |
385 |
|
|
dx(i + 4) = da*dx(i + 4) |
386 |
|
|
50 continue |
387 |
|
|
return |
388 |
|
|
end |
389 |
|
|
|
390 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
391 |
|
|
|
392 |
|
|
integer function idamax(n,dx,incx) |
393 |
|
|
c |
394 |
|
|
c finds the index of element having max. absolute value. |
395 |
|
|
c jack dongarra, linpack, 3/11/78. |
396 |
|
|
c |
397 |
|
|
double precision dx(*),dmax |
398 |
|
|
integer i,incx,ix,n |
399 |
|
|
c |
400 |
|
|
idamax = 0 |
401 |
|
|
if( n .lt. 1 ) return |
402 |
|
|
idamax = 1 |
403 |
|
|
if(n.eq.1)return |
404 |
|
|
if(incx.eq.1)go to 20 |
405 |
|
|
c |
406 |
|
|
c code for increment not equal to 1 |
407 |
|
|
c |
408 |
|
|
ix = 1 |
409 |
|
|
dmax = dabs(dx(1)) |
410 |
|
|
ix = ix + incx |
411 |
|
|
do 10 i = 2,n |
412 |
|
|
if(dabs(dx(ix)).le.dmax) go to 5 |
413 |
|
|
idamax = i |
414 |
|
|
dmax = dabs(dx(ix)) |
415 |
|
|
5 ix = ix + incx |
416 |
|
|
10 continue |
417 |
|
|
return |
418 |
|
|
c |
419 |
|
|
c code for increment equal to 1 |
420 |
|
|
c |
421 |
|
|
20 dmax = dabs(dx(1)) |
422 |
|
|
do 30 i = 2,n |
423 |
|
|
if(dabs(dx(i)).le.dmax) go to 30 |
424 |
|
|
idamax = i |
425 |
|
|
dmax = dabs(dx(i)) |
426 |
|
|
30 continue |
427 |
|
|
return |
428 |
|
|
end |
429 |
|
|
|
430 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
431 |
|
|
|
432 |
|
|
subroutine dddiv ( n, d, incd, x, incx ) |
433 |
|
|
|
434 |
|
|
implicit double precision (a-h,o-z) |
435 |
|
|
double precision d(*), x(*) |
436 |
|
|
|
437 |
|
|
* dddiv performs the diagonal scaling x = x / d. |
438 |
|
|
|
439 |
|
|
integer i, id, ix |
440 |
|
|
external dscal |
441 |
|
|
intrinsic abs |
442 |
|
|
parameter ( one = 1.0d+0 ) |
443 |
|
|
|
444 |
|
|
if (n .gt. 0) then |
445 |
|
|
if (incd .eq. 0 .and. incx .ne. 0) then |
446 |
|
|
call dscal ( n, one/d(1), x, abs(incx) ) |
447 |
|
|
else if (incd .eq. incx .and. incd .gt. 0) then |
448 |
|
|
do 10 id = 1, 1 + (n - 1)*incd, incd |
449 |
|
|
x(id) = x(id) / d(id) |
450 |
|
|
10 continue |
451 |
|
|
else |
452 |
|
|
if (incx .ge. 0) then |
453 |
|
|
ix = 1 |
454 |
|
|
else |
455 |
|
|
ix = 1 - (n - 1)*incx |
456 |
|
|
end if |
457 |
|
|
if (incd .gt. 0) then |
458 |
|
|
do 20 id = 1, 1 + (n - 1)*incd, incd |
459 |
|
|
x(ix) = x(ix) / d(id) |
460 |
|
|
ix = ix + incx |
461 |
|
|
20 continue |
462 |
|
|
else |
463 |
|
|
id = 1 - (n - 1)*incd |
464 |
|
|
do 30 i = 1, n |
465 |
|
|
x(ix) = x(ix) / d(id) |
466 |
|
|
id = id + incd |
467 |
|
|
ix = ix + incx |
468 |
|
|
30 continue |
469 |
|
|
end if |
470 |
|
|
end if |
471 |
|
|
end if |
472 |
|
|
|
473 |
|
|
* end of dddiv |
474 |
|
|
end |
475 |
|
|
|
476 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
477 |
|
|
|
478 |
|
|
subroutine ddscl ( n, d, incd, x, incx ) |
479 |
|
|
|
480 |
|
|
integer incd, incx, n |
481 |
|
|
double precision d(*), x(*) |
482 |
|
|
|
483 |
|
|
* ddscl performs the diagonal scaling x = d * x. |
484 |
|
|
|
485 |
|
|
integer i, id, ix |
486 |
|
|
external dscal |
487 |
|
|
intrinsic abs |
488 |
|
|
|
489 |
|
|
if (n .gt. 0) then |
490 |
|
|
if (incd .eq. 0 .and. incx .ne. 0) then |
491 |
|
|
call dscal ( n, d(1), x, abs(incx) ) |
492 |
|
|
else if (incd .eq. incx .and. incd .gt. 0) then |
493 |
|
|
do 10 id = 1, 1 + (n - 1)*incd, incd |
494 |
|
|
x(id) = d(id)*x(id) |
495 |
|
|
10 continue |
496 |
|
|
else |
497 |
|
|
if (incx .ge. 0) then |
498 |
|
|
ix = 1 |
499 |
|
|
else |
500 |
|
|
ix = 1 - (n - 1)*incx |
501 |
|
|
end if |
502 |
|
|
if (incd .gt. 0) then |
503 |
|
|
do 20 id = 1, 1 + (n - 1)*incd, incd |
504 |
|
|
x(ix) = d(id)*x(ix) |
505 |
|
|
ix = ix + incx |
506 |
|
|
20 continue |
507 |
|
|
else |
508 |
|
|
id = 1 - (n - 1)*incd |
509 |
|
|
do 30 i = 1, n |
510 |
|
|
x(ix) = d(id)*x(ix) |
511 |
|
|
id = id + incd |
512 |
|
|
ix = ix + incx |
513 |
|
|
30 continue |
514 |
|
|
end if |
515 |
|
|
end if |
516 |
|
|
end if |
517 |
|
|
|
518 |
|
|
* end of ddscl |
519 |
|
|
end |
520 |
|
|
|
521 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
522 |
|
|
|
523 |
|
|
subroutine dload ( n, const, x, incx ) |
524 |
|
|
|
525 |
|
|
double precision const |
526 |
|
|
integer incx, n |
527 |
|
|
double precision x(*) |
528 |
|
|
|
529 |
|
|
* dload loads elements of x with const. |
530 |
|
|
|
531 |
|
|
double precision zero |
532 |
|
|
parameter ( zero = 0.0d+0 ) |
533 |
|
|
integer ix |
534 |
|
|
|
535 |
|
|
if (n .gt. 0) then |
536 |
|
|
if (incx .eq. 1 .and. const .eq. zero) then |
537 |
|
|
do 10 ix = 1, n |
538 |
|
|
x(ix) = zero |
539 |
|
|
10 continue |
540 |
|
|
else |
541 |
|
|
do 20 ix = 1, 1 + (n - 1)*incx, incx |
542 |
|
|
x(ix) = const |
543 |
|
|
20 continue |
544 |
|
|
end if |
545 |
|
|
end if |
546 |
|
|
|
547 |
|
|
* end of dload |
548 |
|
|
end |
549 |
|
|
|
550 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
551 |
|
|
|
552 |
|
|
function dnorm1( n, x, incx ) |
553 |
|
|
|
554 |
|
|
implicit double precision (a-h,o-z) |
555 |
|
|
double precision x(*) |
556 |
|
|
|
557 |
|
|
* dnorm1 returns the 1-norm of the vector x, scaled by root(n). |
558 |
|
|
* This approximates an "average" element of x with some allowance |
559 |
|
|
* for x being sparse. |
560 |
|
|
|
561 |
|
|
intrinsic sqrt |
562 |
|
|
external dasum |
563 |
|
|
|
564 |
|
|
d = n |
565 |
|
|
d = dasum ( n, x, incx ) / sqrt(d) |
566 |
|
|
dnorm1 = d |
567 |
|
|
|
568 |
|
|
* end of dnorm1 |
569 |
|
|
end |
570 |
|
|
|
571 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
572 |
|
|
|
573 |
|
|
subroutine hcopy ( n, hx, incx, hy, incy ) |
574 |
|
|
|
575 |
|
|
integer*4 hx(*), hy(*) |
576 |
|
|
integer incx, incy |
577 |
|
|
|
578 |
|
|
* hcopy is the half-integer version of dcopy. |
579 |
|
|
* In this version of MINOS we no longer use half integers. |
580 |
|
|
|
581 |
|
|
integer ix, iy |
582 |
|
|
|
583 |
|
|
if (n .gt. 0) then |
584 |
|
|
if (incx .eq. incy .and. incy .gt. 0) then |
585 |
|
|
do 10 iy = 1, 1 + (n - 1)*incy, incy |
586 |
|
|
hy(iy) = hx(iy) |
587 |
|
|
10 continue |
588 |
|
|
else |
589 |
|
|
if (incx .ge. 0) then |
590 |
|
|
ix = 1 |
591 |
|
|
else |
592 |
|
|
ix = 1 - (n - 1)*incx |
593 |
|
|
end if |
594 |
|
|
if (incy .gt. 0) then |
595 |
|
|
do 20 iy = 1, 1 + ( n - 1 )*incy, incy |
596 |
|
|
hy(iy) = hx(ix) |
597 |
|
|
ix = ix + incx |
598 |
|
|
20 continue |
599 |
|
|
else |
600 |
|
|
iy = 1 - (n - 1)*incy |
601 |
|
|
do 30 i = 1, n |
602 |
|
|
hy(iy) = hx(ix) |
603 |
|
|
iy = iy + incy |
604 |
|
|
ix = ix + incx |
605 |
|
|
30 continue |
606 |
|
|
end if |
607 |
|
|
end if |
608 |
|
|
end if |
609 |
|
|
|
610 |
|
|
* end of hcopy |
611 |
|
|
end |
612 |
|
|
|
613 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
614 |
|
|
|
615 |
|
|
subroutine hload ( n, const, hx, incx ) |
616 |
|
|
|
617 |
|
|
integer incx, n |
618 |
|
|
integer const |
619 |
|
|
integer*4 hx(*) |
620 |
|
|
|
621 |
|
|
* hload loads elements of hx with const. |
622 |
|
|
* Beware that const is INTEGER, not half integer. |
623 |
|
|
|
624 |
|
|
integer ix |
625 |
|
|
|
626 |
|
|
if (n .gt. 0) then |
627 |
|
|
if (incx .eq. 1 .and. const .eq. 0) then |
628 |
|
|
do 10 ix = 1, n |
629 |
|
|
hx(ix) = 0 |
630 |
|
|
10 continue |
631 |
|
|
else |
632 |
|
|
do 20 ix = 1, 1 + (n - 1)*incx, incx |
633 |
|
|
hx(ix) = const |
634 |
|
|
20 continue |
635 |
|
|
end if |
636 |
|
|
end if |
637 |
|
|
|
638 |
|
|
* end of hload |
639 |
|
|
end |
640 |
|
|
|
641 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
642 |
|
|
|
643 |
|
|
subroutine icopy ( n, x, incx, y, incy ) |
644 |
|
|
|
645 |
|
|
integer x(*), y(*) |
646 |
|
|
integer incx, incy |
647 |
|
|
|
648 |
|
|
* icopy is the integer version of dcopy. |
649 |
|
|
|
650 |
|
|
integer ix, iy |
651 |
|
|
|
652 |
|
|
if (n .gt. 0) then |
653 |
|
|
if (incx .eq. incy .and. incy .gt. 0) then |
654 |
|
|
do 10 iy = 1, 1 + (n - 1)*incy, incy |
655 |
|
|
y(iy) = x(iy) |
656 |
|
|
10 continue |
657 |
|
|
else |
658 |
|
|
if (incx .ge. 0) then |
659 |
|
|
ix = 1 |
660 |
|
|
else |
661 |
|
|
ix = 1 - (n - 1)*incx |
662 |
|
|
end if |
663 |
|
|
if (incy .gt. 0) then |
664 |
|
|
do 20 iy = 1, 1 + ( n - 1 )*incy, incy |
665 |
|
|
y(iy) = x(ix) |
666 |
|
|
ix = ix + incx |
667 |
|
|
20 continue |
668 |
|
|
else |
669 |
|
|
iy = 1 - (n - 1)*incy |
670 |
|
|
do 30 i = 1, n |
671 |
|
|
y(iy) = x(ix) |
672 |
|
|
iy = iy + incy |
673 |
|
|
ix = ix + incx |
674 |
|
|
30 continue |
675 |
|
|
end if |
676 |
|
|
end if |
677 |
|
|
end if |
678 |
|
|
|
679 |
|
|
* end of icopy |
680 |
|
|
end |
681 |
|
|
|
682 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
683 |
|
|
|
684 |
|
|
subroutine iload ( n, const, x, incx ) |
685 |
|
|
|
686 |
|
|
integer incx, n |
687 |
|
|
integer const |
688 |
|
|
integer x(*) |
689 |
|
|
|
690 |
|
|
* iload loads elements of x with const. |
691 |
|
|
|
692 |
|
|
integer ix |
693 |
|
|
|
694 |
|
|
if (n .gt. 0) then |
695 |
|
|
if (incx .eq. 1 .and. const .eq. 0) then |
696 |
|
|
do 10 ix = 1, n |
697 |
|
|
x(ix) = 0 |
698 |
|
|
10 continue |
699 |
|
|
else |
700 |
|
|
do 20 ix = 1, 1 + (n - 1)*incx, incx |
701 |
|
|
x(ix) = const |
702 |
|
|
20 continue |
703 |
|
|
end if |
704 |
|
|
end if |
705 |
|
|
|
706 |
|
|
* end of iload |
707 |
|
|
end |
708 |
|
|
|
709 |
|
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
710 |
|
|
|
711 |
|
|
subroutine iload1( n, const, x, incx ) |
712 |
|
|
|
713 |
|
|
integer incx, n |
714 |
|
|
integer const |
715 |
|
|
integer x(*) |
716 |
|
|
|
717 |
|
|
* iload1 loads elements of x with const, by calling iload. |
718 |
|
|
* iload1 is needed in MINOS because iload is a file number. |
719 |
|
|
|
720 |
|
|
call iload ( n, const, x, incx ) |
721 |
|
|
|
722 |
|
|
* end of iload1 |
723 |
|
|
end |