SURFEX v8.1
General documentation of Surfex
quad_emu_mod.F90
Go to the documentation of this file.
1 #if defined(NECSX) && defined(REALHUGE)
2 
4 
5 ! NEC 2007. Emulation of vectorized quadruple precision
6 
7 USE parkind2 ,ONLY : jprh
8 
9 IMPLICIT NONE
10 
12 EXTERNAL r16vcpqv, qvcpr16v
13 
14 TYPE :: quads
15  REAL(8) :: h, l
16 END TYPE quads
17 TYPE :: quadv
18  REAL(8), POINTER, DIMENSION(:) :: h, l
19 END TYPE quadv
20 
21 CONTAINS
22 
23 SUBROUTINE qxmy (V1,V2,N,V3)
24 USE parkind1 ,ONLY : jpim
25 USE parkind2 ,ONLY : jprh
26  ! ***************************
27  ! V3(1:N) = V1(1:N) * V2(1:N)
28  ! ***************************
29  INTEGER(KIND=JPIM), INTENT(IN) :: N
30  REAL(KIND=JPRH), DIMENSION(N), INTENT(IN) :: V1, V2
31  REAL(KIND=JPRH), DIMENSION(N), INTENT(OUT) :: V3
32  type(quadv),SAVE :: qv1, qv2, qv3
33  LOGICAL FIRST
34  DATA first / .true. /
35  INTEGER, SAVE :: NMAX = -1
36 
37  IF (first .OR. n>nmax) THEN
38  IF(.NOT.first)DEALLOCATE (qv1%H,qv1%L,qv2%H,qv2%L,qv3%H,qv3%L)
39  first = .false.
40  nmax = n
41  ALLOCATE ( qv1%H(nmax) , qv1%L(nmax) )
42  ALLOCATE ( qv2%H(nmax) , qv2%L(nmax) )
43  ALLOCATE ( qv3%H(nmax) , qv3%L(nmax) )
44  ENDIF
45 
46  ! QV1(:) = V1(:)
47  CALL r16vcpqv(v1,qv1%H,qv1%L,n)
48 
49  ! QV2(:) = V2(:)
50  CALL r16vcpqv(v2,qv2%H,qv2%L,n)
51 
52  ! QV3(:) = QV1(:) * QV2(:)
53 
54  CALL qvmulqv(qv1%H(1),qv1%L(1),qv2%H(1),qv2%L(1),qv3%H(1),qv3%L(1),n)
55 
56  ! V3(:) = QV3(:)
57  CALL qvcpr16v(qv3%H,qv3%L,v3,n)
58 
59 RETURN
60 END SUBROUTINE qxmy
61 
62 SUBROUTINE qaxpy (ALPHA,V1,V2,N)
63 USE parkind1 ,ONLY : jpim
64 USE parkind2 ,ONLY : jprh
65  ! ***********************************
66  ! V2(1:N) = ALPHA * V1(1:N) + V2(1:N)
67  ! ***********************************
68  INTEGER(KIND=JPIM), INTENT(IN) :: N
69  REAL(KIND=JPRH), INTENT(IN) :: ALPHA
70  REAL(KIND=JPRH), DIMENSION(N), INTENT(IN) :: V1
71  REAL(KIND=JPRH), DIMENSION(N), INTENT(INOUT) :: V2
72  type(quadv),SAVE :: qalpha
73  type(quadv),SAVE :: qv1, qv2, qvtmp
74  LOGICAL FIRST
75  DATA first / .true. /
76  INTEGER, SAVE :: NMAX = -1
77 
78  IF (first .OR. n>nmax) THEN
79  IF(.NOT.first)THEN
80  DEALLOCATE (qalpha%H,qalpha%L,qvtmp%H,qvtmp%L,qv1%H,qv1%L,qv2%H,qv2%L)
81  ENDIF
82  first = .false.
83  nmax = n
84  ALLOCATE ( qalpha%H(nmax) , qalpha%L(nmax) )
85  ALLOCATE ( qv1%H(nmax) , qv1%L(nmax) )
86  ALLOCATE ( qv2%H(nmax) , qv2%L(nmax) )
87  ALLOCATE ( qvtmp%H(nmax) , qvtmp%L(nmax) )
88  ENDIF
89 
90  ! QALPHA(:) = ALPHA
91  CALL r16scpqv(alpha,qalpha%H,qalpha%L,n)
92 
93  ! QV1(:) = V1(:)
94  CALL r16vcpqv(v1,qv1%H,qv1%L,n)
95 
96  ! QV2(:) = V2(:)
97  CALL r16vcpqv(v2,qv2%H,qv2%L,n)
98 
99  ! QVtmp(:) = ALPHA*QV1(:)
100  CALL qvmulqv(qalpha%H,qalpha%L,qv1%H,qv1%L,qvtmp%H,qvtmp%L,n)
101 
102  ! QVtmp(:) = QVtmp(:) + QV2(:)
103  CALL qvaddqv(qvtmp%H,qvtmp%L,qv2%H,qv2%L,qvtmp%H,qvtmp%L,n)
104 
105  ! V2(:) = QVtmp(:)
106  CALL qvcpr16v(qvtmp%H,qvtmp%L,v2,n)
107 
108 RETURN
109 END SUBROUTINE qaxpy
110 
111 SUBROUTINE sqrtivdv (I1, I2, N, X)
112 USE parkind1 ,ONLY : jpim, jpib
113 USE parkind2 ,ONLY : jprh
114  ! *********************************************
115  ! X(1:N) = SQRT ( REAL(I1(1:N) / REAL(I2(1:N) )
116  ! *********************************************
117  INTEGER(KIND=JPIM), INTENT(IN) :: N
118  INTEGER(KIND=JPIB), INTENT(IN), DIMENSION(N) :: I1
119  INTEGER(KIND=JPIB), INTENT(IN), DIMENSION(N) :: I2
120  REAL(KIND=JPRH), INTENT(INOUT), DIMENSION(N) :: X
121  type(quadv),SAVE :: qv1, qv2, qv3, qvx
122  LOGICAL FIRST
123  DATA first / .true. /
124  INTEGER, SAVE :: NMAX = -1
125 
126  IF (first .OR. n>nmax) THEN
127  IF(.NOT.first)THEN
128  DEALLOCATE (qv1%H,qv1%L,qv2%H,qv2%L,qv3%H,qv3%L)
129  DEALLOCATE (qvx%H,qvx%L)
130  ENDIF
131  first = .false.
132  nmax = n
133  ALLOCATE ( qv1%H(nmax) , qv1%L(nmax) )
134  ALLOCATE ( qv2%H(nmax) , qv2%L(nmax) )
135  ALLOCATE ( qv3%H(nmax) , qv3%L(nmax) )
136  ALLOCATE ( qvx%H(nmax) , qvx%L(nmax) )
137  ENDIF
138  ! QV1(:) = I1(:)
139  CALL i4vcpqv(i1,qv1%H,qv1%L,n)
140  ! QV2(:) = I2(:)
141  CALL i4vcpqv(i2,qv2%H,qv2%L,n)
142  ! QV3(:) = I1(:) / I2(:)
143  CALL qvdivqv(qv1%H,qv1%L,qv2%H,qv2%L,qv3%H,qv3%L,n)
144  ! QVx(:) = sqrt ( QV3(:) )
145  CALL qvsqrt (qv3%H,qv3%L,qvx%H,qvx%L,n)
146  ! X(:) = QVx(:)
147  CALL qvcpr16v(qvx%H,qvx%L,x,n)
148 
149 RETURN
150 END SUBROUTINE sqrtivdv
151 
152 END MODULE quad_emu_mod
153 
154 
155 
156 ! New routines ------------------------------------------------
157  SUBROUTINE i4vcpqv(I4,AHI,ALO,N)
158 ! For SX vectorized version
159  USE parkind1 ,ONLY : jpim, jpib, jprb
160  USE parkind2 ,ONLY : jprh
161  INTEGER(KIND=JPIM) :: N
162  INTEGER(KIND=JPIB) :: I4(n)
163  REAL(KIND=JPRB) :: AHI(n),ALO(n)
164  REAL(KIND=JPRH) :: R16(n)
165 
166  r16(1:n) = i4(1:n)
167  CALL r16vcpqv(r16,ahi,alo,n)
168 
169  END SUBROUTINE i4vcpqv
170 
171  SUBROUTINE r16vcpqv(R16,AHI,ALO,N)
172  USE parkind1 ,ONLY : jpim, jpib, jprb
173  USE parkind2 ,ONLY : jprh
174 #ifdef SCALAR
175 ! Fortran equivalent code
176  INTEGER(KIND=JPIM) :: N
177  REAL(KIND=JPRH) :: R16(n)
178  REAL(KIND=JPRB) :: AHI(n),ALO(n)
179  INTEGER I
180  DO i=1,n
181  ahi(i)=r16(i)
182  alo(i)=r16(i)-ahi(i)
183  ENDDO
184 #else
185 ! For SX vectorized version
186  INTEGER(KIND=JPIM) :: N
187  REAL(KIND=JPRB) :: R16(2,n)
188  REAL(KIND=JPRB) :: AHI(n),ALO(n)
189 
190  REAL(KIND=JPRB) :: AA,BB
191  INTEGER(KIND=JPIB) :: II,JJ,MSK1,MSK2,MSK3
192  equivalence(aa,ii)
193  equivalence(bb,jj)
194  parameter(msk1=z'7FF0000000000000')
195  parameter(msk2=z'FFF0000000000000')
196  parameter(msk3=z'0340000000000000')
197 
198  INTEGER I
199 
200  DO i=1,n
201  ahi(i)=r16(1,i)
202  bb=r16(1,i)
203  jj=iand(jj,msk1)
204  IF(jj.LT.msk3) THEN
205  alo(i)=0.d0
206  ELSE
207  aa=r16(2,i)
208  ii=iand(ii,msk2)
209  alo(i)=r16(2,i)-aa
210  ENDIF
211  ENDDO
212 #endif
213  END SUBROUTINE r16vcpqv
214 
215  SUBROUTINE qvcpr16v(AHI,ALO,R16,N)
216  USE parkind1 ,ONLY : jpim, jpib, jprb
217  USE parkind2 ,ONLY : jprh
218 #ifdef SCALAR
219 ! Fortran equivalent code
220  INTEGER N
221  REAL(KIND=JPRB) :: AHI(n),ALO(n)
222  REAL(KIND=JPRH) :: R16(n)
223  INTEGER I
224  DO i=1,n
225  r16(i)=ahi(i)
226  r16(i)=r16(i)+alo(i)
227  ENDDO
228 #else
229 ! For SX vectorized version
230  REAL(KIND=JPRB) :: AHI(n),ALO(n)
231  REAL(KIND=JPRB) :: R16(2,n)
232  INTEGER N
233 !
234  REAL(KIND=JPRB) :: A1,A2,AA,ZHI,ZLO,AGOMI,R
235  INTEGER(KIND=JPIB) :: II,MSK
236  equivalence(aa,ii)
237  parameter(msk=z'FFF0000000000000')
238  INTEGER I
239 !
240  DO i=1,n
241  a1=ahi(i)
242  a2=alo(i)
243  aa=a1
244  ii=iand(ii,msk)
245  agomi=aa*2d0**(-52)
246  zhi=a1
247  zlo=a2+agomi
248  r=a1*a2
249  IF (r.LT.0) zhi=a1-agomi
250  r16(1,i)=zhi
251  r16(2,i)=(a1-zhi)+zlo
252  ENDDO
253 #endif
254  END SUBROUTINE qvcpr16v
255 ! New routines ------------------------------------------------
256 
257  SUBROUTINE r16scpqv(R16,AHI,ALO,N)
258 ! ... Quadruple precision native to Quadruple emulation pair
259 ! QV(1:N) = R16
260  USE parkind1 ,ONLY : jpim, jpib, jprb
261  USE parkind2 ,ONLY : jprh
262  INTEGER N
263  REAL(KIND=JPRB) :: R16(2)
264  REAL(KIND=JPRB) :: AHI(n),ALO(n)
265 
266  REAL(KIND=JPRB) :: AA
267  INTEGER(KIND=JPIB) :: II,MSK
268  equivalence(aa,ii)
269  parameter(msk=z'FFF0000000000000')
270 
271  INTEGER I
272 
273  DO i=1,n
274  ahi(i)=r16(1)
275  aa=r16(2)
276  ii=iand(ii,msk)
277  alo(i)=r16(2)-aa
278  ENDDO
279 
280  END SUBROUTINE r16scpqv
281 
282  SUBROUTINE qvmulqv(AHI,ALO,CHI,CLO,ACHI,ACLO,N)
283 ! ... multiplication of Quadruple emulation pair
284  USE parkind1 ,ONLY : jpim, jpib, jprb
285  USE parkind2 ,ONLY : jprh
286  INTEGER N
287  REAL(KIND=JPRB) :: AHI(n),ALO(n),CHI(n),CLO(n),ACHI(n),ACLO(n)
288 
289  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
290  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
291 
292  REAL(KIND=JPRB) :: ZHI,ZLO,ZZ
293  REAL(KIND=JPRB) :: A1,A2,C1,C2,T
294  INTEGER I
295 
296 ! longmul(a, c) RESULT(ac)
297 ! z = exactmul2(a%hi, c%hi)
298 ! zz = ((a%hi + a%lo) * c%lo + a%lo * c%hi) + z%lo
299 ! ac%hi = z%hi + zz
300 ! ac%lo = (z%hi - ac%hi) + zz
301 
302 ! exactmul2(a, c) RESULT(ac)
303 ! t = constant * a
304 ! a1 = (a - t) + t
305 ! a2 = a - a1
306 ! t = constant * c
307 ! c1 = (c - t) + t
308 ! c2 = c - c1
309 ! ac%hi = a * c
310 ! ac%lo = (((a1 * c1 - ac%hi) + a1 * c2) + c1 * a2) + c2 * a2
311 
312  DO i=1,n
313  t = constant * ahi(i)
314  a1 = (ahi(i) - t) + t
315  a2 = ahi(i) - a1
316  t = constant * chi(i)
317  c1 = (chi(i) - t) + t
318  c2 = chi(i) - c1
319  zhi = ahi(i) * chi(i)
320  zlo = (((a1 * c1 - zhi) + a1 * c2) + c1 * a2) + c2 * a2
321  zz = ((ahi(i) + alo(i)) * clo(i) + alo(i) * chi(i)) + zlo
322  achi(i) = zhi + zz
323  aclo(i) = (zhi - achi(i)) + zz
324  ENDDO
325 
326  END SUBROUTINE qvmulqv
327  SUBROUTINE qvdivqv(AHI,ALO,CHI,CLO,ACHI,ACLO,N)
328 ! ... division of Quadruple emulation pair
329  USE parkind1 ,ONLY : jpim, jpib, jprb
330  USE parkind2 ,ONLY : jprh
331  INTEGER N
332  REAL(KIND=JPRB) :: AHI(n),ALO(n),CHI(n),CLO(n),ACHI(n),ACLO(n)
333 
334  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
335  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
336 
337  REAL(KIND=JPRB) :: Z,ZZ,QHI,QLO
338  REAL(KIND=JPRB) :: A1,A2,C1,C2,T
339  INTEGER I
340 
341 ! longdiv(a, c) RESULT(ac)
342 ! z = a%hi / c%hi
343 ! q = exactmul2(c%hi, z)
344 ! zz = ((((a%hi - q%hi) - q%lo) + a%lo) - z*c%lo) / (c%hi + c%lo)
345 ! ac%hi = z + zz
346 ! ac%lo = (z - ac%hi) + zz
347 
348 ! exactmul2(a, c) RESULT(ac)
349 ! t = constant * a
350 ! a1 = (a - t) + t
351 ! a2 = a - a1
352 ! t = constant * c
353 ! c1 = (c - t) + t
354 ! c2 = c - c1
355 ! ac%hi = a * c
356 ! ac%lo = (((a1 * c1 - ac%hi) + a1 * c2) + c1 * a2) + c2 * a2
357 
358  DO i=1,n
359  z = ahi(i)/chi(i)
360  t = constant * chi(i)
361  a1 = (chi(i) - t) + t
362  a2 = chi(i) - a1
363  t = constant * z
364  c1 = (z - t) + t
365  c2 = z - c1
366  qhi = chi(i) * z
367  qlo = (((a1 * c1 - qhi) + a1 * c2) + c1 * a2) + c2 * a2
368  zz = ((((ahi(i) - qhi) - qlo) + alo(i)) - z*clo(i)) / (chi(i) + clo(i))
369  achi(i) = z + zz
370  aclo(i) = (z - achi(i)) + zz
371  ENDDO
372 
373  END SUBROUTINE qvdivqv
374  SUBROUTINE qvaddqv(AHI,ALO,CHI,CLO,ACHI,ACLO,N)
375 ! ... addition of Quadruple emulation pair
376  USE parkind1 ,ONLY : jpim, jpib, jprb
377  USE parkind2 ,ONLY : jprh
378  INTEGER N
379  REAL(KIND=JPRB) :: AHI(n),ALO(n),CHI(n),CLO(n),ACHI(n),ACLO(n)
380 
381  REAL(KIND=JPRB) :: Z,ZZ,Q
382  INTEGER I
383 
384 ! longadd(a, c) RESULT(ac)
385 ! z = a%hi + c%hi
386 ! q = a%hi - z
387 ! zz = (((q + c%hi) + (a%hi - (q + z))) + a%lo) + c%lo
388 ! ac%hi = z + zz
389 ! ac%lo = (z - ac%hi) + zz
390 
391  DO i=1,n
392  z = ahi(i) + chi(i)
393  q = ahi(i) - z
394  zz = (((q + chi(i)) + (ahi(i) - (q + z))) + alo(i)) + clo(i)
395  achi(i) = z + zz
396  aclo(i) = (z - achi(i)) + zz
397  ENDDO
398 
399  END SUBROUTINE qvaddqv
400  SUBROUTINE qvsubqv(AHI,ALO,CHI,CLO,ACHI,ACLO,N)
401 ! ... subtraction of Quadruple emulation pair
402  USE parkind1 ,ONLY : jpim, jpib, jprb
403  USE parkind2 ,ONLY : jprh
404  INTEGER N
405  REAL(KIND=JPRB) :: AHI(n),ALO(n),CHI(n),CLO(n),ACHI(n),ACLO(n)
406 
407  REAL(KIND=JPRB) :: Z,ZZ,Q
408  INTEGER I
409 
410 ! longsub(a, c) RESULT(ac)
411 ! z = a%hi - c%hi
412 ! q = a%hi - z
413 ! zz = (((q - c%hi) + (a%hi - (q + z))) + a%lo) - c%lo
414 ! ac%hi = z + zz
415 ! ac%lo = (z - ac%hi) + zz
416 
417  DO i=1,n
418  z = ahi(i) - chi(i)
419  q = ahi(i) - z
420  zz = (((q - chi(i)) + (ahi(i) - (q + z))) + alo(i)) - clo(i)
421  achi(i) = z + zz
422  aclo(i) = (z - achi(i)) + zz
423  ENDDO
424 
425  END SUBROUTINE qvsubqv
426  SUBROUTINE dvmuldv(A,C,ACHI,ACLO,N)
427 ! ... multiplication of double precision to Quadruple emulation pair
428  USE parkind1 ,ONLY : jpim, jpib, jprb
429  USE parkind2 ,ONLY : jprh
430  INTEGER N
431  REAL(KIND=JPRB) :: A(n),C(n),ACHI(n),ACLO(n)
432 
433  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
434  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
435 
436  REAL(KIND=JPRB) :: A1,A2,C1,C2,T
437  INTEGER I
438 
439 ! exactmul2(a, c) RESULT(ac)
440 ! t = constant * a
441 ! a1 = (a - t) + t
442 ! a2 = a - a1
443 ! t = constant * c
444 ! c1 = (c - t) + t
445 ! c2 = c - c1
446 ! ac%hi = a * c
447 ! ac%lo = (((a1 * c1 - ac%hi) + a1 * c2) + c1 * a2) + c2 * a2
448 
449  DO i=1,n
450  t = constant * a(i)
451  a1 = (a(i) - t) + t
452  a2 = a(i) - a1
453  t = constant * c(i)
454  c1 = (c(i) - t) + t
455  c2 = c(i) - c1
456  achi(i) = a(i) * c(i)
457  aclo(i) = (((a1 * c1 - achi(i)) + a1 * c2) + c1 * a2) + c2 * a2
458  ENDDO
459 
460  END SUBROUTINE dvmuldv
461  SUBROUTINE ismulqv(IS,QHI,QLO,QIHI,QILO,N)
462 ! ... integer scale of Quadruple emulation pair
463  USE parkind1 ,ONLY : jpim, jpib, jprb
464  USE parkind2 ,ONLY : jprh
465  INTEGER IS,N
466  REAL(KIND=JPRB) :: QHI(n),QLO(n),QIHI(n),QILO(n)
467 
468  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
469  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
470 
471  REAL(KIND=JPRB) :: A1,A2,Q1,Q2,T,ZHI,ZLO,ZZ
472  INTEGER I
473 
474  t = constant * is
475  a1 = (dble(is) - t) + t
476  a2 = dble(is) - a1
477  DO i=1,n
478  t = constant * qhi(i)
479  q1 = (qhi(i) - t) + t
480  q2 = qhi(i) - q1
481  zhi = is * qhi(i)
482  zlo = (((a1 * q1 - zhi) + a1 * q2) + q1 * a2) + q2 * a2
483  zz = is * qlo(i) + zlo
484  qihi(i) = zhi + zz
485  qilo(i) = (zhi - qihi(i)) + zz
486  ENDDO
487 
488  END SUBROUTINE ismulqv
489  SUBROUTINE qvdivis(AHI,ALO,IS,AIHI,AILO,N)
490 ! ... integer division of Quadruple emulation pair
491  USE parkind1 ,ONLY : jpim, jpib, jprb
492  USE parkind2 ,ONLY : jprh
493  INTEGER IS,N
494  REAL(KIND=JPRB) :: AHI(n),ALO(n),AIHI(n),AILO(n)
495 
496  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
497  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
498 
499  REAL(KIND=JPRB) :: Z,ZZ,QHI,QLO
500  REAL(KIND=JPRB) :: A1,A2,C1,C2,T
501  INTEGER I
502 
503 ! div_quad_int(a, b) RESULT(c)
504 ! Divide a quadruple-precision number (a) by an integer (b)
505 ! z = a%hi / b
506 ! q = exactmul2(DBLE(b), z)
507 ! zz = (((a%hi - q%hi) - q%lo) + a%lo) / b
508 ! c%hi = z + zz
509 ! c%lo = (z - c%hi) + zz
510 
511 ! exactmul2(a, c) RESULT(ac)
512 ! t = constant * a
513 ! a1 = (a - t) + t
514 ! a2 = a - a1
515 ! t = constant * c
516 ! c1 = (c - t) + t
517 ! c2 = c - c1
518 ! ac%hi = a * c
519 ! ac%lo = (((a1 * c1 - ac%hi) + a1 * c2) + c1 * a2) + c2 * a2
520 
521  t = constant * is
522  a1 = (dble(is) - t) + t
523  a2 = dble(is) - a1
524  DO i=1,n
525  z = ahi(i)/is
526  t = constant * z
527  c1 = (z - t) + t
528  c2 = z - c1
529  qhi = dble(is) * z
530  qlo = (((a1 * c1 - qhi) + a1 * c2) + c1 * a2) + c2 * a2
531  zz = (((ahi(i) - qhi) - qlo) + alo(i)) / is
532  aihi(i) = z + zz
533  ailo(i) = (z - aihi(i)) + zz
534  ENDDO
535 
536  END SUBROUTINE qvdivis
537 
538  SUBROUTINE qvsqrt(AHI,ALO,BHI,BLO,N)
539  USE parkind1 ,ONLY : jpim, jpib, jprb
540  USE parkind2 ,ONLY : jprh
541  INTEGER N
542  REAL(KIND=JPRB) :: AHI(n),ALO(n),BHI(n),BLO(n)
543 
544  INTEGER, PARAMETER :: NBITS = digits(1.0d0)
545  REAL(KIND=JPRB), PARAMETER :: CONSTANT = 2.d0**(nbits-nbits/2)+1.d0
546 
547  REAL(KIND=JPRB) :: A1,A2,C1,C2,T
548  REAL(KIND=JPRB) :: TTHI,TTLO,TT,RES
549  INTEGER I
550 
551 ! longsqrt(a) RESULT(b)
552 ! t = SQRT(a%hi)
553 ! tt = exactmul2(t, t)
554 ! res = (((a%hi - tt%hi) - tt%lo) + a%lo) * 0.5_dp / t
555 ! b%hi = t + res
556 ! b%lo = (t - b%hi) + res
557 
558 ! exactmul2(a, c) RESULT(ac)
559 ! t = constant * a
560 ! a1 = (a - t) + t
561 ! a2 = a - a1
562 ! t = constant * c
563 ! c1 = (c - t) + t
564 ! c2 = c - c1
565 ! ac%hi = a * c
566 ! ac%lo = (((a1 * c1 - ac%hi) + a1 * c2) + c1 * a2) + c2 * a2
567 
568  DO i=1,n
569  tt = sqrt(ahi(i))
570  t = constant * tt
571  a1 = (tt - t) + t
572  a2 = tt - a1
573  t = constant * tt
574  c1 = (tt - t) + t
575  c2 = tt - c1
576  tthi = tt * tt
577  ttlo = (((a1 * c1 - tthi) + a1 * c2) + c1 * a2) + c2 * a2
578  res = (((ahi(i) - tthi) - ttlo) + alo(i)) * 0.5d0 / tt
579  bhi(i) = tt + res
580  blo(i) = (tt - bhi(i)) + res
581  ENDDO
582 
583  END SUBROUTINE qvsqrt
584 #else
585 MODULE quad_emu_mod
586 END MODULE quad_emu_mod
587 #endif
subroutine sqrtivdv(I1, I2, N, X)
external r16vcpqv
integer, parameter jpim
Definition: parkind1.F90:13
subroutine i4vcpqv(I4, AHI, ALO, N)
subroutine qvdivqv(AHI, ALO, CHI, CLO, ACHI, ACLO, N)
external qvsubqv
external qvmulqv
subroutine qvmulqv(AHI, ALO, CHI, CLO, ACHI, ACLO, N)
subroutine qvaddqv(AHI, ALO, CHI, CLO, ACHI, ACLO, N)
subroutine ismulqv(IS, QHI, QLO, QIHI, QILO, N)
subroutine qvcpr16v(AHI, ALO, R16, N)
subroutine qvdivis(AHI, ALO, IS, AIHI, AILO, N)
integer, parameter jprb
Definition: parkind1.F90:32
external qvcpr16v
subroutine r16vcpqv(R16, AHI, ALO, N)
subroutine qaxpy(ALPHA, V1, V2, N)
external qvaddqv
subroutine qxmy(V1, V2, N, V3)
subroutine dvmuldv(A, C, ACHI, ACLO, N)
integer, parameter jprh
Definition: parkind2.F90:17
subroutine qvsubqv(AHI, ALO, CHI, CLO, ACHI, ACLO, N)
integer, parameter jpib
Definition: parkind1.F90:14
subroutine r16scpqv(R16, AHI, ALO, N)
subroutine qvsqrt(AHI, ALO, BHI, BLO, N)
external ismulqv