Line data Source code
1 : !!****m* ABINIT/m_simtet
2 : !! NAME
3 : !! m_simtet
4 : !!
5 : !! FUNCTION
6 : !!
7 : !! COPYRIGHT
8 : !!
9 : !! SOURCE
10 :
11 : #if defined HAVE_CONFIG_H
12 : #include "config.h"
13 : #endif
14 :
15 : #include "abi_common.h"
16 :
17 : module m_simtet
18 :
19 : use defs_basis
20 : use m_errors, only: unused_var
21 :
22 : implicit none
23 :
24 : private
25 :
26 : public :: sim0onei
27 : public :: sim0twoi
28 : !!***
29 :
30 : contains
31 :
32 : !C file: sim0onei.f
33 : !C date: 2011-04-01
34 : !C who: S.Kaprzyk
35 : !C what: Complex linear form integral over standard terahedron
36 : !C ------------------------------------------------------------
37 : !C - * -
38 : !C - * 1 -
39 : !C - SIM0=6 * dt1*dt2*dt3 ---------------------------------- -
40 : !C - * verm(4)+(verm(1)-verm(4))*t1+ ..... -
41 : !C - * -
42 : !C - 0<t1+t2+t3<1 -
43 : !C ------------------------------------------------------------
44 0 : SUBROUTINE SIM0ONEI(SIM0, SIM0I, VERM)
45 :
46 : !IMPLICIT NONE
47 : INTEGER iuerr
48 : PARAMETER (iuerr=6)
49 : DOUBLE COMPLEX SIM0, SIM0I
50 : DOUBLE COMPLEX VERM(4)
51 : !C
52 : DOUBLE COMPLEX SIM, SIMI
53 : LOGICAL LONE(4),LEPS(3)
54 : !c
55 : DOUBLE COMPLEX VERM2D(3)
56 : DOUBLE COMPLEX U(3)
57 : DOUBLE PRECISION AS(3), AL(4)
58 : INTEGER I, I1, I2, I3, K, N
59 : DOUBLE PRECISION ZERO, EPS, SMALL
60 : DATA EPS/1.0D-6/, SMALL/1.0D-5/
61 : DATA ZERO/0.0D0/
62 : !C
63 0 : DO 100 I = 1, 3
64 0 : IF (DIMAG(VERM(4))*DIMAG(VERM(I)).LT.ZERO) THEN
65 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,4)
66 : 9010 FORMAT (' ***sim0onei: not signed ImgVERM()=',4(D13.6,1X))
67 : !c STOP ' ***sim0onei: '
68 : END IF
69 0 : 100 CONTINUE
70 0 : DO 200 I = 1, 4
71 0 : AL(I) = CDABS(VERM(I))
72 0 : 200 CONTINUE
73 0 : DO 300 N = 1, 4
74 0 : IF (AL(N).LT.SMALL) THEN
75 0 : I1 = MOD(N+0,4) + 1
76 0 : I2 = MOD(N+1,4) + 1
77 0 : I3 = MOD(N+2,4) + 1
78 0 : VERM2D(1) = VERM(I1)
79 0 : VERM2D(2) = VERM(I2)
80 0 : VERM2D(3) = VERM(I3)
81 0 : CALL S2D0ONEI(SIM,SIMI,VERM2D)
82 0 : SIM0 = 3*SIM/2
83 0 : SIM0I = SIMI + 1.75D0
84 0 : RETURN
85 : END IF
86 0 : 300 CONTINUE
87 : !c
88 0 : N = 4 ! N = 3, 2, 1
89 0 : DO 201 I = 1, 3
90 0 : IF (CDABS(VERM(I)).GT.CDABS(VERM(N))) N = I
91 0 : 201 CONTINUE
92 : !C
93 : !C Here are 4 cases a), b), c), d); see, Fig.3.1
94 : !C LONE(1..4) [w1<w2<w3<ONE]; [w1<w2<ONE<w3];
95 : !C [w1<ONE<w2<w3]; [ONE<w1<w2<w3]
96 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e]; [|w1-w2|<e,|w3-w2|<e];
97 : !C [|w1-w2|>e,|w3-w2|<e]
98 : !*-ASIS
99 0 : CALL SIM0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
100 : !c U(1) = W(1); U(2) = W(2); U(3) = W(3)
101 0 : IF (LONE(1)) THEN
102 0 : CALL SIM1ONEI(U,AS,LEPS,SIM,SIMI)
103 : END IF
104 : !c U(1) = W(1); U(2) = W(2); U(3) = CONE/W(3)
105 0 : IF (LONE(2)) THEN
106 0 : CALL SIM2ONEI(U,AS,LEPS,SIM,SIMI)
107 : END IF
108 : !c U(1) = W(1); U(2) = CONE/W(2); U(3) = CONE/W(3)
109 0 : IF (LONE(3)) THEN
110 0 : CALL SIM3ONEI(U,AS,LEPS,SIM,SIMI)
111 : END IF
112 : !c U(1) = CONE/W(1); U(2) = CONE/W(2); U(3) = CONE/W(3)
113 0 : IF (LONE(4)) THEN
114 0 : CALL SIM4ONEI(U,AS,LEPS,SIM,SIMI)
115 : END IF
116 0 : SIM0 = 0.75D0*SIM/VERM(N)
117 0 : SIM0I = log(VERM(N)) + 0.25D0*SIMI
118 0 : SIM0I = SIM0I + (0.25D0,0.0D0)
119 0 : RETURN
120 : END SUBROUTINE SIM0ONEI
121 : !C
122 : !C -----------------------------------------------------------------
123 : !C file: sim0twoi.f
124 : !C date: 2011-04-02
125 : !C who: S.Kaprzyk
126 : !C what: Complex linear form integrals over standard tetrahedron
127 : !C ------------------(i=1,2,3)--------------------------------------
128 : !C * -
129 : !C * t_i -
130 : !C VERL(i)=6*dt1dt2dt3 ------------------------------------------ -
131 : !C * VERM(4)+[VERM(1)-VERM(4)]*t1+... -
132 : !C * -
133 : !C 0<t1+t2+t3<1 -
134 : !C -------------------(i=4)-----------------------------------------
135 : !C * -
136 : !C * 1- t1 -t2 - t3 -
137 : !C VERL(4)=6*dt1dt2dt3 ------------------------------------------ -
138 : !C * VERM(4)+[VERM(1)-VERM(4)]*t1+... -
139 : !C * -
140 : !C 0<t1+t2+t3<1 -
141 : !C -----------------------------------------------------------------
142 55164096 : SUBROUTINE SIM0TWOI(VERL, VERLI, VERM)
143 :
144 : !IMPLICIT NONE
145 : INTEGER iuerr
146 : PARAMETER (iuerr=6)
147 : DOUBLE COMPLEX VERL(4), VERLI(4), VERM(4)
148 : !C
149 : DOUBLE COMPLEX SIM, SIMI
150 : DOUBLE COMPLEX VERL2D(3), VERL2DI(3), VERM2D(3)
151 : LOGICAL LONE(4), LEPS(3)
152 : !c
153 : INTEGER I, I1, I2, I3, K, N
154 : DOUBLE PRECISION AS(3), AL(4)
155 : DOUBLE COMPLEX U(3)
156 : DOUBLE COMPLEX CZERO
157 : DOUBLE PRECISION EPS, SMALL
158 : DOUBLE PRECISION ZERO
159 : DATA EPS/1.0D-6/, SMALL/1.0D-5/
160 : DATA ZERO/0.0D0/
161 : !C
162 55164096 : CZERO = (0.0D0,0.0D0)
163 220656384 : DO 50 I = 1, 3
164 165492288 : IF (DIMAG(VERM(4))*DIMAG(VERM(I)).LT.ZERO) THEN
165 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,4)
166 : 9010 FORMAT (' ***sim0twoi: not signed ImgVERM()=',4(D13.6,1X))
167 : !c STOP ' ***sim0twoi: '
168 : END IF
169 55164096 : 50 CONTINUE
170 275820480 : DO 200 I = 1, 4
171 220656384 : AL(I) = CDABS(VERM(I))
172 55164096 : 200 CONTINUE
173 : !c
174 275820480 : DO 100 N = 1, 4
175 220656384 : VERL(N) = CZERO
176 220656384 : VERLI(N) = CZERO
177 220656384 : I1 = MOD(N+0,4) + 1
178 220656384 : I2 = MOD(N+1,4) + 1
179 220656384 : I3 = MOD(N+2,4) + 1
180 220656384 : IF (AL(I1).LT.SMALL) THEN
181 0 : VERM2D(1) = VERM(I2)
182 0 : VERM2D(2) = VERM(I3)
183 0 : VERM2D(3) = VERM(N)
184 0 : CALL S2D0TWOI(VERL2D,VERL2DI,VERM2D)
185 0 : VERL(N) = VERL2D(3)
186 0 : VERLI(N) = VERL2DI(3)*3/4
187 0 : GO TO 100
188 : END IF
189 220656384 : IF (AL(I2).LT.SMALL) THEN
190 0 : VERM2D(1) = VERM(I3)
191 0 : VERM2D(2) = VERM(N)
192 0 : VERM2D(3) = VERM(I1)
193 0 : CALL S2D0TWOI(VERL2D,VERL2DI,VERM2D)
194 0 : VERL(N) = VERL2D(2)
195 0 : VERLI(N) = VERL2DI(2)*3/4
196 0 : GO TO 100
197 : END IF
198 220656384 : IF (AL(I3).LT.SMALL) THEN
199 0 : VERM2D(1) = VERM(N)
200 0 : VERM2D(2) = VERM(I1)
201 0 : VERM2D(3) = VERM(I2)
202 0 : CALL S2D0TWOI(VERL2D,VERL2DI,VERM2D)
203 0 : VERL(N) = VERL2D(1)
204 0 : VERLI(N) = VERL2DI(1)*3/4
205 0 : GO TO 100
206 : END IF
207 220656384 : IF (AL(N).LT.SMALL) THEN
208 0 : VERM2D(1) = VERM(I1)
209 0 : VERM2D(2) = VERM(I2)
210 0 : VERM2D(3) = VERM(I3)
211 0 : CALL S2D0ONEI(SIM,SIMI,VERM2D)
212 0 : VERL(N) = SIM/2
213 0 : VERLI(N) = SIMI/4 +1.75D0
214 0 : GO TO 100
215 : END IF
216 : !C Here are 4 cases a), b), c), d); see, Fig.3.1
217 : !C LONE(1..4) [w1<w2<w3<ONE]; [w1<w2<ONE<w3];
218 : !C [w1<ONE<w2<w3]; [ONE<w1<w2<w3]
219 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e]; [|w1-w2|<e,|w3-w2|<e];
220 : !C [|w1-w2|>e,|w3-w2|<e]
221 : !*-ASIS
222 220656384 : CALL SIM0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
223 : !c U(1) = W(1); U(2) = W(2); U(3) = W(3)
224 220656384 : IF (LONE(1)) THEN
225 209614532 : CALL SIM1TWOI(U,AS,LEPS,SIM,SIMI)
226 : END IF
227 : !c U(1) = W(1); U(2) = W(2); U(3) = CONE/W(3)
228 220656384 : IF (LONE(2)) THEN
229 6337479 : CALL SIM2TWOI(U,AS,LEPS,SIM,SIMI)
230 : END IF
231 : !c U(1) = W(1); U(2) = CONE/W(2); U(3) = CONE/W(3)
232 220656384 : IF (LONE(3)) THEN
233 2626200 : CALL SIM3TWOI(U,AS,LEPS,SIM,SIMI)
234 : END IF
235 : !c U(1) = CONE/W(1); U(2) = CONE/W(2); U(3) = CONE/W(3)
236 220656384 : IF (LONE(4)) THEN
237 2078173 : CALL SIM4TWOI(U,AS,LEPS,SIM,SIMI)
238 : END IF
239 : !c
240 220656384 : VERL(N) = SIM/VERM(N)/8
241 220656384 : VERLI(N) = log(VERM(N))/4 + SIMI/32
242 220656384 : VERLI(N) = VERLI(N) + (0.25D0,0.0D0)
243 55164096 : 100 CONTINUE ! end DO ... N = 1, 4
244 55164096 : RETURN
245 : END SUBROUTINE SIM0TWOI
246 : !C
247 : !C ---------------------------------------------------------------------
248 : !C file: sim0ur0.f
249 : !C date: 2011-03-16
250 : !C who: S.Kaprzyk
251 : !C what: R0(U)=Arth(w)/w=(ln(1+U)-ln(1-U))/(2*U)
252 : !C what: R0(U)= 1 + U^2/3 + U^4/5 + ...
253 0 : DOUBLE COMPLEX FUNCTION SIM0UR0(U)
254 :
255 : !IMPLICIT NONE
256 : DOUBLE COMPLEX U
257 : !c
258 : !c DOUBLE PRECISION DLAMCH
259 : !c EXTERNAL DLAMCH
260 : !c
261 : INTEGER K
262 : DOUBLE COMPLEX AV, BV, CV, UU
263 : DOUBLE COMPLEX CONE
264 : DOUBLE PRECISION DEV, TOL
265 : DATA TOL /1.0D-13/
266 : !c
267 : !c TOL = DLAMCH('e')*10
268 0 : CONE = (1.0D0,0.0D0)
269 0 : UU = U*U
270 0 : IF (CDABS(U).GT.0.27D0) THEN
271 0 : SIM0UR0 = log((CONE+U)/(CONE-U))/(2*U)
272 : !c SIM0UR0 = (log(CONE+U)-log(CONE-U))/(2*U)
273 : ELSE
274 : CV = UU
275 : AV = CONE
276 0 : DO 50 K = 3, 13, 2
277 0 : AV = AV + CV/DBLE(K)
278 0 : CV = CV*UU
279 0 : 50 CONTINUE
280 0 : DO 100 K = 15, 49, 2
281 0 : BV = CV/DBLE(K)
282 0 : AV = AV + BV
283 0 : DEV = CDABS(BV)
284 0 : IF (DEV.LE.TOL*CDABS(AV)) GO TO 150
285 0 : CV = CV*UU
286 0 : 100 CONTINUE
287 0 : WRITE (std_out,9010) U, DEV, TOL
288 : 9010 FORMAT ('***sim0ur0: U=',2(D15.8,1X),' DEV=',D14.7,' TOL=',D14.7)
289 0 : STOP '***sim0ur0: accuracy not reached'
290 : 150 CONTINUE
291 : SIM0UR0 = AV
292 : END IF
293 : !C
294 : RETURN
295 : END FUNCTION SIM0UR0
296 : !C
297 : !C ----------------------------------------------------------------------
298 : !C file: sim0ux0.f
299 : !C date: 2010-08-17
300 : !C who: S.Kaprzyk
301 : !C what: Complex version of X0(U)=(R0(U)/U-1-U^2/3-U^4/5)/U^6
302 : !C R0(U)=Arth(w)/w=Log((1+U)/(1-U))/(2*U)
303 661969152 : DOUBLE COMPLEX FUNCTION SIM0UX0(U)
304 :
305 : !IMPLICIT NONE
306 : DOUBLE COMPLEX U
307 : !c
308 : !c DOUBLE PRECISION DLAMCH
309 : !c EXTERNAL DLAMCH
310 : !c
311 : INTEGER K
312 : DOUBLE COMPLEX AV, CV, UU
313 : DOUBLE COMPLEX CONE
314 : DOUBLE PRECISION DEV, TOL
315 : DATA TOL /1.0D-13/
316 : !c TOL = DLAMCH('e')*10
317 661969152 : CONE = (1.0D0,0.0D0)
318 661969152 : UU = U*U
319 661969152 : IF (CDABS(U).GT.0.27D0) THEN
320 52466800 : SIM0UX0 =(log((CONE+U)/(CONE-U))/(2*U) - (CONE+UU*(CONE/3.0D0+UU*CONE/5.0D0)))/(UU*UU*UU)
321 : ELSE
322 : CV = UU
323 : AV = CONE/7.0D0
324 1828507056 : DO 50 K = 9, 13, 2
325 1828507056 : AV = AV + CV/DBLE(K)
326 1828507056 : CV = CV*UU
327 609502352 : 50 CONTINUE
328 867229108 : DO 100 K = 15, 49, 2
329 1476731460 : AV = AV + CV/DBLE(K)
330 1476731460 : DEV = CDABS(CV/AV)/DBLE(K)
331 1476731460 : CV = CV*UU
332 1476731460 : IF (DEV.LE.TOL) GO TO 150
333 0 : 100 CONTINUE
334 0 : WRITE (std_out,9010) U, DEV, TOL
335 : 9010 FORMAT ('***sim0ux0: U=',2(D15.8,1X), ' DEV=',D14.7,' TOL=',D14.7)
336 0 : STOP '***sim0ux0: accuracy not reached'
337 : 150 CONTINUE
338 : SIM0UX0 = AV
339 : END IF
340 : !C
341 : RETURN
342 : END FUNCTION SIM0UX0
343 : !C
344 : !C ----------------------------------------------------------------------
345 : !C file: sim0udx0.f
346 : !C date: 2010-08-17
347 : !C who: S.Kaprzyk
348 : !C what: Complex version of DX0(u)=dX0/du
349 55560960 : SUBROUTINE SIM0UDX0(U, X0, DX0)
350 :
351 : !IMPLICIT NONE
352 : DOUBLE COMPLEX U, X0, DX0(4)
353 : !c
354 : INTEGER I
355 : DOUBLE COMPLEX AV, BV, CV, DV
356 : DOUBLE COMPLEX CZERO, CONE
357 : !C
358 55560960 : CZERO = (0.0D0,0.0D0)
359 55560960 : CONE = (1.0D0,0.0D0)
360 : !c
361 55560960 : AV = U
362 55560960 : BV = AV*AV
363 55560960 : IF (CDABS(BV).GE.0.37D0) THEN
364 1358638 : BV = CONE/(CONE-BV)
365 1358638 : CV = BV*BV
366 1358638 : DX0(1) = (BV-7.0D0*X0)/AV
367 1358638 : DX0(2) = 2.0D0*(CV-4.0D0*DX0(1)/AV)
368 1358638 : DX0(3) = 8.0D0*AV*CV*BV + (2.0D0*CV-9.0D0*DX0(2))/AV
369 1358638 : DX0(4) = 24.0D0*CV*BV*(CONE+2.0D0*AV*AV*BV) - 10.0D0*DX0(3)/AV
370 : ELSE
371 54202322 : DX0(3) = CZERO
372 54202322 : DX0(2) = (2.0D0,0.0D0)/9.0D0
373 54202322 : DX0(1) = DX0(2)*AV
374 54202322 : DX0(4) = (24.0D0,0.0D0)/11.0D0
375 54202322 : CV = AV
376 54202322 : BV = AV*AV
377 54202322 : DO 50 I = 2, 48, 2
378 1300855728 : DV = DBLE(2+I)/DBLE(9+I)*CV
379 1300855728 : DX0(4) = DX0(4) + DBLE((4+I)*(3+I)*(2+I)*(1+I))/DBLE(11+I)*CV*AV
380 1300855728 : DX0(3) = DX0(3) + DBLE((1+I)*I)*DV
381 1300855728 : DX0(2) = DX0(2) + DBLE(1+I)*DV*AV
382 1300855728 : DX0(1) = DX0(1) + DV*BV
383 1300855728 : CV = CV*BV
384 54202322 : 50 CONTINUE
385 : END IF
386 : !C
387 55560960 : RETURN
388 : END SUBROUTINE SIM0UDX0
389 : !C
390 : !C ----------------------------------------------------------------------
391 : !C file: sim1onei.f
392 : !C date: 2010-09-22
393 : !C who: S.Kaprzyk
394 : !C what: CASE a): [w1<w2<w3<ONE]
395 : !C U(1)=W(1); U(2)=W(2); U(3)=W(3)
396 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
397 : !C [|w1-w2|<e,|w3-w2|<e];
398 : !C [|w1-w2|>e,|w3-w2|<e]
399 0 : SUBROUTINE SIM1ONEI(U, AS, LEPS, SIM1, SIM1I)
400 :
401 : !IMPLICIT NONE
402 : DOUBLE COMPLEX U(3)
403 : DOUBLE PRECISION AS(3)
404 : LOGICAL LEPS(3)
405 : DOUBLE COMPLEX SIM1, SIM1I
406 : !C
407 : !DOUBLE COMPLEX SIM0UX0
408 : !EXTERNAL SIM0UX0
409 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
410 : DOUBLE COMPLEX R0(3), QR0(3)
411 : DOUBLE COMPLEX S0(3), QS0(3)
412 : DOUBLE COMPLEX AV, BV, CV, DU, G(5)
413 : INTEGER I, K !, N
414 : DOUBLE COMPLEX CZERO, CONE
415 : DOUBLE PRECISION ZERO, ONE
416 : DATA ZERO/0.0D0/, ONE/1.0D0/
417 : !C
418 : ABI_UNUSED(as)
419 :
420 0 : CZERO = (0.0D0,0.0D0)
421 0 : CONE = (1.0D0,0.0D0)
422 : !C ------------------------------------------------------------------
423 : !C R0(U) = ARTH(U)/U
424 : !C R0(U) = 1+U**2/3+U**6*X0(U)
425 : !C ------------------------------------------------------------------
426 0 : DO 100 I = 1, 3
427 0 : AV = U(I)*U(I)
428 0 : X0(I) = SIM0UX0(U(I))
429 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
430 0 : S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
431 0 : 100 CONTINUE
432 : !C -----------------------------------------------------------------
433 : !C - The DX0(I) contains derivatives of the function X0(u) -
434 : !C -----------------------------------------------------------------
435 0 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
436 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
437 : END IF
438 0 : DO 200 I = 1, 3, 2
439 0 : DU = U(I) - U(2)
440 0 : IF (.NOT.LEPS(I)) THEN
441 0 : QX0(I) = (X0(I)-X0(2))/DU
442 : ELSE
443 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*DU) *DU)*DU
444 : END IF
445 0 : AV = U(I)
446 0 : G(1) = U(I) + U(2)
447 0 : DO 150 K = 2, 5
448 0 : AV = AV*U(I)
449 0 : G(K) = G(K-1)*U(2) + AV
450 0 : 150 CONTINUE
451 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
452 0 : QS0(I) = (-S0(2)-R0(2)+(CONE-U(I))*QR0(I))/(CONE+U(I))
453 0 : 200 CONTINUE ! end DO ... I = 1, 3, 2
454 0 : IF (LEPS(2)) THEN
455 : !*-ASIS
456 : QX0(2) = DX0(2)/2.0D0 + DX0(3)*(U(1)+U(3)-2.0D0*U(2))/6.0D0+ &
457 : & DX0(4)*((U(3)-U(2))*(U(3)-U(2))+(U(1)-U(2))*(U(1)-U(2))+ &
458 0 : & (U(3)-U(2))*(U(1)-U(2)))/24.0D0
459 : ELSE
460 0 : QX0(2) = (QX0(3)-QX0(1))/(U(3)-U(1))
461 : END IF
462 0 : AV = U(1)
463 0 : G(1) = U(1) + U(3)
464 0 : DO 300 K = 2, 5
465 0 : AV = AV*U(1)
466 0 : G(K) = G(K-1)*U(3) + AV
467 0 : 300 CONTINUE
468 : !*-ASIS
469 : QR0(2) = CONE/3.0D0 + (G(2)+U(2)*(U(2)+G(1)))/5.0D0 + &
470 : & (G(4)+U(2)*(G(3)+U(2)*(G(2)+U(2)*(G(1)+U(2)))))*X0(2)+ &
471 0 : & G(5)*QX0(3) + AV*U(1)*QX0(2)
472 0 : QS0(2) = (-QS0(3)-QR0(3)+(CONE-U(1))*QR0(2))/(CONE+U(1))
473 : !c
474 0 : AV = (CONE+U(1))*(CONE+U(2))*(CONE+U(3))
475 0 : BV = U(3) + U(1) - (2.0D0,0.0D0)
476 0 : CV = (CONE-U(1))*(CONE-U(1))
477 0 : SIM1 = AV*(R0(2)+QR0(3)*BV+QR0(2)*CV)
478 0 : SIM1I = AV*(S0(2)+QS0(3)*BV+QS0(2)*CV)
479 0 : RETURN
480 : END SUBROUTINE SIM1ONEI
481 : !C
482 : !C ----------------------------------------------------------------------
483 : !C file: sim1twoi.f
484 : !C date: 2010-09-22
485 : !C who: S.Kaprzyk
486 : !C what: CASE a): [w1<w2<w3<ONE]
487 : !C U(1)=W(1); U(2)=W(2); U(3)=W(3)
488 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
489 : !C [|w1-w2|<e,|w3-w2|<e];
490 : !C [|w1-w2|>e,|w3-w2|<e]
491 209614532 : SUBROUTINE SIM1TWOI(U, AS, LEPS, SIM, SIMI)
492 :
493 : !IMPLICIT NONE
494 : DOUBLE COMPLEX U(3)
495 : DOUBLE PRECISION AS(3)
496 : LOGICAL LEPS(3)
497 : DOUBLE COMPLEX SIM, SIMI
498 : !C
499 : !DOUBLE COMPLEX SIM0UX0
500 : !EXTERNAL SIM0UX0
501 : !c
502 : DOUBLE COMPLEX R4(3), X0(3), DX0(4)
503 : DOUBLE COMPLEX QR4(3), QX0(3)
504 : DOUBLE COMPLEX S4(3), QS4(3)
505 : DOUBLE COMPLEX AV, BV, CV, UV, G(5)
506 : INTEGER I, K
507 : DOUBLE COMPLEX CZERO, CONE, CTWO
508 : DOUBLE PRECISION ZERO, ONE
509 : DATA ZERO/0.0D0/, ONE/1.0D0/
510 : !C
511 : ABI_UNUSED(as)
512 209614532 : CZERO = (0.0D0,0.0D0)
513 209614532 : CONE = (1.0D0,0.0D0)
514 209614532 : CTWO = (2.0D0,0.0D0)
515 : !C -----------------------------------------------------------------
516 : !C - -
517 : !C - R4(W)=1+(W-1)*(ARTH(W)/W-1)/W -
518 : !C - R4(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
519 : !C - -
520 : !C -----------------------------------------------------------------
521 838458128 : DO 100 I = 1, 3
522 628843596 : AV = U(I)
523 628843596 : X0(I) = SIM0UX0(AV)
524 : !*-ASIS
525 : R4(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
526 628843596 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
527 628843596 : S4(I) = (CONE-U(I))/(CONE+U(I))*R4(I)
528 209614532 : 100 CONTINUE
529 : !C -----------------------------------------------------------------
530 : !C - The DX0(I) Contains Derivatives Of The Function X0(W) -
531 : !C -----------------------------------------------------------------
532 209614532 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
533 53619796 : CALL SIM0UDX0(U(2),X0(2),DX0)
534 : END IF
535 : !C
536 419229064 : DO 200 I = 1, 3, 2
537 419229064 : UV = U(I) - U(2)
538 419229064 : IF (LEPS(I)) THEN
539 53619796 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UV) *UV)*UV
540 : ELSE
541 365609268 : QX0(I) = (X0(I)-X0(2))/UV
542 : END IF
543 419229064 : AV = U(I)
544 419229064 : G(1) = U(I) + U(2)
545 2096145320 : DO 150 K = 2, 5
546 1676916256 : AV = AV*U(I)
547 1676916256 : G(K) = G(K-1)*U(2) + AV
548 419229064 : 150 CONTINUE
549 : QR4(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + G(3) &
550 419229064 : & /5.0D0 + (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
551 419229064 : QS4(I) = (-S4(2)-R4(2)+(CONE-U(I))*QR4(I))/(CONE+U(I))
552 209614532 : 200 CONTINUE ! DO 750 I = 1, 3, 2
553 209614532 : IF (LEPS(2)) THEN
554 : !*-ASIS
555 : QX0(2) = DX0(2)/2.0D0 + DX0(3)*(U(1)+U(3)-2.0D0*U(2))/6.0D0 + &
556 : & DX0(4)*((U(3)-U(2))*(U(3)-U(2))+(U(1)-U(2))*(U(1)-U(2))+ &
557 0 : & (U(3)-U(2))*(U(1)-U(2)))/24.0D0
558 : ELSE
559 209614532 : QX0(2) = (QX0(3)-QX0(1))/(U(3)-U(1))
560 : END IF
561 209614532 : AV = U(1)
562 209614532 : G(1) = U(1) + U(3)
563 1048072660 : DO 300 K = 2, 5
564 838458128 : AV = AV*U(1)
565 838458128 : G(K) = G(K-1)*U(3) + AV
566 209614532 : 300 CONTINUE
567 : !*-ASIS
568 : QR4(2) = CONE/3.0D0- (U(2)+G(1))/5.0D0 + &
569 : & (G(2)+U(2)*(U(2)+G(1)))/5.0D0 + &
570 : & (G(4)+(U(2)-CONE)*(G(3) + G(2)*U(2) + G(1)*U(2)*U(2) + &
571 : & U(2)*U(2)*U(2)))*X0(2) + (G(5)-G(4))*QX0(3) + &
572 209614532 : & (U(1)-CONE)*AV*QX0(2)
573 209614532 : QS4(2) = (-QS4(3)-QR4(3)+(CONE-U(1))*QR4(2))/(CONE+U(1))
574 : !c
575 209614532 : AV = (CONE+U(1))*(CONE+U(2))*(CONE+U(3))
576 209614532 : BV = U(3) + U(1) - (2.0D0,0.0D0)
577 209614532 : CV = (CONE-U(1))*(CONE-U(1))
578 209614532 : SIM = AV*(R4(2)+QR4(3)*BV+QR4(2)*CV)
579 209614532 : SIMI = AV*(S4(2)+QS4(3)*BV+QS4(2)*CV)
580 209614532 : RETURN
581 : END SUBROUTINE SIM1TWOI
582 : !C
583 : !C ----------------------------------------------------------------------
584 : !C file: sim2onei.f
585 : !C date: 2010-08-19
586 : !C who: S.Kaprzyk
587 : !C what: CASE b) : [w1<w2<ONE<w3]
588 : !C U(1)=W(1); U(2)=W(2); U(3)=CONE/W(3)
589 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
590 : !C [|w1-w2|<e,|w3-w2|<e];
591 : !C [|w1-w2|>e,|w3-w2|<e]
592 0 : SUBROUTINE SIM2ONEI(U,AS,LEPS, SIM2, SIM2I)
593 :
594 : !IMPLICIT NONE
595 : DOUBLE COMPLEX U(3)
596 : DOUBLE PRECISION AS(3)
597 : LOGICAL LEPS(3)
598 : DOUBLE COMPLEX SIM2, SIM2I
599 : !c
600 : !DOUBLE COMPLEX SIM0UX0
601 : !EXTERNAL SIM0UX0
602 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
603 : DOUBLE COMPLEX R0(3), QR0(3)
604 : DOUBLE COMPLEX S0(3), QS0(3)
605 : DOUBLE COMPLEX AV, BV, CV, DV, G(5)
606 : DOUBLE COMPLEX UD
607 : INTEGER I, K !, N
608 : DOUBLE COMPLEX CZERO, CONE, CTWO
609 : DOUBLE PRECISION ZERO, ONE
610 : DATA ZERO/0.0D0/, ONE/1.0D0/
611 : !C
612 0 : CZERO = (0.0D0,0.0D0)
613 0 : CONE = (1.0D0,0.0D0)
614 0 : CTWO = (2.0D0,0.0D0)
615 : !C ------------------------------------------------------------------
616 : !C R0(U) = ARTH(U)/U
617 : !C R0(U) = 1+U**2/3+U**6*X0(U)
618 : !C ------------------------------------------------------------------
619 0 : DO 100 I = 1, 3
620 0 : AV = U(I)*U(I)
621 0 : X0(I) = SIM0UX0(U(I))
622 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
623 0 : S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
624 0 : 100 CONTINUE
625 : !C -----------------------------------------------------------------
626 : !C - THE DX0(I) CONTAINS DERIVATIVES OF THE FUNCTION X0(W) -
627 : !C -----------------------------------------------------------------
628 0 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
629 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
630 : END IF
631 : !c DO 400 I = 1, 3, 2
632 0 : I = 1
633 0 : UD = U(I) - U(2)
634 0 : IF (.NOT.LEPS(I)) THEN
635 0 : QX0(I) = (X0(I)-X0(2))/UD
636 : ELSE
637 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UD) *UD)*UD
638 : END IF
639 0 : AV = U(I)
640 0 : G(1) = U(I) + U(2)
641 0 : DO 200 K = 2, 5
642 0 : AV = AV*U(I)
643 0 : G(K) = G(K-1)*U(2) + AV
644 0 : 200 CONTINUE
645 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
646 0 : QS0(I) = (-S0(2)-R0(2)+(CONE-U(I))*QR0(I))/(CONE+U(I))
647 : !c 400 CONTINUE ! end DO ... I = 1, 3, 2
648 0 : AV = (CONE+U(1))*(CONE+U(2))*(U(3)+CONE) /((U(3)*U(1)-CONE)*(U(3)*U(2)-CONE))
649 0 : BV = CTWO - (U(1)+U(2)) - U(3)*(CONE-U(1)*U(2))
650 0 : CV = (U(3)*U(2)-CONE)*(CONE-U(1))**2
651 0 : DV = (U(3)-CONE)**2
652 0 : SIM2 = AV*(BV*R0(2)+CV*QR0(1)+DV*(DCMPLX(ZERO,AS(3))+U(3)*R0(3)))
653 0 : DV = DV*(U(3)-CONE)/(U(3)+CONE)
654 0 : SIM2I = AV*(BV*S0(2)+CV*QS0(1)+DV*(DCMPLX(ZERO,AS(3))+U(3)*R0(3)))
655 : !c
656 0 : RETURN
657 : END SUBROUTINE SIM2ONEI
658 : !C
659 : !C ----------------------------------------------------------------------
660 : !C file: sim2twoi.f
661 : !C date: 2010-08-19
662 : !C who: S.Kaprzyk
663 : !C what: CASE b) : [w1<w2<ONE<w3]
664 : !C U(1)=W(1); U(2)=W(2); U(3)=CONE/W(3)
665 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
666 : !C [|w1-w2|<e,|w3-w2|<e];
667 : !C [|w1-w2|>e,|w3-w2|<e]
668 6337479 : SUBROUTINE SIM2TWOI(U,AS,LEPS, SIM, SIMI)
669 :
670 : !IMPLICIT NONE
671 : DOUBLE COMPLEX U(3)
672 : DOUBLE PRECISION AS(3)
673 : LOGICAL LEPS(3)
674 : DOUBLE COMPLEX SIM, SIMI
675 : !C
676 : !DOUBLE COMPLEX SIM0UX0
677 : !EXTERNAL SIM0UX0
678 : !c
679 : DOUBLE COMPLEX R4(3), QR4(3)
680 : DOUBLE COMPLEX S4(3), QS4(3)
681 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4), G(5)
682 : DOUBLE COMPLEX AV, BV, CV, DV, UV
683 : INTEGER I, K
684 : DOUBLE COMPLEX CZERO, CONE, CTWO
685 : DOUBLE PRECISION ZERO, ONE
686 : DATA ZERO/0.0D0/, ONE/1.0D0/
687 : !C
688 6337479 : CZERO = (0.0D0,0.0D0)
689 6337479 : CONE = (1.0D0,0.0D0)
690 6337479 : CTWO = (2.0D0,0.0D0)
691 : !C -----------------------------------------------------------------
692 : !C - -
693 : !C - R4(W)=1+(W-1)*(ARTH(W)/W-1)/W -
694 : !C - R4(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
695 : !C - -
696 : !C -----------------------------------------------------------------
697 25349916 : DO 100 I = 1, 3
698 19012437 : AV = U(I)
699 19012437 : X0(I) = SIM0UX0(AV)
700 : !*-ASIS
701 : R4(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
702 19012437 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
703 19012437 : S4(I) = (CONE-U(I))/(CONE+U(I))*R4(I)
704 6337479 : 100 CONTINUE
705 : !C -----------------------------------------------------------------
706 : !C - The DX0(I) Contains Derivatives Of The Function X0(W) -
707 : !C -----------------------------------------------------------------
708 6337479 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
709 716892 : CALL SIM0UDX0(U(2),X0(2),DX0)
710 : END IF
711 : !c DO 200 I = 1, 3, 2
712 6337479 : I = 1
713 6337479 : UV = U(I) - U(2)
714 6337479 : IF (LEPS(I)) THEN
715 716892 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UV) *UV)*UV
716 : ELSE
717 5620587 : QX0(I) = (X0(I)-X0(2))/UV
718 : END IF
719 6337479 : AV = U(I)
720 6337479 : G(1) = U(I) + U(2)
721 31687395 : DO 200 K = 2, 5
722 25349916 : AV = AV*U(I)
723 25349916 : G(K) = G(K-1)*U(2) + AV
724 6337479 : 200 CONTINUE
725 : !*-ASIS
726 : QR4(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + &
727 6337479 : & G(3) /5.0D0 + (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
728 6337479 : QS4(I) = (-S4(2)-R4(2)+(CONE-U(I))*QR4(I))/(CONE+U(I))
729 : !c 200 CONTINUE ! DO ... I = 1, 3, 2
730 : AV = (CONE+U(1))*(CONE+U(2))*(U(3)+CONE) &
731 6337479 : & /((U(3)*U(1)-CONE)*(U(3)*U(2)-CONE))
732 6337479 : BV = CTWO - (U(1)+U(2)) - U(3)*(CONE-U(1)*U(2))
733 6337479 : CV = (U(3)*U(2)-CONE)*(CONE-U(1))**2
734 6337479 : DV = (U(3)-CONE)**2
735 : SIM = AV*(BV*R4(2)+CV*QR4(1) &
736 6337479 : & +DV*((CONE-U(3))*DCMPLX(ZERO,AS(3))+CONE+U(3)-U(3)*U(3)*R4(3)))
737 6337479 : DV = DV*(U(3)-CONE)/(U(3)+CONE)
738 : SIMI = AV*(BV*S4(2)+CV*QS4(1) &
739 6337479 : & +DV*((CONE-U(3))*DCMPLX(ZERO,AS(3))+CONE+U(3)-U(3)*U(3)*R4(3)))
740 : !C
741 6337479 : RETURN
742 : END SUBROUTINE SIM2TWOI
743 : !C
744 : !C ----------------------------------------------------------------------
745 : !C file: sim3onei.f
746 : !C date: 2010-08-19
747 : !C who: S.Kaprzyk
748 : !C what: CASE c) : [w1<ONE<w2<w3]
749 : !C U(1)=W(1); U(2)=CONE/W(2); U(3)=CONE/W(3)
750 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
751 : !C [|w1-w2|<e,|w3-w2|<e];
752 : !C [|w1-w2|>e,|w3-w2|<e]
753 0 : SUBROUTINE SIM3ONEI(U,AS,LEPS,SIM3,SIM3I)
754 :
755 : !IMPLICIT NONE
756 : DOUBLE COMPLEX U(3)
757 : DOUBLE PRECISION AS(3)
758 : LOGICAL LEPS(3)
759 : DOUBLE COMPLEX SIM3, SIM3I
760 : !C
761 : !DOUBLE COMPLEX SIM0UX0
762 : !EXTERNAL SIM0UX0
763 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
764 : DOUBLE COMPLEX R0(3), QR0(3)
765 : DOUBLE COMPLEX S0(3), QS0(3)
766 : DOUBLE COMPLEX AV, BV, CV, DV, UD, G(5)
767 : INTEGER I, K !, N
768 : DOUBLE COMPLEX CZERO, CONE, CTWO, CIMAG
769 : DOUBLE PRECISION ZERO, ONE
770 : DATA ZERO/0.0D0/, ONE/1.0D0/
771 : !C
772 0 : CZERO = (0.0D0,0.0D0)
773 0 : CONE = (1.0D0,0.0D0)
774 0 : CTWO = (2.0D0,0.0D0)
775 0 : CIMAG = (0.0D0,1.0D0)
776 : !C ------------------------------------------------------------------
777 : !C R0(U) = ARTH(U)/U
778 : !C R0(U) = 1+U**2/3+U**6*X0(U)
779 : !C ------------------------------------------------------------------
780 0 : DO 100 I = 1, 3
781 0 : AV = U(I)*U(I)
782 0 : X0(I) = SIM0UX0(U(I))
783 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
784 : !c S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
785 0 : 100 CONTINUE
786 : !C -----------------------------------------------------------------
787 : !C - THE DX0(I) CONTAINS DERIVATIVES OF THE FUNCTION X0(U) -
788 : !C -----------------------------------------------------------------
789 0 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
790 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
791 : END IF
792 : !c DO 400 I = 1, 3, 2
793 0 : I = 3
794 0 : UD = U(I) - U(2)
795 0 : IF (.NOT.LEPS(I)) THEN
796 0 : QX0(I) = (X0(I)-X0(2))/UD
797 : ELSE
798 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UD) *UD)*UD
799 : END IF
800 0 : AV = U(I)
801 0 : G(1) = U(I) + U(2)
802 0 : DO 200 K = 2, 5
803 0 : AV = AV*U(I)
804 0 : G(K) = G(K-1)*U(2) + AV
805 0 : 200 CONTINUE
806 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
807 : !c 400 CONTINUE ! end DO ... I = 1, 3, 2
808 0 : QR0(3) = R0(2) + U(3)*QR0(3)
809 0 : IF (.NOT.LEPS(3)) THEN
810 0 : QR0(3) = QR0(3) + DCMPLX(ZERO,(AS(3)-AS(2)))/(U(3)-U(2))
811 : END IF
812 0 : R0(2) = DCMPLX(ZERO,AS(2)) + U(2)*R0(2)
813 0 : AV = (ONE+U(1))*(U(2)+CONE)*(U(3)+CONE) /((U(1)*U(2)-CONE)*(U(1)*U(3)-CONE))
814 0 : BV = (CONE-U(1))**2
815 0 : CV = CTWO - (U(2)+U(3)) - U(1)*(CONE-U(2)*U(3))
816 0 : DV = (U(1)*U(2)-CONE)*(U(3)-CONE)**2
817 0 : SIM3 = AV*(BV*R0(1)+CV*R0(2)+DV*QR0(3))
818 : !c
819 0 : S0(1) = (CONE-U(1))/(CONE+U(1))*R0(1)
820 0 : S0(2) = (U(2)-CONE)/(U(2)+CONE)*R0(2)
821 0 : QS0(3) = (-S0(2)+R0(2)+(U(3)-CONE)*QR0(3))/(U(3)+CONE)
822 0 : SIM3I = AV*(BV*S0(1)+CV*S0(2)+DV*QS0(3))
823 : !c
824 0 : RETURN
825 : END SUBROUTINE SIM3ONEI
826 : !C
827 : !C ----------------------------------------------------------------------
828 : !C file: sim3twoi.f
829 : !C date: 2010-08-19
830 : !C who: S.Kaprzyk
831 : !C what: CASE c) : [w1<ONE<w2<w3]
832 : !C U(1)=W(1); U(2)=CONE/W(2); U(3)=CONE/W(3)
833 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
834 : !C [|w1-w2|<e,|w3-w2|<e];
835 : !C [|w1-w2|>e,|w3-w2|<e]
836 2626200 : SUBROUTINE SIM3TWOI(U,AS,LEPS,SIM,SIMI)
837 :
838 : !IMPLICIT NONE
839 : DOUBLE COMPLEX U(3)
840 : DOUBLE PRECISION AS(3)
841 : LOGICAL LEPS(3)
842 : DOUBLE COMPLEX SIM, SIMI
843 : !C
844 : !DOUBLE COMPLEX SIM0UX0
845 : !EXTERNAL SIM0UX0
846 : !C
847 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
848 : DOUBLE COMPLEX R4(3), QR4(3)
849 : DOUBLE COMPLEX S4(3), QS4(3)
850 : DOUBLE COMPLEX AV, BV, CV, DV, UV, G(5)
851 : INTEGER I, K
852 : DOUBLE COMPLEX CZERO, CONE, CIMAG, CTWO
853 : DOUBLE PRECISION ZERO, ONE
854 : DATA ZERO/0.0D0/, ONE/1.0D0/
855 : !C
856 2626200 : CZERO = (0.0D0,0.0D0)
857 2626200 : CIMAG = (0.0D0,1.0D0)
858 2626200 : CONE = (1.0D0,0.0D0)
859 2626200 : CTWO = (2.0D0,0.0D0)
860 : !C -----------------------------------------------------------------
861 : !C - -
862 : !C - R4(W)=1+(W-1)*(ARTH(W)/W-1)/W -
863 : !C - R4(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
864 : !C - -
865 : !C -----------------------------------------------------------------
866 10504800 : DO 100 I = 1, 3
867 7878600 : AV = U(I)
868 7878600 : X0(I) = SIM0UX0(AV)
869 : !*-ASIS
870 : R4(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
871 7878600 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
872 2626200 : 100 CONTINUE ! end DO 350 I = 1, 3
873 : !C -----------------------------------------------------------------
874 : !C - The DX0(I) Contains Derivatives Of The Function X0(W) -
875 : !C -----------------------------------------------------------------
876 2626200 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
877 513524 : CALL SIM0UDX0(U(2),X0(2),DX0)
878 : END IF
879 : !c DO 750 I = 1, 3, 2
880 2626200 : I = 3
881 2626200 : UV = U(I) - U(2)
882 2626200 : IF (.NOT.LEPS(I)) THEN
883 2112676 : QX0(I) = (X0(I)-X0(2))/UV
884 : ELSE
885 513524 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UV) *UV)*UV
886 : END IF
887 2626200 : AV = U(I)
888 2626200 : G(1) = U(I) + U(2)
889 13131000 : DO 200 K = 2, 5
890 10504800 : AV = AV*U(I)
891 10504800 : G(K) = G(K-1)*U(2) + AV
892 2626200 : 200 CONTINUE
893 : !*-ASIS
894 : QR4(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + G(3)/5.0D0 + &
895 2626200 : & (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
896 : !C 750 CONTINUE ! DO .. I = 1, 3, 2
897 2626200 : QR4(3) = -DCMPLX(ZERO,AS(2)) + CONE - (U(3)+U(2))*R4(2) - U(3)*U(3)*QR4(3)
898 2626200 : IF (.NOT.LEPS(3)) THEN
899 2112676 : QR4(3) = QR4(3) + (CONE-U(3))*DCMPLX(ZERO,(AS(3)-AS(2))) /(U(3)-U(2))
900 : END IF
901 2626200 : R4(2) = (CONE-U(2))*DCMPLX(ZERO,AS(2)) + CONE + U(2) - U(2)*U(2)*R4(2)
902 : !c
903 2626200 : AV = (ONE+U(1))*(U(2)+CONE)*(U(3)+CONE)/((U(1)*U(2)-CONE)*(U(1)*U(3)-CONE))
904 2626200 : BV = (CONE-U(1))**2
905 2626200 : CV = CTWO - (U(2)+U(3)) - U(1)*(CONE-U(2)*U(3))
906 2626200 : DV = (U(1)*U(2)-CONE)*(U(3)-CONE)**2
907 2626200 : SIM = AV*(BV*R4(1)+CV*R4(2)+DV*QR4(3))
908 : !c
909 2626200 : S4(1) = (CONE-U(1))/(CONE+U(1))*R4(1)
910 2626200 : S4(2) = (U(2)-CONE)/(U(2)+CONE)*R4(2)
911 2626200 : QS4(3) = (-S4(2)+R4(2)+(U(3)-CONE)*QR4(3))/(U(3)+CONE)
912 2626200 : SIMI = AV*(BV*S4(1)+CV*S4(2)+DV*QS4(3))
913 : !c
914 2626200 : RETURN
915 : END SUBROUTINE SIM3TWOI
916 : !C
917 : !C ----------------------------------------------------------------------
918 : !C file: sim4onei.f
919 : !C date: 2010-09-22
920 : !C who: S.Kaprzyk
921 : !C what: CASE d): [ ONE<w1<w2<w3 ]
922 : !C U(1)=CONE/W(1); U(2)=CONE/W(2); U(3)=CONE/W(3)
923 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
924 : !C [|w1-w2|<e,|w3-w2|<e];
925 : !C [|w1-w2|>e,|w3-w2|<e]
926 0 : SUBROUTINE SIM4ONEI(U,AS,LEPS,SIM4,SIM4I)
927 :
928 : !IMPLICIT NONE
929 : DOUBLE COMPLEX U(3)
930 : DOUBLE PRECISION AS(3)
931 : LOGICAL LEPS(3)
932 : DOUBLE COMPLEX SIM4, SIM4I
933 : !c
934 : !DOUBLE COMPLEX SIM0UX0
935 : !EXTERNAL SIM0UX0
936 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
937 : DOUBLE COMPLEX R0(3), QR0(3)
938 : DOUBLE COMPLEX S0(3), QS0(3)
939 : DOUBLE COMPLEX QAS(3)
940 : DOUBLE COMPLEX AV, BV, CV, UD, G(5)
941 : INTEGER I, K !, N
942 : DOUBLE COMPLEX CZERO, CONE, CTWO, CIMAG
943 : DOUBLE PRECISION ZERO, ONE
944 : DATA ZERO/0.0D0/, ONE/1.0D0/
945 : !C
946 0 : CZERO = (0.0D0,0.0D0)
947 0 : CONE = (1.0D0,0.0D0)
948 0 : CTWO = (2.0D0,0.0D0)
949 0 : CIMAG = (0.0D0,1.0D0)
950 : !C ------------------------------------------------------------------
951 : !C R0(U)=ARTH(U)/U
952 : !C R0(U)=1+U**2/3+U**6*X0(U)
953 : !C ------------------------------------------------------------------
954 0 : DO 100 I = 1, 3
955 0 : AV = U(I)*U(I)
956 0 : X0(I) = SIM0UX0(U(I))
957 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
958 : !c S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
959 0 : 100 CONTINUE
960 : !C -----------------------------------------------------------------
961 : !C - THE DX0(I) CONTAINS DERIVATIVES OF THE FUNCTION X0(U)
962 : !C -----------------------------------------------------------------
963 0 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
964 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
965 : END IF
966 0 : DO 200 I = 1, 3, 2
967 0 : UD = U(I) - U(2)
968 0 : IF (.NOT.LEPS(I)) THEN
969 0 : QX0(I) = (X0(I)-X0(2))/UD
970 0 : QAS(I) = (AS(I)-AS(2))/UD
971 : ELSE
972 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UD) *UD)*UD
973 0 : QAS(I) = CZERO
974 : END IF
975 0 : AV = U(I)
976 0 : G(1) = U(I) + U(2)
977 0 : DO 150 K = 2, 5
978 0 : AV = AV*U(I)
979 0 : G(K) = G(K-1)*U(2) + AV
980 0 : 150 CONTINUE
981 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
982 0 : 200 CONTINUE ! end DO ... I = 1, 3, 2
983 0 : IF (LEPS(2)) THEN
984 0 : QAS(2) = CZERO
985 : !*-ASIS
986 : QX0(2) = DX0(2)/2.0D0 + DX0(3)*(U(1)+U(3)-2.0D0*U(2))/6.0D0 + &
987 : & DX0(4)*((U(3)-U(2))*(U(3)-U(2))+(U(1)-U(2))*(U(1)-U(2)) + &
988 0 : & (U(3)-U(2))*(U(1)-U(2)))/24.0D0
989 : ELSE
990 0 : QAS(2) = (QAS(3)-QAS(1))/(U(3)-U(1))
991 0 : QX0(2) = (QX0(3)-QX0(1))/(U(3)-U(1))
992 : END IF
993 0 : AV = U(1)
994 0 : G(1) = U(1) + U(3)
995 0 : DO 300 K = 2, 5
996 0 : AV = AV*U(1)
997 0 : G(K) = G(K-1)*U(3) + AV
998 0 : 300 CONTINUE
999 : !*-ASIS
1000 : QR0(2) = CONE/3.0D0 + (G(2)+U(2)*(U(2)+G(1)))/5.0D0 + &
1001 : & (G(4)+U(2)*(G(3)+U(2)*(G(2)+U(2)*(G(1)+U(2)))))*X0(2)+ &
1002 0 : & G(5)*QX0(3) + AV*U(1)*QX0(2)
1003 : !c
1004 0 : QR0(2) = CIMAG*QAS(2) + QR0(3) + U(1)*QR0(2)
1005 0 : QR0(3) = CIMAG*QAS(3) + R0(2) + U(3)*QR0(3)
1006 0 : R0(2) = CIMAG*AS(2) + U(2)*R0(2)
1007 : !c
1008 0 : S0(2) = (U(2)-CONE)/(U(2)+CONE)*R0(2)
1009 0 : QS0(3) = (-S0(2)+R0(2)+(U(3)-CONE)*QR0(3))/(U(3)+CONE)
1010 0 : QS0(2) = (-QS0(3)+QR0(3)+(U(1)-CONE)*QR0(2))/(U(1)+CONE)
1011 : !c
1012 0 : AV = (CONE+U(1))*(CONE+U(2))*(CONE+U(3))
1013 0 : BV = U(3) + U(1) - CTWO
1014 0 : CV = (CONE-U(1))**2
1015 0 : SIM4 = AV*(R0(2)+BV*QR0(3)+CV*QR0(2))
1016 0 : SIM4I = AV*(S0(2)+BV*QS0(3)+CV*QS0(2))
1017 : !c
1018 0 : RETURN
1019 : END SUBROUTINE SIM4ONEI
1020 : !C
1021 : !C ----------------------------------------------------------------------
1022 : !C file: sim4twoi.f
1023 : !C date: 2010-09-22
1024 : !C who: S.Kaprzyk
1025 : !C what: CASE d): [ ONE<w1<w2<w3 ]
1026 : !C U(1)=CONE/W(1); U(2)=CONE/W(2); U(3)=CONE/W(3)
1027 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
1028 : !C [|w1-w2|<e,|w3-w2|<e];
1029 : !C [|w1-w2|>e,|w3-w2|<e]
1030 2078173 : SUBROUTINE SIM4TWOI(U,AS,LEPS,SIM,SIMI)
1031 :
1032 : !IMPLICIT NONE
1033 : DOUBLE COMPLEX U(3)
1034 : DOUBLE PRECISION AS(3)
1035 : LOGICAL LEPS(3)
1036 : DOUBLE COMPLEX SIM, SIMI
1037 : !C
1038 : !DOUBLE COMPLEX SIM0UX0
1039 : !EXTERNAL SIM0UX0
1040 : !c
1041 : DOUBLE COMPLEX X0(3), QX0(3), DX0(4)
1042 : DOUBLE COMPLEX R4(3), QR4(3)
1043 : DOUBLE COMPLEX S4(3), QS4(3)
1044 : !c DOUBLE COMPLEX RU(3), TU(3)
1045 : DOUBLE COMPLEX QAS(3), AV, BV, CV, UV, G(5)
1046 : INTEGER I, K
1047 : DOUBLE COMPLEX CZERO, CONE, CTWO, CIMAG
1048 : DOUBLE PRECISION ZERO, ONE
1049 : DATA ZERO/0.0D0/, ONE/1.0D0/
1050 : !C
1051 2078173 : CZERO = (0.0D0,0.0D0)
1052 2078173 : CONE = (1.0D0,0.0D0)
1053 2078173 : CTWO = (2.0D0,0.0D0)
1054 2078173 : CIMAG = (0.0D0,1.0D0)
1055 : !C -----------------------------------------------------------------
1056 : !C - -
1057 : !C - R4(U)=1+(U-1)*(ARTH(U)/U-1)/U -
1058 : !C - R4(U)=1-U/3+U**2/3-U**3/5+U**4/5+(U-1)*U**5*X0(U) -
1059 : !C - -
1060 : !C -----------------------------------------------------------------
1061 8312692 : DO 100 I = 1, 3
1062 6234519 : AV = U(I)
1063 6234519 : X0(I) = SIM0UX0(AV)
1064 : !*-ASIS
1065 : R4(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
1066 6234519 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
1067 2078173 : 100 CONTINUE ! end DO ... I = 1, 3
1068 : !C -----------------------------------------------------------------
1069 : !C - The DX0(I) Contains Derivatives Of The Function X0(U) -
1070 : !C -----------------------------------------------------------------
1071 2078173 : IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
1072 710748 : CALL SIM0UDX0(U(2),X0(2),DX0)
1073 : END IF
1074 : !C
1075 4156346 : DO 200 I = 1, 3, 2
1076 4156346 : UV = U(I) - U(2)
1077 4156346 : IF (LEPS(I)) THEN
1078 710748 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UV) *UV)*UV
1079 710748 : QAS(I) = CZERO
1080 : ELSE
1081 3445598 : QX0(I) = (X0(I)-X0(2))/UV
1082 3445598 : QAS(I) = (AS(I)-AS(2))/UV
1083 : END IF
1084 4156346 : AV = U(I)
1085 4156346 : G(1) = U(I) + U(2)
1086 20781730 : DO 150 K = 2, 5
1087 16625384 : AV = AV*U(I)
1088 16625384 : G(K) = G(K-1)*U(2) + AV
1089 4156346 : 150 CONTINUE
1090 : QR4(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + G(3) &
1091 4156346 : & /5.0D0 + (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
1092 2078173 : 200 CONTINUE ! end DO ... I = 1, 3, 2
1093 : !C
1094 2078173 : IF (LEPS(2)) THEN
1095 0 : QAS(2) = CZERO
1096 : !*-ASIS
1097 : QX0(2) = DX0(2)/2.0D0 + DX0(3)*(U(1)+U(3)-2.0D0*U(2))/6.0D0 + &
1098 : & DX0(4)*((U(3)-U(2))*(U(3)-U(2))+(U(1)-U(2))*(U(1)-U(2)) + &
1099 0 : & (U(3)-U(2))*(U(1)-U(2)))/24.0D0
1100 : ELSE
1101 2078173 : QAS(2) = (QAS(3)-QAS(1))/(U(3)-U(1))
1102 2078173 : QX0(2) = (QX0(3)-QX0(1))/(U(3)-U(1))
1103 : END IF
1104 2078173 : AV = U(1)
1105 2078173 : G(1) = U(1) + U(3)
1106 10390865 : DO 300 K = 2, 5
1107 8312692 : AV = AV*U(1)
1108 8312692 : G(K) = G(K-1)*U(3) + AV
1109 2078173 : 300 CONTINUE
1110 : !*-ASIS
1111 : QR4(2) = CONE/3.0D0- (U(2)+G(1))/5.0D0 + &
1112 : & (G(2)+U(2)*(U(2)+G(1)))/5.0D0 + &
1113 : & (G(4)+(U(2)-CONE)*(G(3) + G(2)*U(2) + G(1)*U(2)*U(2) + &
1114 : & U(2)*U(2)*U(2)))*X0(2) + (G(5)-G(4))*QX0(3) + &
1115 2078173 : & (U(1)-CONE)*AV*QX0(2)
1116 : !C
1117 : QR4(2) = CIMAG*(-QAS(3)+(CONE-U(1))*QAS(2)) &
1118 2078173 : & - (R4(2)+(U(3)+U(1))*QR4(3)+U(1)*U(1)*QR4(2))
1119 : QR4(3) = CIMAG*(-AS(2)+(CONE-U(3))*QAS(3)) + CONE - (U(3)+U(2)) &
1120 2078173 : & *R4(2) - U(3)*U(3)*QR4(3)
1121 2078173 : R4(2) = CIMAG*(CONE-U(2))*AS(2) + CONE + U(2) - U(2)*U(2)*R4(2)
1122 : !c
1123 2078173 : S4(2) = (U(2)-CONE)/(U(2)+CONE)*R4(2)
1124 2078173 : QS4(3) = (-S4(2)+R4(2)+(U(3)-CONE)*QR4(3))/(U(3)+CONE)
1125 2078173 : QS4(2) = (-QS4(3)+QR4(3)+(U(1)-CONE)*QR4(2))/(U(1)+CONE)
1126 : !c
1127 2078173 : AV = (CONE+U(1))*(CONE+U(2))*(CONE+U(3))
1128 2078173 : BV = U(3) + U(1) - CTWO
1129 2078173 : CV = (CONE-U(1))**2
1130 2078173 : SIM = AV*(R4(2)+BV*QR4(3)+CV*QR4(2))
1131 2078173 : SIMI = AV*(S4(2)+BV*QS4(3)+CV*QS4(2))
1132 : !c
1133 2078173 : RETURN
1134 : END SUBROUTINE SIM4TWOI
1135 : !C
1136 : !C ----------------------------------------------------------------------
1137 : !C file: sim0leps.f
1138 : !C date: 2011-03-12
1139 : !C who: S.Kaprzyk
1140 : !C what: Return a proper case a), b), c) or d): see, Fig.3.1
1141 : !C INPUT:
1142 : !C VERM(1..4) - four complex numbers
1143 : !C N - integer number for W(I)=(VERM(I)-VERM(N))/(VERM(I)+VERM(N))
1144 : !C EPS - critical distance |w1-w2| etc.
1145 : !C OUTPUT:
1146 : !C LONE(1..4) [w1<w2<w3<ONE]; [w1<w2<ONE<w3];
1147 : !C [w1<ONE<w2<w3]; [ONE<w1<w2<w3]
1148 : !C LEPS(1..3) [|w1-w2|<e,|w3-w2|>e];
1149 : !C [|w1-w2|<e,|w3-w2|<e];
1150 : !C [|w1-w2|>e,|w3-w2|<e]
1151 220656384 : SUBROUTINE SIM0LEPS(VERM, N, W, AS, LONE, EPS, LEPS, iuerr)
1152 :
1153 : !IMPLICIT NONE
1154 : DOUBLE COMPLEX VERM(4)
1155 : INTEGER N
1156 : DOUBLE COMPLEX W(3)
1157 : DOUBLE PRECISION AS(3)
1158 : DOUBLE PRECISION EPS
1159 : LOGICAL LONE(4), LEPS(3)
1160 : INTEGER iuerr
1161 : !C
1162 : !c DOUBLE PRECISION DLAMCH
1163 : !c EXTERNAl DLAMCH
1164 : !C
1165 : LOGICAL LWONE(3), LV
1166 : DOUBLE COMPLEX AV
1167 : DOUBLE PRECISION AL(3), AA, AIW, OZERO
1168 : INTEGER I, II, K
1169 : DOUBLE PRECISION ZERO, ONE, PI
1170 : DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/
1171 : DATA OZERO/ 1.0D-13/
1172 : !C
1173 : !c OZERO = DLAMCH('e')*10
1174 220656384 : IF ((N.GT.4).OR.(N.LT.1)) THEN
1175 0 : WRITE(iuerr,9003) N
1176 : 9003 FORMAT(' ***sim0leps: N =',I6,' must be 1,2,3 or 4' )
1177 0 : STOP ' ***sim0leps: '
1178 : ENDIF
1179 : !c DO 100 I = 1, 4
1180 : !c IF (I.EQ.N) GO TO 100
1181 : !c IF (DIMAG(VERM(N))*DIMAG(VERM(I)).LT.ZERO) THEN
1182 : !c WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,4)
1183 : !c 9010 FORMAT (' ***sim0leps: not signed ImgVERM()=',4(D13.6,1X))
1184 : !c STOP ' ***sim0leps: '
1185 : !c END IF
1186 : !c 100 CONTINUE
1187 : II = 0
1188 1103281920 : DO 200 I = 1, 4
1189 882625536 : IF (I.EQ.N) GO TO 200
1190 661969152 : II = II + 1
1191 661969152 : IF (CDABS(VERM(N)-VERM(I)).LT.CDABS(VERM(N)+VERM(I))) THEN
1192 644144754 : LWONE(II) = .TRUE.
1193 644144754 : W(II) = (VERM(N)-VERM(I))/(VERM(N)+VERM(I))
1194 644144754 : AIW = DIMAG(W(II))
1195 644144754 : IF (DABS(AIW).GE.OZERO) THEN
1196 588583794 : AS(II) = 0.5D0*PI*DSIGN(ONE,AIW)
1197 : ELSE
1198 55560960 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
1199 : END IF
1200 : ELSE
1201 17824398 : LWONE(II) = .FALSE.
1202 17824398 : W(II) = (VERM(N)+VERM(I))/(VERM(N)-VERM(I))
1203 17824398 : AIW = DIMAG(W(II))
1204 17824398 : IF (DABS(AIW).GE.OZERO) THEN
1205 17824398 : AS(II) = -0.5D0*PI*DSIGN(ONE,AIW)
1206 : ELSE
1207 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
1208 : END IF
1209 : END IF
1210 882625536 : AL(II) = CDABS(W(II))
1211 220656384 : 200 CONTINUE
1212 882625536 : DO 300 I = 1, 3
1213 1985907456 : DO 250 K = I, 3
1214 1323938304 : IF (LWONE(I).AND.LWONE(K).AND.(AL(I).LT.AL(K))) GO TO 250
1215 1039231323 : IF (.NOT.LWONE(I).AND..NOT.LWONE(K).AND.(AL(K).LT.AL(I))) GO TO 250
1216 1035147868 : IF (.NOT.LWONE(I).AND.LWONE(K).AND.(ONE.LT.AL(I)*AL(K))) GO TO 250
1217 1035147868 : IF (LWONE(I).AND..NOT.LWONE(K).AND.(AL(I)*AL(K).LT.ONE)) GO TO 250
1218 1025626548 : AA = AL(K)
1219 1025626548 : AL(K) = AL(I)
1220 1025626548 : AL(I) = AA
1221 1025626548 : AA = AS(K)
1222 1025626548 : AS(K) = AS(I)
1223 1025626548 : AS(I) = AA
1224 1025626548 : AV = W(K)
1225 1025626548 : W(K) = W(I)
1226 1025626548 : W(I) = AV
1227 1025626548 : LV = LWONE(K)
1228 1025626548 : LWONE(K) = LWONE(I)
1229 1323938304 : LWONE(I) = LV
1230 661969152 : 250 CONTINUE
1231 220656384 : 300 CONTINUE
1232 : !C
1233 220656384 : LONE(1) = .FALSE.
1234 220656384 : LONE(2) = .FALSE.
1235 220656384 : LONE(3) = .FALSE.
1236 220656384 : LONE(4) = .FALSE.
1237 220656384 : IF (LWONE(1).AND.LWONE(2).AND.LWONE(3)) THEN
1238 209614532 : LONE(1) = .TRUE.
1239 : END IF
1240 220656384 : IF (LWONE(1).AND.LWONE(2).AND.(.NOT.LWONE(3))) THEN
1241 6337479 : LONE(2) = .TRUE.
1242 : END IF
1243 220656384 : IF (LWONE(1).AND.(.NOT.LWONE(2)).AND.(.NOT.LWONE(3))) THEN
1244 2626200 : LONE(3) = .TRUE.
1245 : END IF
1246 220656384 : IF ((.NOT.LWONE(1)).AND.(.NOT.LWONE(2)).AND.(.NOT.LWONE(3))) THEN
1247 2078173 : LONE(4) = .TRUE.
1248 : END IF
1249 : !C here are 3-cases, how close are w()
1250 220656384 : LEPS(1) = .FALSE.
1251 220656384 : LEPS(2) = .FALSE.
1252 220656384 : LEPS(3) = .FALSE.
1253 220656384 : IF ( LONE(1).OR.LONE(4) ) THEN
1254 211692705 : IF (ABS(W(1)-W(2)).LE.EPS) THEN
1255 23298912 : LEPS(1) = .TRUE.
1256 : END IF
1257 211692705 : IF (ABS(W(3)-W(2)).LE.EPS) THEN
1258 31031632 : LEPS(3) = .TRUE.
1259 : END IF
1260 211692705 : IF ((ABS(W(1)-W(2)).LE.EPS).AND.(ABS(W(3)-W(2)).LE.EPS)) THEN
1261 0 : LEPS(2) = .TRUE.
1262 : END IF
1263 : END IF
1264 : !c
1265 220656384 : IF ( LONE(2)) THEN
1266 6337479 : IF (ABS(W(1)-W(2)).LE.EPS) THEN
1267 716892 : LEPS(1) = .TRUE.
1268 : END IF
1269 : END IF
1270 : !c
1271 220656384 : IF ( LONE(3)) THEN
1272 2626200 : IF (ABS(W(2)-W(3)).LE.EPS) THEN
1273 513524 : LEPS(3) = .TRUE.
1274 : END IF
1275 : END IF
1276 : !C
1277 220656384 : IF ((.NOT.LONE(1)).AND.(.NOT.LONE(2)).AND.(.NOT.LONE(3)).AND. (.NOT.LONE(4))) THEN
1278 0 : WRITE (iuerr,9020) (LONE(I),I=1,4)
1279 : 9020 FORMAT ('***sim0leps: LONE()=',4(L1,1X),'not in order')
1280 0 : STOP '***sim0leps: '
1281 : END IF
1282 220656384 : RETURN
1283 : END SUBROUTINE SIM0LEPS
1284 : !C
1285 : !C file: s2d0onei.f
1286 : !C date: 2011-04-01
1287 : !C who: S.Kaprzyk
1288 : !C what: Complex linear form integral over standard 2-d simplex
1289 : !C ----------------------------------------------------
1290 : !C - * -
1291 : !C - * 1 -
1292 : !C - SIM0= 2* dt1dt2 ----------------------------------
1293 : !C - * verm(3)+(verm(1)-verm(3))*t1+.. -
1294 : !C - * -
1295 : !C - 0<t1<1 -
1296 : !C ----------------------------------------------------
1297 0 : SUBROUTINE S2D0ONEI(SIM0, SIM0I, VERM)
1298 :
1299 : !IMPLICIT NONE
1300 : INTEGER iuerr
1301 : PARAMETER (iuerr=6)
1302 : DOUBLE COMPLEX SIM0, SIM0I
1303 : DOUBLE COMPLEX VERM (3)
1304 : !C
1305 : DOUBLE COMPLEX VERM1D(2)
1306 : DOUBLE COMPLEX SIM, SIMI
1307 : LOGICAL LONE(3),LEPS(1)
1308 : !c
1309 : DOUBLE COMPLEX U(2)
1310 : DOUBLE PRECISION AS(2), AL(3)
1311 : INTEGER I, I1, I2, K, N
1312 : DOUBLE PRECISION ZERO, EPS, SMALL
1313 : DATA EPS/1.0D-6/, SMALL/1.0D-5/
1314 : DATA ZERO/0.0D0/
1315 : !C
1316 0 : DO 100 I = 1, 2
1317 0 : IF (DIMAG(VERM(3))*DIMAG(VERM(I)).LT.ZERO) THEN
1318 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,3)
1319 : 9010 FORMAT (' ***s2d0onei: not signed ImgVERM()=',3(D13.6,1X))
1320 : !c STOP ' ***s2d0onei: '
1321 : END IF
1322 0 : 100 CONTINUE
1323 : !C
1324 0 : DO 200 I = 1, 3
1325 0 : AL(I) = CDABS(VERM(I))
1326 0 : 200 CONTINUE
1327 0 : DO 300 N = 1, 3
1328 0 : IF (AL(N).LT.SMALL) THEN
1329 0 : I1 = MOD(N,3) + 1
1330 0 : I2 = MOD(N+1,3) + 1
1331 0 : VERM1D(1) = VERM(I1)
1332 0 : VERM1D(2) = VERM(I2)
1333 0 : CALL S1D0ONEI(SIM,SIMI,VERM1D)
1334 0 : SIM0 = 2*SIM
1335 0 : SIM0I = SIMI - 0.5D0
1336 0 : RETURN
1337 : END IF
1338 0 : 300 CONTINUE
1339 : !C
1340 0 : N = 3
1341 0 : DO 400 I = 1, 2
1342 0 : IF (AL(I).GT.AL(N)) N = I
1343 0 : 400 CONTINUE
1344 : !C Here are 3 cases, how w() are placed on complex-plane
1345 : !C LONE(1..3) [w1<w2<ONE];[w1<ONE<w2];[ONE<w1<w2]
1346 : !C LEPS(1) [|w1-w2|<e
1347 : !*-ASIS
1348 0 : CALL S2D0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
1349 : !c U(1) = W(1); U(2) = W(2);
1350 0 : IF (LONE(1)) THEN
1351 0 : CALL S2D1ONEI(U,AS,LEPS,SIM,SIMI)
1352 : END IF
1353 : !c U(1) = W(1); U(2) = 1/W(2);
1354 0 : IF (LONE(2)) THEN
1355 0 : CALL S2D2ONEI(U,AS,LEPS,SIM,SIMI)
1356 : END IF
1357 : !c U(1) = 1/W(1); U(2) = 1/W(2);
1358 0 : IF (LONE(3)) THEN
1359 0 : CALL S2D3ONEI(U,AS,LEPS,SIM,SIMI)
1360 : END IF
1361 : !C
1362 0 : SIM0 = SIM/VERM(N)
1363 0 : SIM0I = log(VERM(N))+0.5D0*SIMI - 1.5D0
1364 0 : RETURN
1365 : END SUBROUTINE S2D0ONEI
1366 : !C
1367 : !C ----------------------------------------------------------------------
1368 : !C file: s2d0twoi.f
1369 : !C date: 2011-04-01
1370 : !C who: S.Kaprzyk
1371 : !C what: Complex linear form integrals over standard 2-d simplex
1372 : !C ------------------(i=1,2)----------------------------------------
1373 : !C * -
1374 : !C * t_i -
1375 : !C VERL(i)=2*dt1dt2 --------------------------------------------- -
1376 : !C * VERM(3)+[VERM(1)-VERM(3)]*t1+... -
1377 : !C * -
1378 : !C 0<t1+t2<1 -
1379 : !C -------------------(i=3)-----------------------------------------
1380 : !C * -
1381 : !C * 1- t1 -t2
1382 : !C VERL(3)=2*dt1dt2 -----------------------------------------------
1383 : !C * VERM(3)+[VERM(1)-VERM(3)]*t1+... -
1384 : !C * -
1385 : !C 0<t1+t2<1 -
1386 : !C -----------------------------------------------------------------
1387 0 : SUBROUTINE S2D0TWOI(VERL, VERLI, VERM)
1388 :
1389 : !IMPLICIT NONE
1390 : INTEGER iuerr
1391 : PARAMETER (iuerr=6)
1392 : DOUBLE COMPLEX VERL(3), VERLI(3), VERM(3)
1393 : !C
1394 : DOUBLE COMPLEX SIM, SIMI
1395 : DOUBLE COMPLEX VERL1D(2), VERL1DI(2), VERM1D(2)
1396 : LOGICAL LONE(3),LEPS(2)
1397 : !c
1398 : INTEGER I, I1, I2, K, N
1399 : DOUBLE PRECISION AS(2), AL(3)
1400 : DOUBLE COMPLEX U(2)
1401 : DOUBLE COMPLEX CZERO
1402 : DOUBLE PRECISION EPS, SMALL
1403 : DOUBLE PRECISION ZERO
1404 : DATA EPS/1.0D-6/, SMALL/1.0D-5/
1405 : DATA ZERO/0.0D0/
1406 : !C
1407 0 : CZERO = (0.0D0,0.0D0)
1408 0 : DO 100 I = 1, 2
1409 0 : IF (DIMAG(VERM(3))*DIMAG(VERM(I)).LT.ZERO) THEN
1410 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,3)
1411 : 9010 FORMAT (' ***s2d0twoi: not signed ImgVERM()=',3(D13.6,1X))
1412 0 : STOP ' ***s2d0twoi: '
1413 : END IF
1414 0 : 100 CONTINUE
1415 0 : DO 200 I = 1, 3
1416 0 : AL(I) = CDABS(VERM(I))
1417 0 : 200 CONTINUE
1418 : !C
1419 0 : DO 300 N = 1, 3
1420 0 : VERL(N) = CZERO
1421 0 : VERLI(N) = CZERO
1422 0 : I1 = MOD(N,3) + 1
1423 0 : I2 = MOD(N+1,3) + 1
1424 0 : IF (AL(I1).LT.SMALL) THEN
1425 0 : VERM1D(1) = VERM(I2)
1426 0 : VERM1D(2) = VERM(N)
1427 0 : CALL S1D0TWOI(VERL1D,VERL1DI,VERM1D)
1428 0 : VERL(N) = VERL1D(2)
1429 0 : VERLI(N) = VERL1DI(2)*2/3
1430 0 : GO TO 300
1431 : END IF
1432 0 : IF (AL(I2).LT.SMALL) THEN
1433 0 : VERM1D(1) = VERM(I1)
1434 0 : VERM1D(2) = VERM(N)
1435 0 : CALL S1D0TWOI(VERL1D,VERL1DI,VERM1D)
1436 0 : VERL(N) = VERL1D(2)
1437 0 : VERLI(N) = VERL1DI(2)*2/3
1438 0 : GO TO 300
1439 : END IF
1440 0 : IF (AL(N).LT.SMALL) THEN
1441 0 : VERM1D(1) = VERM(I1)
1442 0 : VERM1D(2) = VERM(I2)
1443 0 : CALL S1D0ONEI(SIM,SIMI,VERM1D)
1444 0 : VERL(N) = SIM
1445 0 : VERLI(N) = SIMI/3 - 0.5D0
1446 0 : GO TO 300
1447 : END IF
1448 : !C Here are 3 cases, how w() are placed on complex-plane
1449 : !C LONE(1..3) [w1<w2<ONE];[w1<ONE<w2];[ONE<w1<w2]
1450 : !C LEPS(1) [|w1-w2|<e
1451 : !*-ASIS
1452 0 : CALL S2D0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
1453 : !c U(1) = W(1); U(2) = W(2)
1454 0 : IF (LONE(1)) THEN
1455 0 : CALL S2D1TWOI(U,AS,LEPS,SIM,SIMI)
1456 : END IF
1457 : !c U(1) = W(1); U(2) = CONE/W(2)
1458 0 : IF (LONE(2)) THEN
1459 0 : CALL S2D2TWOI(U,AS,LEPS,SIM,SIMI)
1460 : END IF
1461 : !c U(1) = CONE/W(1); U(2) = CONE/W(2)
1462 0 : IF (LONE(3)) THEN
1463 0 : CALL S2D3TWOI(U,AS,LEPS,SIM,SIMI)
1464 : END IF
1465 : !c
1466 0 : VERL(N) = SIM/VERM(N)/4
1467 0 : VERLI(N) = (log(VERM(N))+SIMI/4)/3 - 5.0D0/18.0D0
1468 0 : 300 CONTINUE ! end DO ... N = 1, 3
1469 0 : RETURN
1470 : END SUBROUTINE S2D0TWOI
1471 : !C
1472 : !C ----------------------------------------------------------------------
1473 : !C file: s2d1onei.f
1474 : !C date: 2011-03-23
1475 : !C who: S.Kaprzyk
1476 : !C what: CASE a) : [w1<w2<ONE]
1477 : !C U(1)=W(1); U(2)=W(2)
1478 : !C LEPS(1) [|w1-w2|<e]
1479 0 : SUBROUTINE S2D1ONEI(U,AS,LEPS, SIM1, SIM1I)
1480 :
1481 : !IMPLICIT NONE
1482 : DOUBLE COMPLEX U(2)
1483 : DOUBLE PRECISION AS(2)
1484 : LOGICAL LEPS(1)
1485 : DOUBLE COMPLEX SIM1, SIM1I
1486 : !C
1487 : !DOUBLE COMPLEX SIM0UX0
1488 : !EXTERNAL SIM0UX0
1489 : DOUBLE COMPLEX X0(2), DX0(4), R0(2), S0(2)
1490 : DOUBLE COMPLEX QX0(1), QR0(1), QS0(1)
1491 : DOUBLE COMPLEX AV, BV, DU, G(5)
1492 : INTEGER I, K
1493 : DOUBLE COMPLEX CZERO, CONE
1494 : DOUBLE PRECISION ZERO, ONE
1495 : DATA ZERO/0.0D0/, ONE/1.0D0/
1496 :
1497 : ABI_UNUSED((/as(1)/))
1498 : !C
1499 0 : CZERO = (0.0D0,0.0D0)
1500 0 : CONE = (1.0D0,0.0D0)
1501 : !C ------------------------------------------------------------------
1502 : !C R0(U) = ARTH(U)/U
1503 : !C R0(U) = 1+U**2/3+U**6*X0(U)
1504 : !C ------------------------------------------------------------------
1505 0 : DO 100 I = 1, 2
1506 0 : AV = U(I)*U(I)
1507 0 : X0(I) = SIM0UX0(U(I))
1508 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
1509 0 : S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
1510 0 : 100 CONTINUE
1511 : !C -----------------------------------------------------------------
1512 : !C - The DX0(I) contains derivatives of the function X0(u) -
1513 : !C -----------------------------------------------------------------
1514 : !c IF (LEPS(1).OR.LEPS(2).OR.LEPS(3)) THEN
1515 0 : IF (LEPS(1)) THEN
1516 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
1517 : END IF
1518 : !c DO 200 I = 1, 3, 2
1519 0 : I = 1
1520 0 : DU = U(I) - U(2)
1521 0 : IF (.NOT.LEPS(I)) THEN
1522 0 : QX0(I) = (X0(I)-X0(2))/DU
1523 : ELSE
1524 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+ DX0(4)/24.0D0*DU)*DU)*DU
1525 : END IF
1526 0 : AV = U(I)
1527 0 : G(1) = U(I) + U(2)
1528 0 : DO 150 K = 2, 5
1529 0 : AV = AV*U(I)
1530 0 : G(K) = G(K-1)*U(2) + AV
1531 0 : 150 CONTINUE
1532 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
1533 0 : QS0(I) = (-S0(2)-R0(2)+(CONE-U(I))*QR0(I))/(CONE+U(I))
1534 : !C
1535 0 : AV = (CONE+U(1))*(CONE+U(2))
1536 0 : BV = (U(2)-CONE)
1537 0 : SIM1 = AV*(R0(1) + QR0(1)*BV)
1538 0 : SIM1I = AV*(S0(1) + QS0(1)*BV)
1539 0 : RETURN
1540 : END SUBROUTINE S2D1ONEI
1541 : !C
1542 : !C ----------------------------------------------------------------------
1543 : !C file: s2d1twoi.f
1544 : !C date: 2010-09-22
1545 : !C who: S.Kaprzyk
1546 : !C what: CASE a) : [w1<w2<ONE]
1547 : !C U(1)=W(1); U(2)=W(2)
1548 : !C LEPS(1) [|w1-w2|<e]
1549 0 : SUBROUTINE S2D1TWOI(U,AS,LEPS, SIM, SIMI)
1550 :
1551 : !IMPLICIT NONE
1552 : DOUBLE COMPLEX U(2)
1553 : DOUBLE PRECISION AS(2)
1554 : LOGICAL LEPS(2)
1555 : DOUBLE COMPLEX SIM, SIMI
1556 : !C
1557 : !DOUBLE COMPLEX SIM0UX0
1558 : !EXTERNAL SIM0UX0
1559 : !c
1560 : DOUBLE COMPLEX X0(2), DX0(4), R3(2), S3(2)
1561 : DOUBLE COMPLEX QR3(1), QX0(1)
1562 : DOUBLE COMPLEX QS3(1)
1563 : DOUBLE COMPLEX AV, BV, UV, G(5)
1564 : INTEGER I, K
1565 : DOUBLE COMPLEX CZERO, CONE, CTWO
1566 : DOUBLE PRECISION ZERO, ONE
1567 : DATA ZERO/0.0D0/, ONE/1.0D0/
1568 : !C
1569 :
1570 : ABI_UNUSED((/as/))
1571 0 : CZERO = (0.0D0,0.0D0)
1572 0 : CONE = (1.0D0,0.0D0)
1573 0 : CTWO = (2.0D0,0.0D0)
1574 : !C -----------------------------------------------------------------
1575 : !C - -
1576 : !C - R3(W)=1+(W-1)*(ARTH(W)/W-1)/W -
1577 : !C - R3(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
1578 : !C - -
1579 : !C -----------------------------------------------------------------
1580 0 : DO 100 I = 1, 2
1581 0 : AV = U(I)
1582 0 : X0(I) = SIM0UX0(AV)
1583 : !*-ASIS
1584 : R3(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
1585 0 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
1586 0 : S3(I) = (CONE-U(I))/(CONE+U(I))*R3(I)
1587 0 : 100 CONTINUE
1588 : !C -----------------------------------------------------------------
1589 : !C - The DX0(I) Contains Derivatives Of The Function X0(W) -
1590 : !C -----------------------------------------------------------------
1591 0 : IF (LEPS(1)) THEN
1592 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
1593 : END IF
1594 : !C
1595 : !c DO 200 I = 1, 3, 2
1596 0 : I = 1
1597 0 : UV = U(I) - U(2)
1598 0 : IF (LEPS(I)) THEN
1599 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+ DX0(4)/24.0D0*UV)*UV)*UV
1600 : ELSE
1601 0 : QX0(I) = (X0(I)-X0(2))/UV
1602 : END IF
1603 0 : AV = U(I)
1604 0 : G(1) = U(I) + U(2)
1605 0 : DO 150 K = 2, 5
1606 0 : AV = AV*U(I)
1607 0 : G(K) = G(K-1)*U(2) + AV
1608 0 : 150 CONTINUE
1609 : QR3(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + &
1610 0 : & G(3)/5.0D0 + (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
1611 0 : QS3(I) = (-S3(2)-R3(2)+(CONE-U(I))*QR3(I))/(CONE+U(I))
1612 : !c 200 CONTINUE ! DO 750 I = 1, 3, 2
1613 : !c
1614 0 : AV = (CONE+U(1))*(CONE+U(2))
1615 0 : BV = U(2)-CONE
1616 0 : SIM = AV*(R3(1) + QR3(1)*BV)
1617 0 : SIMI = AV*(S3(1) + QS3(1)*BV)
1618 0 : RETURN
1619 : END SUBROUTINE S2D1TWOI
1620 : !C
1621 : !C ----------------------------------------------------------------------
1622 : !C file: s2d2onei.f
1623 : !C date: 2011-03-24
1624 : !C who: S.Kaprzyk
1625 : !C what: CASE b) : [w1<ONE<w2]
1626 : !C U(1)=W(1); U(2)= CONE/W(2)
1627 : !C LEPS(1) [|w1-w2|<e]
1628 0 : SUBROUTINE S2D2ONEI(U,AS,LEPS, SIM2, SIM2I)
1629 :
1630 : !IMPLICIT NONE
1631 : DOUBLE COMPLEX U(2)
1632 : DOUBLE PRECISION AS(2)
1633 : LOGICAL LEPS(1)
1634 : DOUBLE COMPLEX SIM2, SIM2I
1635 : !c
1636 : !DOUBLE COMPLEX SIM0UX0
1637 : !EXTERNAL SIM0UX0
1638 : DOUBLE COMPLEX X0(2), R0(2), S0(2) !, DX0(4)
1639 : !c DOUBLE COMPLEX QX0(1), QR0(1), QS0(1)
1640 : DOUBLE COMPLEX AV, BV, CV !, G(5)
1641 : !DOUBLE COMPLEX UD
1642 : INTEGER I !, K, N
1643 : DOUBLE COMPLEX CZERO, CONE, CTWO
1644 : DOUBLE PRECISION ZERO, ONE
1645 : DATA ZERO/0.0D0/, ONE/1.0D0/
1646 : !C
1647 : ABI_UNUSED(leps)
1648 0 : CZERO = (0.0D0,0.0D0)
1649 0 : CONE = (1.0D0,0.0D0)
1650 0 : CTWO = (2.0D0,0.0D0)
1651 : !C ------------------------------------------------------------------
1652 : !C R0(U) = ARTH(U)/U
1653 : !C R0(U) = 1+U**2/3+U**6*X0(U)
1654 : !C ------------------------------------------------------------------
1655 0 : DO 100 I = 1, 2
1656 0 : AV = U(I)*U(I)
1657 0 : X0(I) = SIM0UX0(U(I))
1658 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
1659 0 : S0(I) = (CONE-U(I))/(CONE+U(I))*R0(I)
1660 0 : 100 CONTINUE
1661 : !c
1662 0 : AV = (CONE+U(1))*(U(2)+CONE)/(CONE-U(2)*U(1))
1663 0 : BV = -(U(1)-CONE)
1664 0 : CV = (CONE-U(2))
1665 0 : SIM2 = AV*(BV*R0(1)+CV*(DCMPLX(ZERO,AS(2))+U(2)*R0(2)))
1666 0 : CV = CV*(U(2)-CONE)/(U(2)+CONE)
1667 0 : SIM2I= AV*(BV*S0(1)+CV*(DCMPLX(ZERO,AS(2))+U(2)*R0(2)))
1668 : !c
1669 0 : RETURN
1670 : END SUBROUTINE S2D2ONEI
1671 : !C
1672 : !C ----------------------------------------------------------------------
1673 : !C file: s2d2twoi.f
1674 : !C date: 2011-03-26
1675 : !C who: S.Kaprzyk
1676 : !C what: CASE b) : [w1<ONE<w2]
1677 : !C U(1)=W(1); U(2)= CONE/W(2)
1678 : !C LEPS(1) [|w1-w2|<e]
1679 0 : SUBROUTINE S2D2TWOI(U,AS,LEPS, SIM, SIMI)
1680 :
1681 : !IMPLICIT NONE
1682 : DOUBLE COMPLEX U(2)
1683 : DOUBLE PRECISION AS(2)
1684 : LOGICAL LEPS(1)
1685 : DOUBLE COMPLEX SIM, SIMI
1686 : !C
1687 : !DOUBLE COMPLEX SIM0UX0
1688 : !EXTERNAL SIM0UX0
1689 : !c
1690 : DOUBLE COMPLEX X0(2), R3(2), S3(2)
1691 : DOUBLE COMPLEX AV, BV
1692 : INTEGER I
1693 : DOUBLE COMPLEX CZERO, CONE
1694 : DOUBLE PRECISION ZERO, ONE
1695 : DATA ZERO/0.0D0/, ONE/1.0D0/
1696 : !C
1697 :
1698 : ABI_UNUSED((/leps/))
1699 0 : CZERO = (0.0D0,0.0D0)
1700 0 : CONE = (1.0D0,0.0D0)
1701 : !C -----------------------------------------------------------------
1702 : !C - -
1703 : !C - R3(W)=1+(W-1)*(ARTH(W)/W-1)/W -
1704 : !C - R3(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
1705 : !C - -
1706 : !C -----------------------------------------------------------------
1707 0 : DO 100 I = 1, 2
1708 0 : AV = U(I)
1709 0 : X0(I) = SIM0UX0(AV)
1710 : !*-ASIS
1711 : R3(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
1712 0 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
1713 0 : 100 CONTINUE
1714 0 : S3(1) = (CONE-U(1))/(CONE+U(1))*R3(1)
1715 0 : AV = (CONE+U(1))*(U(2)+CONE)/(U(1)*U(2)-CONE)
1716 0 : BV = (CONE-U(2))*DCMPLX(ZERO,AS(2))+CONE+U(2)-U(2)*U(2)*R3(2)
1717 0 : SIM = AV*((U(1)-CONE)*R3(1) - (CONE-U(2))*BV)
1718 0 : BV = (U(2)-CONE)/(U(2)+CONE)*BV
1719 0 : SIMI= AV*((U(1)-CONE)*S3(1) - (CONE-U(2))*BV)
1720 : !C
1721 0 : RETURN
1722 : END SUBROUTINE S2D2TWOI
1723 : !C
1724 : !C ----------------------------------------------------------------------
1725 : !C file: s2d3onei.f
1726 : !C date: 2011-04-01
1727 : !C who: S.Kaprzyk
1728 : !C what: CASE c) : [ ONE<w1<w2]
1729 : !C U(1)=CONE/W(1); U(2)=CONE/W(2)
1730 : !C LEPS(1) [|w1-w2|<e]
1731 0 : SUBROUTINE S2D3ONEI(U,AS,LEPS,SIM3,SIM3I)
1732 :
1733 : !IMPLICIT NONE
1734 : DOUBLE COMPLEX U(2)
1735 : DOUBLE PRECISION AS(2)
1736 : LOGICAL LEPS(1)
1737 : DOUBLE COMPLEX SIM3, SIM3I
1738 : !c
1739 : !DOUBLE COMPLEX SIM0UX0
1740 : !EXTERNAL SIM0UX0
1741 : !c
1742 : DOUBLE COMPLEX X0(2), QX0(1), DX0(4)
1743 : DOUBLE COMPLEX R0(2), UR0(2), QR0(1), QUR0(1)
1744 : DOUBLE COMPLEX US0(2), QUS0(1), QAS(1)
1745 : DOUBLE COMPLEX AV, UD, G(5)
1746 : INTEGER I, K
1747 : DOUBLE COMPLEX CZERO, CONE, CIMAG
1748 : DOUBLE PRECISION ZERO, ONE
1749 : DATA ZERO/0.0D0/, ONE/1.0D0/
1750 : !C
1751 0 : CZERO = (0.0D0,0.0D0)
1752 0 : CONE = (1.0D0,0.0D0)
1753 0 : CIMAG = (0.0D0,1.0D0)
1754 : !C ------------------------------------------------------------------
1755 : !C R0(U)=ARTH(U)/U
1756 : !C R0(U)=1+U**2/3+U**6*X0(U)
1757 : !C ------------------------------------------------------------------
1758 0 : DO 100 I = 1, 2
1759 0 : AV = U(I)*U(I)
1760 0 : X0(I) = SIM0UX0(U(I))
1761 0 : R0(I) = CONE + AV*(CONE/3.0D0+AV*(CONE/5.0D0+AV*X0(I)))
1762 0 : UR0(I)= DCMPLX(ZERO,AS(I)) + U(I)*R0(I)
1763 0 : 100 CONTINUE
1764 : !C -----------------------------------------------------------------
1765 : !C - THE DX0(I) CONTAINS DERIVATIVES OF THE FUNCTION X0(U)
1766 : !C -----------------------------------------------------------------
1767 0 : IF (LEPS(1)) THEN
1768 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
1769 : END IF
1770 : !c
1771 0 : I = 1
1772 0 : UD = U(I) - U(2)
1773 0 : IF (.NOT.LEPS(I)) THEN
1774 0 : QX0(I) = (X0(I)-X0(2))/UD
1775 0 : QAS(I) = (AS(I)-AS(2))/UD
1776 : ELSE
1777 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0 + DX0(4)/24.0D0*UD)*UD)*UD
1778 0 : QAS(I) = CZERO
1779 : END IF
1780 0 : AV = U(I)
1781 0 : G(1) = U(I) + U(2)
1782 0 : DO 150 K = 2, 5
1783 0 : AV = AV*U(I)
1784 0 : G(K) = G(K-1)*U(2) + AV
1785 0 : 150 CONTINUE
1786 0 : QR0(I) = G(1)/3.0D0 + G(3)/5.0D0 + G(5)*X0(2) + AV*U(I)*QX0(I)
1787 : !c
1788 0 : QUR0(1) = CIMAG*QAS(1) + R0(2) +U(1)*QR0(1)
1789 0 : US0(2) = (U(2)-CONE)/(U(2)+CONE)*UR0(2)
1790 0 : QUS0(1) = ( -US0(2)+UR0(2)+(U(1)-CONE)*QUR0(1))/(U(1)+CONE)
1791 : !c
1792 0 : AV = (U(1)+CONE)*(U(2)+CONE)
1793 0 : SIM3 = AV*(UR0(2) + (U(1)-CONE)*QUR0(1))
1794 0 : SIM3I = AV*(US0(2) + (U(1)-CONE)*QUS0(1))
1795 0 : RETURN
1796 : END SUBROUTINE S2D3ONEI
1797 : !C
1798 : !C ----------------------------------------------------------------------
1799 : !C file: s2d3twoi.f
1800 : !C date: 2011-03-28
1801 : !C who: S.Kaprzyk
1802 : !C what: CASE c) : [ ONE<w1<w2]
1803 : !C U(1)=CONE/W(1); U(2)=CONE/W(2)
1804 : !C LEPS(1) [|w1-w2|<e]
1805 0 : SUBROUTINE S2D3TWOI(U,AS,LEPS,SIM,SIMI)
1806 :
1807 : !IMPLICIT NONE
1808 : DOUBLE COMPLEX U(2)
1809 : DOUBLE PRECISION AS(2)
1810 : LOGICAL LEPS(1)
1811 : DOUBLE COMPLEX SIM, SIMI
1812 : !C
1813 : !DOUBLE COMPLEX SIM0UX0
1814 : !EXTERNAL SIM0UX0
1815 : !c
1816 : DOUBLE COMPLEX X0(2), QX0(1), DX0(4)
1817 : DOUBLE COMPLEX R3(2), UR3(2), QR3(1), QUR3(1)
1818 : DOUBLE COMPLEX US3(2), QUS3(1)
1819 : DOUBLE COMPLEX QAS(1), AV, UV, G(5)
1820 : INTEGER I, K
1821 : DOUBLE COMPLEX CZERO, CONE, CTWO, CIMAG
1822 : DOUBLE PRECISION ZERO, ONE
1823 : DATA ZERO/0.0D0/, ONE/1.0D0/
1824 : !C
1825 0 : CZERO = (0.0D0,0.0D0)
1826 0 : CONE = (1.0D0,0.0D0)
1827 0 : CTWO = (2.0D0,0.0D0)
1828 0 : CIMAG = (0.0D0,1.0D0)
1829 : !C -----------------------------------------------------------------
1830 : !C - -
1831 : !C - R3(U)=1+(U-1)*(ARTH(U)/U-1)/U -
1832 : !C - R3(U)=1-U/3+U**2/3-U**3/5+U**4/5+(U-1)*U**5*X0(U) -
1833 : !C - -
1834 : !C -----------------------------------------------------------------
1835 0 : DO 100 I = 1, 2
1836 0 : AV = U(I)
1837 0 : X0(I) = SIM0UX0(AV)
1838 : !*-ASIS
1839 : R3(I) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
1840 0 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(I)))))
1841 0 : UR3(I)=(CONE-U(I))*DCMPLX(ZERO,AS(I))+CONE+U(I)-U(I)*U(I)*R3(I)
1842 0 : 100 CONTINUE ! end DO ... I = 1, 2
1843 : !C -----------------------------------------------------------------
1844 : !C - The DX0(I) Contains Derivatives Of The Function X0(U) -
1845 : !C -----------------------------------------------------------------
1846 0 : IF (LEPS(1)) THEN
1847 0 : CALL SIM0UDX0(U(2),X0(2),DX0)
1848 : END IF
1849 : !C
1850 0 : I = 1
1851 0 : UV = U(I) - U(2)
1852 0 : IF (LEPS(I)) THEN
1853 0 : QX0(I) = DX0(1) + (DX0(2)/2.0D0+(DX0(3)/6.0D0+DX0(4)/24.0D0*UV)*UV)*UV
1854 0 : QAS(I) = CZERO
1855 : ELSE
1856 0 : QX0(I) = (X0(I)-X0(2))/UV
1857 0 : QAS(I) = (AS(I)-AS(2))/UV
1858 : END IF
1859 0 : AV = U(I)
1860 0 : G(1) = U(I) + U(2)
1861 0 : DO 150 K = 2, 5
1862 0 : AV = AV*U(I)
1863 0 : G(K) = G(K-1)*U(2) + AV
1864 0 : 150 CONTINUE
1865 : QR3(I) = -CONE/3.0D0 + G(1)/3.0D0 - G(2)/5.0D0 + &
1866 0 : & G(3)/5.0D0 + (G(5)-G(4))*X0(2) + (U(I)-CONE)*AV*QX0(I)
1867 : QUR3(1) = -DCMPLX(ZERO,AS(2))+CIMAG*(CONE-U(1))*QAS(1)+ CONE - &
1868 0 : & (U(1)+U(2))*R3(2)-U(1)*U(1)*QR3(1)
1869 : !C
1870 0 : US3(2) = (U(2)-CONE)/(U(2)+CONE)*UR3(2)
1871 0 : QUS3(1)=( -US3(2)+UR3(2)+(U(1)-CONE)*QUR3(1))/(U(1)+CONE)
1872 : !c
1873 0 : AV = (U(1)+CONE)*(U(2)+CONE)
1874 0 : SIM = AV*(UR3(2) + (U(1)-CONE)*QUR3(1))
1875 0 : SIMI= AV*(US3(2) + (U(1)-CONE)*QUS3(1))
1876 : !c
1877 0 : RETURN
1878 : END SUBROUTINE S2D3TWOI
1879 : !C
1880 : !C ----------------------------------------------------------------------
1881 : !C file: s2d0leps.f
1882 : !C date: 2011-04-02
1883 : !C who: S.Kaprzyk
1884 : !C what: Return a proper CASE:
1885 : !C a) [w1<w2<ONE]; b) [w1<ONE<w2]; c) [ONE<w1<w2]
1886 : !C INPUT:
1887 : !C VERM(3) - three complex numbers
1888 : !C N - integer number for W(I)=(VERM(I)-VERM(N))/(VERM(I)+VERM(N))
1889 : !C EPS - critical distance |w1-w2| etc.
1890 : !C OUTPUT:
1891 : !C LONE(3) [w1<w2<ONE]; [w1<ONE<w2]; [ONE<w1<w2]
1892 : !C LEPS(1) [|w1-w2|<eps]
1893 0 : SUBROUTINE S2D0LEPS(VERM, N, W, AS, LONE, EPS, LEPS, iuerr)
1894 :
1895 : !IMPLICIT NONE
1896 : DOUBLE COMPLEX VERM(3)
1897 : INTEGER N
1898 : DOUBLE COMPLEX W(2)
1899 : DOUBLE PRECISION AS(2)
1900 : DOUBLE PRECISION EPS
1901 : LOGICAL LONE(3), LEPS(1)
1902 : INTEGER iuerr
1903 : !C
1904 : !c DOUBLE PRECISION DLAMCH
1905 : !c EXTERNAl DLAMCH
1906 : !C
1907 : LOGICAL LWONE(2), LV
1908 : DOUBLE COMPLEX AV
1909 : DOUBLE PRECISION AL(2), AA, AIW, OZERO
1910 : INTEGER I, II, K
1911 : DOUBLE COMPLEX CZERO, CONE
1912 : DOUBLE PRECISION ZERO, ONE, PI
1913 : DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/
1914 : DATA OZERO/ 1.0D-13/
1915 : !c OZERO = DLAMCH('e')*10
1916 0 : CZERO = (0.0D0,0.0D0)
1917 0 : CONE = (1.0D0,0.0D0)
1918 0 : IF ((N.GT.3).OR.(N.LT.1)) THEN
1919 0 : WRITE (iuerr,9010) N
1920 : 9010 FORMAT (' ***s2d0leps: N =',I6,' must be 1, or 2')
1921 0 : STOP ' ***s2d0leps: '
1922 : END IF
1923 : II = 0
1924 0 : DO 200 I = 1, 3
1925 0 : IF (I.EQ.N) GO TO 200
1926 0 : II = II + 1
1927 0 : IF (CDABS(VERM(N)-VERM(I)).LT.CDABS(VERM(N)+VERM(I))) THEN
1928 0 : LWONE(II) = .TRUE.
1929 0 : W(II) = (VERM(N)-VERM(I))/(VERM(N)+VERM(I))
1930 0 : AIW = DIMAG(W(II))
1931 0 : IF (DABS(AIW).GE.OZERO) THEN
1932 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,AIW)
1933 : ELSE
1934 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
1935 : END IF
1936 : ELSE
1937 0 : LWONE(II) = .FALSE.
1938 0 : W(II) = (VERM(N)+VERM(I))/(VERM(N)-VERM(I))
1939 0 : AIW = DIMAG(W(II))
1940 0 : IF (DABS(AIW).GE.OZERO) THEN
1941 0 : AS(II) = -0.5D0*PI*DSIGN(ONE,AIW)
1942 : ELSE
1943 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
1944 : END IF
1945 : END IF
1946 0 : AL(II) = CDABS(W(II))
1947 0 : 200 CONTINUE
1948 0 : DO 300 I = 1, 2
1949 0 : DO 250 K = I, 2
1950 0 : IF (LWONE(I).AND.LWONE(K).AND.(AL(I).LT.AL(K))) GO TO 250
1951 0 : IF (.NOT.LWONE(I).AND..NOT.LWONE(K).AND.(AL(K).LT.AL(I))) GO TO 250
1952 0 : IF (.NOT.LWONE(I).AND.LWONE(K).AND.(ONE.LT.AL(I)*AL(K))) GO TO 250
1953 0 : IF (LWONE(I).AND..NOT.LWONE(K).AND.(AL(I)*AL(K).LT.ONE)) GO TO 250
1954 0 : AA = AL(K)
1955 0 : AL(K) = AL(I)
1956 0 : AL(I) = AA
1957 0 : AA = AS(K)
1958 0 : AS(K) = AS(I)
1959 0 : AS(I) = AA
1960 0 : AV = W(K)
1961 0 : W(K) = W(I)
1962 0 : W(I) = AV
1963 0 : LV = LWONE(K)
1964 0 : LWONE(K) = LWONE(I)
1965 0 : LWONE(I) = LV
1966 0 : 250 CONTINUE
1967 0 : 300 CONTINUE
1968 : !C
1969 0 : LONE(1) = .FALSE.
1970 0 : LONE(2) = .FALSE.
1971 0 : LONE(3) = .FALSE.
1972 0 : IF (LWONE(1).AND.LWONE(2)) THEN
1973 0 : LONE(1) = .TRUE.
1974 : END IF
1975 0 : IF (LWONE(1).AND..NOT.LWONE(2)) THEN
1976 0 : LONE(2) = .TRUE.
1977 : END IF
1978 0 : IF (.NOT.LWONE(1).AND..NOT.LWONE(2)) THEN
1979 0 : LONE(3) = .TRUE.
1980 : END IF
1981 : !C here are cases, how close are w()
1982 0 : LEPS(1) = .FALSE.
1983 0 : IF ( (LONE(1).OR.LONE(3)).AND. (CDABS(W(1)-W(2)).LT.EPS) ) LEPS(1)=.TRUE.
1984 : !c
1985 0 : IF ((.NOT.LONE(1)).AND.(.NOT.LONE(2)).AND.(.NOT.LONE(3))) THEN
1986 0 : WRITE (iuerr,9030) (LONE(I),I=1,3)
1987 : 9030 FORMAT ('***s2d0leps: LONE()=',3(L1,1X),'not in order')
1988 0 : STOP '***s2d0leps: '
1989 : END IF
1990 : !C
1991 0 : RETURN
1992 : END SUBROUTINE S2D0LEPS
1993 : !C s2d0leps()
1994 : !C file: s1d0onei.f
1995 : !C date: 2011-03-20
1996 : !C who: S.Kaprzyk
1997 : !C what: Complex linear form integral over standard 1-d simplex
1998 : !C ----------------------------------------------------
1999 : !C - * -
2000 : !C - * 1 -
2001 : !C - SIM0= * dt1 ---------------------------------- -
2002 : !C - * verm(2)+(verm(1)-verm(2))*t1 -
2003 : !C - * -
2004 : !C - 0<t1<1 -
2005 : !C ----------------------------------------------------
2006 0 : SUBROUTINE S1D0ONEI(SIM0, SIM0I, VERM)
2007 :
2008 : !IMPLICIT NONE
2009 : INTEGER iuerr
2010 : PARAMETER (iuerr=6)
2011 : DOUBLE COMPLEX SIM0, SIM0I
2012 : DOUBLE COMPLEX VERM(*)
2013 : !C
2014 : DOUBLE COMPLEX SIM, SIMI
2015 : LOGICAL LONE(2),LEPS(1)
2016 : !c
2017 : DOUBLE COMPLEX U(1)
2018 : DOUBLE PRECISION AS(1)
2019 : INTEGER I, K, N
2020 : DOUBLE COMPLEX CZERO, CONE
2021 : DOUBLE PRECISION ZERO, EPS
2022 : DATA EPS/1.0D-6/
2023 : DATA ZERO/0.0D0/
2024 : !C
2025 0 : CZERO = (0.0D0,0.0D0)
2026 0 : CONE = (1.0D0,0.0D0)
2027 0 : N = 2
2028 0 : DO 100 I = 1, 1
2029 0 : IF (DIMAG(VERM(N))*DIMAG(VERM(I)).LT.ZERO) THEN
2030 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,2)
2031 : 9010 FORMAT (' ***s1d0onei: not signed ImgVERM()=',4(D13.6,1X))
2032 : !c STOP ' ***s1d0onei: '
2033 : END IF
2034 0 : 100 CONTINUE
2035 0 : DO 101 I = 1, 1
2036 0 : IF (CDABS(VERM(I)).GT.CDABS(VERM(N))) N = I
2037 0 : 101 CONTINUE
2038 : !C Here are 2 cases, how w() are placed on complex-plane
2039 : !C LONE(1..2) [w1<ONE]; [ONE<w1]
2040 : !C LEPS(1) null
2041 : !*-ASIS
2042 0 : CALL S1D0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
2043 : !c U(1) = W(1);
2044 0 : IF (LONE(1)) THEN
2045 0 : CALL S1D1ONEI(U,AS,LEPS,SIM,SIMI)
2046 : END IF
2047 : !c U(1) = CONE/W(1)
2048 0 : IF (LONE(2)) THEN
2049 0 : CALL S1D2ONEI(U,AS,LEPS,SIM,SIMI)
2050 : END IF
2051 : !C
2052 0 : SIM0 = SIM/VERM(N)
2053 0 : SIM0I= log(VERM(N)) + SIMI - CONE
2054 0 : RETURN
2055 : END SUBROUTINE S1D0ONEI
2056 : !C
2057 : !C ----------------------------------------------------------------------
2058 : !C file: s1d0twoi.f
2059 : !C date: 2011-03-24
2060 : !C who: S.Kaprzyk
2061 : !C what: Complex linear form integrals over standard 1d-simplex
2062 : !C ------------------(i=1)--------------------------------------
2063 : !C * -
2064 : !C * t_i -
2065 : !C VERL(i)= *dt1 ------------------------------------------ -
2066 : !C * VERM(2)+[VERM(1)-VERM(2)]*t1 -
2067 : !C * -
2068 : !C 0<t1<1 -
2069 : !C -------------------(i=2)-------------------------------------
2070 : !C * -
2071 : !C * 1- t1 -
2072 : !C VERL(2)= *dt1 ------------------------------------------ -
2073 : !C * VERM(2)+[VERM(1)-VERM(2)]*t1 -
2074 : !C * -
2075 : !C 0<t1<1 -
2076 : !C -------------------------------------------------------------
2077 0 : SUBROUTINE S1D0TWOI(VERL, VERLI, VERM)
2078 :
2079 : !IMPLICIT NONE
2080 : INTEGER iuerr
2081 : PARAMETER (iuerr=6)
2082 : DOUBLE COMPLEX VERL(*), VERLI(*), VERM(*)
2083 : !C
2084 : DOUBLE COMPLEX SIM, SIMI
2085 : LOGICAL LONE(2),LEPS(1)
2086 : !c
2087 : INTEGER I, K, N
2088 : DOUBLE PRECISION AS(1)
2089 : DOUBLE COMPLEX U(1)
2090 : DOUBLE COMPLEX CZERO
2091 : DOUBLE PRECISION EPS
2092 : DOUBLE PRECISION ZERO
2093 : DATA EPS/1.0D-6/
2094 : DATA ZERO/0.0D0/
2095 : !C
2096 0 : CZERO = (0.0D0,0.0D0)
2097 0 : DO 50 I = 1, 1
2098 0 : IF (DIMAG(VERM(2))*DIMAG(VERM(I)).LT.ZERO) THEN
2099 0 : WRITE (iuerr,9010) (DIMAG(VERM(K)),K=1,2)
2100 : 9010 FORMAT (' ***s1d0twoi: not signed ImgVERM()=',2(D13.6,1X))
2101 0 : STOP ' ***s1dt0woi: '
2102 : END IF
2103 0 : 50 CONTINUE
2104 0 : DO 100 N = 1, 2
2105 0 : VERL(N) = CZERO
2106 : !C Here are 2 cases, how w() are placed on complex-plane
2107 : !C LONE(1..2) [w1<ONE]; [ONE<w1]
2108 : !C LEPS(1) null
2109 : !*-ASIS
2110 0 : CALL S1D0LEPS(VERM, N, U, AS, LONE, EPS, LEPS, iuerr)
2111 : !c U(1) = W(1);
2112 0 : IF (LONE(1)) THEN
2113 0 : CALL S1D1TWOI(U,AS,LEPS,SIM,SIMI)
2114 : END IF
2115 : !c U(1) = CONE/W(1);
2116 0 : IF (LONE(2)) THEN
2117 0 : CALL S1D2TWOI(U,AS,LEPS,SIM,SIMI)
2118 : END IF
2119 : !c
2120 0 : VERL(N) = 0.50D0*SIM/VERM(N)
2121 0 : VERLI(N) = 0.50D0*log(VERM(N)) + 0.25D0*SIMI -0.25D0
2122 0 : 100 CONTINUE ! end DO .. N = 1, 2
2123 0 : RETURN
2124 : END SUBROUTINE S1D0TWOI
2125 : !C
2126 : !C ----------------------------------------------------------------------
2127 : !C file: s1d1onei.f
2128 : !C date: 2010-09-22
2129 : !C who: S.Kaprzyk
2130 : !C what: CASE a) : [w1<ONE]
2131 : !C U(1)=W(1)
2132 : !C LEPS() null
2133 0 : SUBROUTINE S1D1ONEI(U,AS,LEPS, SIM1, SIM1I)
2134 :
2135 : !IMPLICIT NONE
2136 : DOUBLE COMPLEX U(1)
2137 : DOUBLE PRECISION AS(1)
2138 : LOGICAL LEPS(1)
2139 : DOUBLE COMPLEX SIM1, SIM1I
2140 : !C
2141 : !DOUBLE COMPLEX SIM0UR0
2142 : !EXTERNAL SIM0UR0
2143 : DOUBLE COMPLEX R0(1)
2144 : DOUBLE COMPLEX CZERO, CONE
2145 : DOUBLE PRECISION ZERO, ONE
2146 : DATA ZERO/0.0D0/, ONE/1.0D0/
2147 : !C
2148 : ABI_UNUSED(as)
2149 : ABI_UNUSED(leps)
2150 0 : CZERO = (0.0D0,0.0D0)
2151 0 : CONE = (1.0D0,0.0D0)
2152 : !C ------------------------------------------------------------------
2153 : !C R0(U) = ARTH(U)/U
2154 : !C R0(U) = 1+U**2/3+U**6*X0(U)
2155 : !C ------------------------------------------------------------------
2156 0 : R0(1) = SIM0UR0(U(1))
2157 0 : SIM1 = (CONE+U(1))*R0(1)
2158 0 : SIM1I = (CONE-U(1))*R0(1)
2159 0 : RETURN
2160 : END SUBROUTINE S1D1ONEI
2161 : !C
2162 : !C ----------------------------------------------------------------------
2163 : !C file: s1d1twoi.f
2164 : !C date: 2011-03-25
2165 : !C who: S.Kaprzyk
2166 : !C what: CASE a) : [w1<ONE]
2167 : !C U(1)=W(1)
2168 : !C LEPS() null
2169 0 : SUBROUTINE S1D1TWOI(U,AS,LEPS, SIM, SIMI)
2170 :
2171 : !IMPLICIT NONE
2172 : DOUBLE COMPLEX U(1)
2173 : DOUBLE PRECISION AS(1)
2174 : LOGICAL LEPS(1)
2175 : DOUBLE COMPLEX SIM, SIMI
2176 : !C
2177 : !DOUBLE COMPLEX SIM0UX0
2178 : !EXTERNAL SIM0UX0
2179 : !c
2180 : DOUBLE COMPLEX X0(1), R2(1), S2(1)
2181 : DOUBLE COMPLEX AV
2182 : DOUBLE COMPLEX CZERO, CONE
2183 : DOUBLE PRECISION ZERO, ONE
2184 : DATA ZERO/0.0D0/, ONE/1.0D0/
2185 : !C
2186 : ABI_UNUSED(as)
2187 : ABI_UNUSED(leps)
2188 0 : CZERO = (0.0D0,0.0D0)
2189 0 : CONE = (1.0D0,0.0D0)
2190 : !C -----------------------------------------------------------------
2191 : !C - -
2192 : !C - R2(W)=1+(W-1)*(ARTH(W)/W-1)/W=[1+(W-1)*R0(W)]/W -
2193 : !C - R2(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
2194 : !C - -
2195 : !C -----------------------------------------------------------------
2196 0 : AV = U(1)
2197 0 : X0(1) = SIM0UX0(AV)
2198 : !*-ASIS
2199 : R2(1) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
2200 0 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(1)))))
2201 0 : S2(1) = (CONE-U(1))/(CONE+U(1))*R2(1)
2202 0 : SIM = (CONE+U(1))*R2(1)
2203 0 : SIMI = (CONE+U(1))*S2(1)
2204 0 : RETURN
2205 : END SUBROUTINE S1D1TWOI
2206 : !C
2207 : !C ----------------------------------------------------------------------
2208 : !C file: s1d2onei.f
2209 : !C date: 2011-03-20
2210 : !C who: S.Kaprzyk
2211 : !C what: CASE b) : [ ONE<w1]
2212 : !C U(1) = CONE/W(1)
2213 : !C LEPS(1) null
2214 0 : SUBROUTINE S1D2ONEI(U,AS,LEPS,SIM2,SIM2I)
2215 :
2216 : !IMPLICIT NONE
2217 : DOUBLE COMPLEX U(1)
2218 : DOUBLE PRECISION AS(1)
2219 : LOGICAL LEPS(1)
2220 : DOUBLE COMPLEX SIM2, SIM2I
2221 : !c
2222 : !DOUBLE COMPLEX SIM0UR0
2223 : !EXTERNAL SIM0UR0
2224 : DOUBLE COMPLEX R0(1)
2225 : DOUBLE COMPLEX CZERO, CONE, CIMAG
2226 : DOUBLE PRECISION ZERO, ONE
2227 : DATA ZERO/0.0D0/, ONE/1.0D0/
2228 : !C
2229 : ABI_UNUSED(leps)
2230 0 : CZERO = (0.0D0,0.0D0)
2231 0 : CONE = (1.0D0,0.0D0)
2232 0 : CIMAG = (0.0D0,1.0D0)
2233 : !C ------------------------------------------------------------------
2234 : !C R0(U)=ARTH(U)/U
2235 : !C R0(U)=1+U**2/3+U**6*X0(U)
2236 : !C ------------------------------------------------------------------
2237 0 : R0(1) = SIM0UR0(U(1))
2238 0 : SIM2 = (U(1)+CONE)*(CIMAG*AS(1)+U(1)*R0(1))
2239 0 : SIM2I= (U(1)-CONE)*(CIMAG*AS(1)+U(1)*R0(1))
2240 : !c
2241 0 : RETURN
2242 : END SUBROUTINE S1D2ONEI
2243 : !C
2244 : !C ----------------------------------------------------------------------
2245 : !C s1d2onei()
2246 : !C file: s1d2twoi.f
2247 : !C date: 2011-03-25
2248 : !C who: S.Kaprzyk
2249 : !C what: CASE b) : [ ONE<w1]
2250 : !C U(1) = CONE/W(1)
2251 : !C LEPS(1) null
2252 0 : SUBROUTINE S1D2TWOI(U,AS,LEPS, SIM, SIMI)
2253 :
2254 : !IMPLICIT NONE
2255 : DOUBLE COMPLEX U(1)
2256 : DOUBLE PRECISION AS(1)
2257 : LOGICAL LEPS(1)
2258 : DOUBLE COMPLEX SIM, SIMI
2259 : !C
2260 : !DOUBLE COMPLEX SIM0UX0
2261 : !EXTERNAL SIM0UX0
2262 : !c
2263 : DOUBLE COMPLEX X0(2), R2(2), S2(2)
2264 : DOUBLE COMPLEX AV
2265 : !INTEGER I
2266 : DOUBLE COMPLEX CZERO, CONE
2267 : DOUBLE PRECISION ZERO, ONE
2268 : DATA ZERO/0.0D0/, ONE/1.0D0/
2269 : !C
2270 : ABI_UNUSED(leps)
2271 0 : CZERO = (0.0D0,0.0D0)
2272 0 : CONE = (1.0D0,0.0D0)
2273 : !C -----------------------------------------------------------------
2274 : !C - -
2275 : !C - R2(W)=1+(W-1)*(ARTH(W)/W-1)/W -
2276 : !C - R2(W)=1-W/3+W**2/3-W**3/5+W**4/5+(W-1)*W**5*X0(W) -
2277 : !C - -
2278 : !C -----------------------------------------------------------------
2279 0 : AV = U(1)
2280 0 : X0(1) = SIM0UX0(AV)
2281 : !*-ASIS
2282 : R2(1) = CONE + AV*(-CONE/3.0D0 + AV*(CONE/3.0D0 + &
2283 0 : & AV*((-0.2D0,0.0D0)+AV*((0.2D0,0.0D0)+AV*(AV-CONE)*X0(1)))))
2284 : !C
2285 0 : R2(1)= (CONE-U(1))*DCMPLX(ZERO,AS(1))+CONE+U(1)-U(1)*U(1)*R2(1)
2286 0 : S2(1) = (U(1)-CONE)/(U(1)+CONE)*R2(1)
2287 0 : SIM = (U(1)+CONE)*R2(1)
2288 0 : SIMI = (U(1)+CONE)*S2(1)
2289 : !C
2290 0 : RETURN
2291 : END SUBROUTINE S1D2TWOI
2292 : !C
2293 : !C ----------------------------------------------------------------------
2294 : !C file: s1d0leps.f
2295 : !C date: 2011-04-02
2296 : !C who: S.Kaprzyk
2297 : !C what: Return a proper case:
2298 : !C a) [w1<ONE]; b) [ONE<w1]
2299 : !C INPUT:
2300 : !C VERM(1,2) - two complex numbers
2301 : !C N - integer number for W(I)=(VERM(I)-VERM(N))/(VERM(I)+VERM(N))
2302 : !C EPS - critical distance
2303 : !C OUTPUT:
2304 : !C LONE(2) [w1<ONE]; [ONE<w1]
2305 : !C LEPS(1) null
2306 0 : SUBROUTINE S1D0LEPS(VERM, N, W, AS, LONE, EPS, LEPS, iuerr)
2307 :
2308 : !IMPLICIT NONE
2309 : DOUBLE COMPLEX VERM(2)
2310 : INTEGER N
2311 : DOUBLE COMPLEX W(1)
2312 : DOUBLE PRECISION AS(1)
2313 : DOUBLE PRECISION EPS
2314 : LOGICAL LONE(2), LEPS(1)
2315 : INTEGER iuerr
2316 : !C
2317 : !c DOUBLE PRECISION DLAMCH
2318 : !c EXTERNAl DLAMCH
2319 : !C
2320 : LOGICAL LWONE(1)
2321 : DOUBLE PRECISION AL(1), AIW, OZERO
2322 : INTEGER I, II !, K
2323 : DOUBLE COMPLEX CZERO, CONE
2324 : DOUBLE PRECISION ZERO, ONE, PI
2325 : DATA ZERO/0.0D0/,ONE/1.0D0/,PI/3.141592653589793D0/
2326 : DATA OZERO/ 1.0D-13/
2327 : ABI_UNUSED(eps)
2328 : !c OZERO = DLAMCH('e')*10
2329 0 : CZERO = (0.0D0,0.0D0)
2330 0 : CONE = (1.0D0,0.0D0)
2331 0 : IF ((N.GT.2).OR.(N.LT.1)) THEN
2332 0 : WRITE (iuerr,9010) N
2333 : 9010 FORMAT (' ***s1d0leps: N =',I6,' must be 1, or 2')
2334 0 : STOP ' ***s1d0leps: '
2335 : END IF
2336 : !C
2337 : II = 0
2338 0 : DO 200 I = 1, 2
2339 0 : IF (I.EQ.N) GO TO 200
2340 0 : II = II + 1
2341 0 : IF (CDABS(VERM(N)-VERM(I)).LT.CDABS(VERM(N)+VERM(I))) THEN
2342 0 : LWONE(II) = .TRUE.
2343 0 : W(II) = (VERM(N)-VERM(I))/(VERM(N)+VERM(I))
2344 0 : AIW = DIMAG(W(II))
2345 0 : IF (DABS(AIW).GE.OZERO) THEN
2346 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,AIW)
2347 : ELSE
2348 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
2349 : END IF
2350 : ELSE
2351 0 : LWONE(II) = .FALSE.
2352 0 : W(II) = (VERM(N)+VERM(I))/(VERM(N)-VERM(I))
2353 0 : AIW = DIMAG(W(II))
2354 0 : IF (DABS(AIW).GE.OZERO) THEN
2355 0 : AS(II) = -0.5D0*PI*DSIGN(ONE,AIW)
2356 : ELSE
2357 0 : AS(II) = 0.5D0*PI*DSIGN(ONE,DREAL(VERM(I)-VERM(N)))
2358 : END IF
2359 : END IF
2360 0 : AL(II) = CDABS(W(II))
2361 0 : 200 CONTINUE
2362 : !C
2363 0 : LONE(1) = .FALSE.
2364 0 : LONE(2) = .FALSE.
2365 0 : IF (LWONE(1)) THEN
2366 0 : LONE(1) = .TRUE.
2367 : END IF
2368 0 : IF (.NOT.LWONE(1)) THEN
2369 0 : LONE(2) = .TRUE.
2370 : END IF
2371 : !C here are cases, how close are w()
2372 0 : LEPS(1) = .FALSE.
2373 : !c
2374 0 : IF ((.NOT.LONE(1)).AND.(.NOT.LONE(2))) THEN
2375 0 : WRITE (iuerr,9030) (LONE(I),I=1,2)
2376 : 9030 FORMAT ('***s1d0leps: LONE()=',2(L1,1X),'not in order')
2377 0 : STOP '***s1d0leps: '
2378 : END IF
2379 : !c
2380 0 : RETURN
2381 : END SUBROUTINE S1D0LEPS
2382 : !C
2383 :
2384 : end module m_simtet
2385 : !!***
|