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 |