Millepede-II  V04-00-00_preview
 All Classes Files Functions Variables Enumerator Pages
minresblas.f90
Go to the documentation of this file.
1 
2 ! Code converted using TO_F90 by Alan Miller
3 ! Date: 2012-03-16 Time: 11:07:10
4 
22 
34 
35 SUBROUTINE daxpy(n,da,dx,incx,dy,incy)
36 
37  DOUBLE PRECISION :: dx(*),dy(*),da
38  INTEGER :: i,incx,incy,ix,iy,m,mp1,n
39 
40  IF(n <= 0)return
41  IF (da == 0.0d0) return
42  IF(incx == 1.AND.incy == 1)go to 20
43 
44  ! code for unequal increments or equal increments
45  ! not equal to 1
46 
47  ix = 1
48  iy = 1
49  IF(incx < 0)ix = (-n+1)*incx + 1
50  IF(incy < 0)iy = (-n+1)*incy + 1
51  DO i = 1,n
52  dy(iy) = dy(iy) + da*dx(ix)
53  ix = ix + incx
54  iy = iy + incy
55  END DO
56  return
57 
58  ! code for both increments equal to 1
59 
60 
61  ! clean-up loop
62 
63 20 m = mod(n,4)
64  IF( m == 0 ) go to 40
65  DO i = 1,m
66  dy(i) = dy(i) + da*dx(i)
67  END DO
68  IF( n < 4 ) return
69 40 mp1 = m + 1
70  DO i = mp1,n,4
71  dy(i) = dy(i) + da*dx(i)
72  dy(i + 1) = dy(i + 1) + da*dx(i + 1)
73  dy(i + 2) = dy(i + 2) + da*dx(i + 2)
74  dy(i + 3) = dy(i + 3) + da*dx(i + 3)
75  END DO
76 
77 END SUBROUTINE daxpy
78 
79 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80 
91 
92 SUBROUTINE dcopy(n,dx,incx,dy,incy)
93 
94  DOUBLE PRECISION :: dx(*),dy(*)
95  INTEGER :: i,incx,incy,ix,iy,m,mp1,n
96 
97  IF(n <= 0)return
98  IF(incx == 1.AND.incy == 1)go to 20
99 
100  ! code for unequal increments or equal increments
101  ! not equal to 1
102 
103  ix = 1
104  iy = 1
105  IF(incx < 0)ix = (-n+1)*incx + 1
106  IF(incy < 0)iy = (-n+1)*incy + 1
107  DO i = 1,n
108  dy(iy) = dx(ix)
109  ix = ix + incx
110  iy = iy + incy
111  END DO
112  return
113 
114  ! code for both increments equal to 1
115 
116 
117  ! clean-up loop
118 
119 20 m = mod(n,7)
120  IF( m == 0 ) go to 40
121  DO i = 1,m
122  dy(i) = dx(i)
123  END DO
124  IF( n < 7 ) return
125 40 mp1 = m + 1
126  DO i = mp1,n,7
127  dy(i) = dx(i)
128  dy(i + 1) = dx(i + 1)
129  dy(i + 2) = dx(i + 2)
130  dy(i + 3) = dx(i + 3)
131  dy(i + 4) = dx(i + 4)
132  dy(i + 5) = dx(i + 5)
133  dy(i + 6) = dx(i + 6)
134  END DO
135 
136 END SUBROUTINE dcopy
137 
138 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
139 
151 
152 DOUBLE PRECISION FUNCTION ddot(n,dx,incx,dy,incy)
153 
154  DOUBLE PRECISION :: dx(*),dy(*),dtemp
155  INTEGER :: i,incx,incy,ix,iy,m,mp1,n
156 
157  ddot = 0.0d0
158  dtemp = 0.0d0
159  IF(n <= 0)return
160  IF(incx == 1.AND.incy == 1)go to 20
161 
162  ! code for unequal increments or equal increments
163  ! not equal to 1
164 
165  ix = 1
166  iy = 1
167  IF(incx < 0)ix = (-n+1)*incx + 1
168  IF(incy < 0)iy = (-n+1)*incy + 1
169  DO i = 1,n
170  dtemp = dtemp + dx(ix)*dy(iy)
171  ix = ix + incx
172  iy = iy + incy
173  END DO
174  ddot = dtemp
175  return
176 
177  ! code for both increments equal to 1
178 
179 
180  ! clean-up loop
181 
182 20 m = mod(n,5)
183  IF( m == 0 ) go to 40
184  DO i = 1,m
185  dtemp = dtemp + dx(i)*dy(i)
186  END DO
187  IF( n < 5 ) go to 60
188 40 mp1 = m + 1
189  DO i = mp1,n,5
190  dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + &
191  dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
192  END DO
193 60 ddot = dtemp
194 
195 END FUNCTION ddot
196 
197 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
198 
211 
212 DOUBLE PRECISION FUNCTION dnrm2 ( n, x, incx )
213 
214  implicit DOUBLE PRECISION (a-h,o-z)
215  INTEGER :: incx, n
216  DOUBLE PRECISION :: x(*)
217 
218  !!! double precision s1flmx
219  parameter(one = 1.0d+0, zero = 0.0d+0 )
220  DOUBLE PRECISION :: norm
221  INTRINSIC abs
222  ! ------------------------------------------------------------------
223  ! flmax = s1flmx( )
224  flmax = 1.0d+50
225 
226  IF ( n < 1) THEN
227  norm = zero
228 
229  ELSE IF (n == 1) THEN
230  norm = abs( x(1) )
231 
232  ELSE
233  scale = zero
234  ssq = one
235 
236  DO ix = 1, 1+(n-1)*incx, incx
237 
238  IF (x(ix) /= zero) THEN
239  absxi = abs( x(ix) )
240 
241  IF (scale < absxi) THEN
242  ssq = one + ssq*(scale/absxi)**2
243  scale = absxi
244  ELSE
245  ssq = ssq + (absxi/scale)**2
246  END IF
247  END IF
248  END DO
249 
250  sqt = sqrt( ssq )
251  IF (scale < flmax/sqt) THEN
252  norm = scale*sqt
253  ELSE
254  norm = flmax
255  END IF
256  END IF
257 
258  dnrm2 = norm
259 
260 END FUNCTION dnrm2
261 
262 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
263 
273 
274 SUBROUTINE daxpy2( n, a, x, y, z )
275 
276  IMPLICIT NONE
277  INTEGER :: n
278  DOUBLE PRECISION :: a, x(n), y(n), z(n)
279  INTEGER :: i
280 
281  DO i = 1, n
282  z(i) = a*x(i) + y(i)
283  END DO
284 
285 END SUBROUTINE daxpy2
286 
287 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
288 
296 
297 SUBROUTINE dload2( n, const, x )
298 
299  IMPLICIT NONE
300  INTEGER :: n
301  DOUBLE PRECISION :: const, x(n)
302 
303  ! ------------------------------------------------------------------
304  ! dload2
305  ! ------------------------------------------------------------------
306 
307  INTEGER :: i
308 
309  DO i = 1, n
310  x(i) = const
311  END DO
312 
313 END SUBROUTINE dload2
314 
315 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
316 
323 
324 SUBROUTINE dscal2( n, a, x, y )
325 
326  IMPLICIT NONE
327  INTEGER :: n
328  DOUBLE PRECISION :: a, x(n), y(n)
329 
330  INTEGER :: i
331 
332  DO i = 1, n
333  y(i) = a*x(i)
334  END DO
335 
336 END SUBROUTINE dscal2