Millepede-II  V04-01-00
 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  USE mpdef
37 
38  REAL(mpd) :: dx(*),dy(*),da
39  INTEGER(mpi) :: i,incx,incy,ix,iy,m,mp1,n
40 
41  IF(n <= 0)return
42  IF (da == 0.0_mpd) return
43  IF(incx == 1.AND.incy == 1)go to 20
44 
45  ! code for unequal increments or equal increments
46  ! not equal to 1
47 
48  ix = 1
49  iy = 1
50  IF(incx < 0)ix = (-n+1)*incx + 1
51  IF(incy < 0)iy = (-n+1)*incy + 1
52  DO i = 1,n
53  dy(iy) = dy(iy) + da*dx(ix)
54  ix = ix + incx
55  iy = iy + incy
56  END DO
57  return
58 
59  ! code for both increments equal to 1
60 
61 
62  ! clean-up loop
63 
64 20 m = mod(n,4)
65  IF( m == 0 ) go to 40
66  DO i = 1,m
67  dy(i) = dy(i) + da*dx(i)
68  END DO
69  IF( n < 4 ) return
70 40 mp1 = m + 1
71  DO i = mp1,n,4
72  dy(i) = dy(i) + da*dx(i)
73  dy(i + 1) = dy(i + 1) + da*dx(i + 1)
74  dy(i + 2) = dy(i + 2) + da*dx(i + 2)
75  dy(i + 3) = dy(i + 3) + da*dx(i + 3)
76  END DO
77 
78 END SUBROUTINE daxpy
79 
80 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81 
92 
93 SUBROUTINE dcopy(n,dx,incx,dy,incy)
94  USE mpdef
95 
96  REAL(mpd) :: dx(*),dy(*)
97  INTEGER(mpi) :: i,incx,incy,ix,iy,m,mp1,n
98 
99  IF(n <= 0)return
100  IF(incx == 1.AND.incy == 1)go to 20
101 
102  ! code for unequal increments or equal increments
103  ! not equal to 1
104 
105  ix = 1
106  iy = 1
107  IF(incx < 0)ix = (-n+1)*incx + 1
108  IF(incy < 0)iy = (-n+1)*incy + 1
109  DO i = 1,n
110  dy(iy) = dx(ix)
111  ix = ix + incx
112  iy = iy + incy
113  END DO
114  return
115 
116  ! code for both increments equal to 1
117 
118 
119  ! clean-up loop
120 
121 20 m = mod(n,7)
122  IF( m == 0 ) go to 40
123  DO i = 1,m
124  dy(i) = dx(i)
125  END DO
126  IF( n < 7 ) return
127 40 mp1 = m + 1
128  DO i = mp1,n,7
129  dy(i) = dx(i)
130  dy(i + 1) = dx(i + 1)
131  dy(i + 2) = dx(i + 2)
132  dy(i + 3) = dx(i + 3)
133  dy(i + 4) = dx(i + 4)
134  dy(i + 5) = dx(i + 5)
135  dy(i + 6) = dx(i + 6)
136  END DO
137 
138 END SUBROUTINE dcopy
139 
140 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
141 
153 
154 REAL(mpd) FUNCTION ddot(n,dx,incx,dy,incy)
155  USE mpdef
156 
157  REAL(mpd) :: dx(*),dy(*),dtemp
158  INTEGER(mpi) :: i,incx,incy,ix,iy,m,mp1,n
159 
160  ddot = 0.0_mpd
161  dtemp = 0.0_mpd
162  IF(n <= 0)return
163  IF(incx == 1.AND.incy == 1)go to 20
164 
165  ! code for unequal increments or equal increments
166  ! not equal to 1
167 
168  ix = 1
169  iy = 1
170  IF(incx < 0)ix = (-n+1)*incx + 1
171  IF(incy < 0)iy = (-n+1)*incy + 1
172  DO i = 1,n
173  dtemp = dtemp + dx(ix)*dy(iy)
174  ix = ix + incx
175  iy = iy + incy
176  END DO
177  ddot = dtemp
178  return
179 
180  ! code for both increments equal to 1
181 
182 
183  ! clean-up loop
184 
185 20 m = mod(n,5)
186  IF( m == 0 ) go to 40
187  DO i = 1,m
188  dtemp = dtemp + dx(i)*dy(i)
189  END DO
190  IF( n < 5 ) go to 60
191 40 mp1 = m + 1
192  DO i = mp1,n,5
193  dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + &
194  dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
195  END DO
196 60 ddot = dtemp
197 
198 END FUNCTION ddot
199 
200 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
201 
214 
215 REAL(mpd) FUNCTION dnrm2 ( n, x, incx )
216  USE mpdef
217 
218  implicit REAL(mpd) (a-h,o-z)
219  INTEGER(mpi) :: incx, n
220  REAL(mpd) :: x(*)
221 
222  !!! REAL(mpd) s1flmx
223  parameter(one = 1.0_mpd, zero = 0.0_mpd )
224  REAL(mpd) :: norm
225  INTRINSIC abs
226  ! ------------------------------------------------------------------
227  ! flmax = s1flmx( )
228  flmax = 1.0e+50_mpd
229 
230  IF ( n < 1) THEN
231  norm = zero
232 
233  ELSE IF (n == 1) THEN
234  norm = abs( x(1) )
235 
236  ELSE
237  scale = zero
238  ssq = one
239 
240  DO ix = 1, 1+(n-1)*incx, incx
241 
242  IF (x(ix) /= zero) THEN
243  absxi = abs( x(ix) )
244 
245  IF (scale < absxi) THEN
246  ssq = one + ssq*(scale/absxi)**2
247  scale = absxi
248  ELSE
249  ssq = ssq + (absxi/scale)**2
250  END IF
251  END IF
252  END DO
253 
254  sqt = sqrt( ssq )
255  IF (scale < flmax/sqt) THEN
256  norm = scale*sqt
257  ELSE
258  norm = flmax
259  END IF
260  END IF
261 
262  dnrm2 = norm
263 
264 END FUNCTION dnrm2
265 
266 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
267 
277 
278 SUBROUTINE daxpy2( n, a, x, y, z )
279  USE mpdef
280 
281  IMPLICIT NONE
282  INTEGER(mpi) :: n
283  REAL(mpd) :: a, x(n), y(n), z(n)
284  INTEGER(mpi) :: i
285 
286  DO i = 1, n
287  z(i) = a*x(i) + y(i)
288  END DO
289 
290 END SUBROUTINE daxpy2
291 
292 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
293 
301 
302 SUBROUTINE dload2( n, const, x )
303  USE mpdef
304 
305  IMPLICIT NONE
306  INTEGER(mpi) :: n
307  REAL(mpd) :: const, x(n)
308 
309  ! ------------------------------------------------------------------
310  ! dload2
311  ! ------------------------------------------------------------------
312 
313  INTEGER(mpi) :: i
314 
315  DO i = 1, n
316  x(i) = const
317  END DO
318 
319 END SUBROUTINE dload2
320 
321 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
322 
329 
330 SUBROUTINE dscal2( n, a, x, y )
331  USE mpdef
332 
333  IMPLICIT NONE
334  INTEGER(mpi) :: n
335  REAL(mpd) :: a, x(n), y(n)
336 
337  INTEGER(mpi) :: i
338 
339  DO i = 1, n
340  y(i) = a*x(i)
341  END DO
342 
343 END SUBROUTINE dscal2