1
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
2
c written by the UFO converter
3
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
5
DOUBLE COMPLEX FUNCTION COND(CONDITION,TRUECASE,FALSECASE)
7
DOUBLE COMPLEX CONDITION,TRUECASE,FALSECASE
8
IF(CONDITION.EQ.(0.0D0,0.0D0)) THEN
15
DOUBLE COMPLEX FUNCTION CONDIF(CONDITION,TRUECASE,FALSECASE)
18
DOUBLE COMPLEX TRUECASE,FALSECASE
26
DOUBLE COMPLEX FUNCTION RECMS(CONDITION,EXPR)
33
RECMS=DCMPLX(DBLE(EXPR))
37
DOUBLE COMPLEX FUNCTION REGLOG(ARG_IN)
40
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
44
IF(DABS(DIMAG(ARG)).EQ.0.0D0)THEN
45
ARG=DCMPLX(DBLE(ARG),0.0D0)
47
IF(DABS(DBLE(ARG)).EQ.0.0D0)THEN
48
ARG=DCMPLX(0.0D0,DIMAG(ARG))
50
IF(ARG.EQ.(0.0D0,0.0D0)) THEN
57
DOUBLE COMPLEX FUNCTION REGLOGP(ARG_IN)
60
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
64
IF(DABS(DIMAG(ARG)).EQ.0.0D0)THEN
65
ARG=DCMPLX(DBLE(ARG),0.0D0)
67
IF(DABS(DBLE(ARG)).EQ.0.0D0)THEN
68
ARG=DCMPLX(0.0D0,DIMAG(ARG))
70
IF(ARG.EQ.(0.0D0,0.0D0))THEN
73
IF(DBLE(ARG).LT.0.0D0.AND.DIMAG(ARG).LT.0.0D0)THEN
74
REGLOGP=LOG(ARG) + TWOPII
81
DOUBLE COMPLEX FUNCTION REGLOGM(ARG_IN)
84
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
88
IF(DABS(DIMAG(ARG)).EQ.0.0D0)THEN
89
ARG=DCMPLX(DBLE(ARG),0.0D0)
91
IF(DABS(DBLE(ARG)).EQ.0.0D0)THEN
92
ARG=DCMPLX(0.0D0,DIMAG(ARG))
94
IF(ARG.EQ.(0.0D0,0.0D0))THEN
97
IF(DBLE(ARG).LT.0.0D0.AND.DIMAG(ARG).GT.0.0D0)THEN
98
REGLOGM=LOG(ARG) - TWOPII
105
DOUBLE COMPLEX FUNCTION REGSQRT(ARG_IN)
107
DOUBLE COMPLEX ARG_IN
110
IF(DABS(DIMAG(ARG)).EQ.0.0D0)THEN
111
ARG=DCMPLX(DBLE(ARG),0.0D0)
113
IF(DABS(DBLE(ARG)).EQ.0.0D0)THEN
114
ARG=DCMPLX(0.0D0,DIMAG(ARG))
119
DOUBLE COMPLEX FUNCTION GRREGLOG(LOGSW,EXPR1_IN,EXPR2_IN)
121
DOUBLE COMPLEX TWOPII
122
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
123
DOUBLE COMPLEX EXPR1_IN,EXPR2_IN
124
DOUBLE COMPLEX EXPR1,EXPR2
125
DOUBLE PRECISION LOGSW
126
DOUBLE PRECISION IMAGEXPR
130
IF(DABS(DIMAG(EXPR1)).EQ.0.0D0)THEN
131
EXPR1=DCMPLX(DBLE(EXPR1),0.0D0)
133
IF(DABS(DBLE(EXPR1)).EQ.0.0D0)THEN
134
EXPR1=DCMPLX(0.0D0,DIMAG(EXPR1))
136
IF(DABS(DIMAG(EXPR2)).EQ.0.0D0)THEN
137
EXPR2=DCMPLX(DBLE(EXPR2),0.0D0)
139
IF(DABS(DBLE(EXPR2)).EQ.0.0D0)THEN
140
EXPR2=DCMPLX(0.0D0,DIMAG(EXPR2))
142
IF(EXPR1.EQ.(0.0D0,0.0D0))THEN
143
GRREGLOG=(0.0D0,0.0D0)
145
IMAGEXPR=DIMAG(EXPR1)*DIMAG(EXPR2)
146
FIRSTSHEET=IMAGEXPR.GE.0.0D0
147
FIRSTSHEET=FIRSTSHEET.OR.DBLE(EXPR1).GE.0.0D0
148
FIRSTSHEET=FIRSTSHEET.OR.DBLE(EXPR2).GE.0.0D0
152
IF(DIMAG(EXPR1).GT.0.0D0)THEN
153
GRREGLOG=LOG(EXPR1) - LOGSW*TWOPII
155
GRREGLOG=LOG(EXPR1) + LOGSW*TWOPII
164
DOUBLE COMPLEX P2,M12,M22
166
TYPE(B0F_NODE),POINTER::PARENT
167
TYPE(B0F_NODE),POINTER::LEFT
168
TYPE(B0F_NODE),POINTER::RIGHT
173
SUBROUTINE B0F_SEARCH(ITEM, HEAD, FIND)
175
TYPE(B0F_NODE),POINTER,INTENT(INOUT)::HEAD,ITEM
176
LOGICAL,INTENT(OUT)::FIND
177
TYPE(B0F_NODE),POINTER::ITEM1
180
NULLIFY(ITEM%%PARENT)
183
IF(.NOT.ASSOCIATED(HEAD))THEN
189
ICOMP=B0F_NODE_COMPARE(ITEM,ITEM1)
191
IF(.NOT.ASSOCIATED(ITEM1%%LEFT))THEN
193
ITEM%%PARENT => ITEM1
198
ELSEIF(ICOMP.GT.0)THEN
199
IF(.NOT.ASSOCIATED(ITEM1%%RIGHT))THEN
201
ITEM%%PARENT => ITEM1
204
ITEM1 => ITEM1%%RIGHT
208
ITEM%%VALUE=ITEM1%%VALUE
215
INTEGER FUNCTION B0F_NODE_COMPARE(ITEM1,ITEM2) RESULT(RES)
217
TYPE(B0F_NODE),POINTER,INTENT(IN)::ITEM1,ITEM2
218
RES=COMPLEX_COMPARE(ITEM1%%P2,ITEM2%%P2)
220
RES=COMPLEX_COMPARE(ITEM1%%M22,ITEM2%%M22)
222
RES=COMPLEX_COMPARE(ITEM1%%M12,ITEM2%%M12)
226
INTEGER FUNCTION REAL_COMPARE(R1,R2) RESULT(RES)
228
DOUBLE PRECISION R1,R2
229
DOUBLE PRECISION MAXR,DIFF
230
DOUBLE PRECISION TINY
231
PARAMETER (TINY=-1D-14)
232
MAXR=MAX(ABS(R1),ABS(R2))
234
IF(MAXR.LE.1D-99.OR.ABS(DIFF)/MAX(MAXR,1D-99).LE.ABS(TINY))THEN
247
INTEGER FUNCTION COMPLEX_COMPARE(C1,C2) RESULT(RES)
250
DOUBLE PRECISION R1,R2
253
RES=REAL_COMPARE(R1,R2)
257
RES=REAL_COMPARE(R1,R2)
261
END MODULE B0F_CACHING
263
DOUBLE COMPLEX FUNCTION B0F(P2,M12,M22)
266
DOUBLE COMPLEX P2,M12,M22
267
DOUBLE COMPLEX ZERO,TWOPII
268
PARAMETER (ZERO=(0.0D0,0.0D0))
269
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
270
DOUBLE PRECISION M,M2,GA,GA2
271
DOUBLE PRECISION TINY
272
PARAMETER (TINY=-1D-14)
273
DOUBLE COMPLEX LOGTERMS
274
DOUBLE COMPLEX LOG_TRAJECTORY
276
PARAMETER (USE_CACHING=.TRUE.)
277
TYPE(B0F_NODE),POINTER::ITEM
278
TYPE(B0F_NODE),POINTER,SAVE::B0F_BT
284
C it is a special case
285
C refer to Eq.(5.48) in arXiv:1804.10017
288
IF(M.LT.TINY.OR.M2.LT.TINY)THEN
289
WRITE(*,*)'ERROR:B0F is not well defined when M^2,M2^2<0'
304
IF(P2.NE.M22.AND.P2.NE.ZERO.AND.M22.NE.ZERO)THEN
305
B0F=(M22-P2)/P2*LOG((M22-P2)/M22)
306
IF(M.GT.M2.AND.GA*M2.GT.GA2*M)THEN
311
WRITE(*,*)'ERROR:B0F is not supported for a simple form'
316
C trajectory method as advocated in arXiv:1804.10017 (Eq.(E.47))
327
CALL B0F_SEARCH(ITEM,B0F_BT,FIND)
333
LOGTERMS=LOG_TRAJECTORY(100,P2,M12,M22)
334
B0F=-LOG(P2/M22)+LOGTERMS
339
LOGTERMS=LOG_TRAJECTORY(100,P2,M12,M22)
340
B0F=-LOG(P2/M22)+LOGTERMS
345
DOUBLE COMPLEX FUNCTION SQRT_TRAJECTORY(N_SEG,P2,M12,M22)
346
C only needed when p2*m12*m22=\=0
348
INTEGER N_SEG ! number of segments
349
DOUBLE COMPLEX P2,M12,M22
350
DOUBLE COMPLEX ZERO,ONE
351
PARAMETER (ZERO=(0.0D0,0.0D0),ONE=(1.0D0,0.0D0))
352
DOUBLE COMPLEX GAMMA0,GAMMA1
353
DOUBLE PRECISION M,GA,DGA,GA_START
354
DOUBLE PRECISION GAI,INTERSECTION
355
DOUBLE COMPLEX ARGIM1,ARGI,P2I
356
DOUBLE COMPLEX GAMMA0I,GAMMA1I
357
DOUBLE PRECISION TINY
358
PARAMETER (TINY=-1D-24)
360
DOUBLE PRECISION PREFACTOR
361
IF(ABS(P2*M12*M22).EQ.0D0)THEN
362
WRITE(*,*)'ERROR:sqrt_trajectory works when p2*m12*m22/=0'
372
C Eq.(5.37) in arXiv:1804.10017
373
GAMMA0=ONE+M12/P2-M22/P2
374
GAMMA1=M12/P2-DCMPLX(0D0,1D0)*ABS(TINY)/P2
375
IF(ABS(GA).EQ.0D0)THEN
376
SQRT_TRAJECTORY=SQRT(GAMMA0**2-4D0*GAMMA1)
379
C segments from -DABS(tiny*Ga) to Ga
380
GA_START=-DABS(TINY*GA)
381
DGA=(GA-GA_START)/N_SEG
384
P2I=DCMPLX(M**2,-GAI*M)
385
GAMMA0I=ONE+M12/P2I-M22/P2I
386
GAMMA1I=M12/P2I-DCMPLX(0D0,1D0)*ABS(TINY)/P2I
387
ARGIM1=GAMMA0I**2-4D0*GAMMA1I
390
P2I=DCMPLX(M**2,-GAI*M)
391
GAMMA0I=ONE+M12/P2I-M22/P2I
392
GAMMA1I=M12/P2I-DCMPLX(0D0,1D0)*ABS(TINY)/P2I
393
ARGI=GAMMA0I**2-4D0*GAMMA1I
394
IF(DIMAG(ARGI)*DIMAG(ARGIM1).LT.0D0)THEN
395
INTERSECTION=DIMAG(ARGIM1)*(DBLE(ARGI)-DBLE(ARGIM1))
396
INTERSECTION=INTERSECTION/(DIMAG(ARGI)-DIMAG(ARGIM1))
397
INTERSECTION=INTERSECTION-DBLE(ARGIM1)
398
IF(INTERSECTION.GT.0D0)THEN
404
SQRT_TRAJECTORY=SQRT(GAMMA0**2-4D0*GAMMA1)*PREFACTOR
408
DOUBLE COMPLEX FUNCTION LOG_TRAJECTORY(N_SEG,P2,M12,M22)
409
C sum of log terms appearing in Eq.(5.35) of arXiv:1804.10017
410
C only needed when p2*m12*m22=\=0
412
C 4 possible logarithms appearing in Eq.(5.35) of
414
C log(arg(i)) with arg(i) for i=1 to 4
417
C i=3: (ga_{+}-1)/ga_{+}
418
C i=4: (ga_{-}-1)/ga_{-}
419
INTEGER N_SEG ! number of segments
420
DOUBLE COMPLEX P2,M12,M22
421
DOUBLE COMPLEX ZERO,ONE,HALF,TWOPII
422
PARAMETER (ZERO=(0.0D0,0.0D0),ONE=(1.0D0,0.0D0))
423
PARAMETER (HALF=(0.5D0,0.0D0))
424
PARAMETER (TWOPII=2.0D0*3.1415926535897932D0*(0.0D0,1.0D0))
425
DOUBLE COMPLEX GAMMA0,GAMMAP,GAMMAM,SQRTTERM
426
DOUBLE PRECISION M,GA,DGA,GA_START
427
DOUBLE PRECISION GAI,INTERSECTION
428
DOUBLE COMPLEX ARGIM1(4),ARGI(4),P2I,SQRTTERMI
429
DOUBLE COMPLEX GAMMA0I,GAMMAPI,GAMMAMI
430
DOUBLE PRECISION TINY
431
PARAMETER (TINY=-1D-14)
433
DOUBLE COMPLEX ADDFACTOR(4)
434
DOUBLE COMPLEX SQRT_TRAJECTORY
435
IF(ABS(P2*M12*M22).EQ.0D0)THEN
436
WRITE(*,*)'ERROR:log_trajectory works when p2*m12*m22/=0'
446
C Eq.(5.36-5.38) in arXiv:1804.10017
447
SQRTTERM=SQRT_TRAJECTORY(N_SEG,P2,M12,M22)
448
GAMMA0=ONE+M12/P2-M22/P2
449
GAMMAP=HALF*(GAMMA0+SQRTTERM)
450
GAMMAM=HALF*(GAMMA0-SQRTTERM)
451
IF(ABS(GA).EQ.0D0)THEN
452
LOG_TRAJECTORY=-LOG(GAMMAP-ONE)-LOG(GAMMAM-ONE)+GAMMAP
453
$ *LOG((GAMMAP-ONE)/GAMMAP)+GAMMAM*LOG((GAMMAM-ONE)/GAMMAM)
456
C segments from -DABS(tiny*Ga) to Ga
457
GA_START=-DABS(TINY*GA)
458
DGA=(GA-GA_START)/N_SEG
461
P2I=DCMPLX(M**2,-GAI*M)
462
SQRTTERMI=SQRT_TRAJECTORY(N_SEG,P2I,M12,M22)
463
GAMMA0I=ONE+M12/P2I-M22/P2I
464
GAMMAPI=HALF*(GAMMA0I+SQRTTERMI)
465
GAMMAMI=HALF*(GAMMA0I-SQRTTERMI)
466
ARGIM1(1)=GAMMAPI-ONE
467
ARGIM1(2)=GAMMAMI-ONE
468
ARGIM1(3)=(GAMMAPI-ONE)/GAMMAPI
469
ARGIM1(4)=(GAMMAMI-ONE)/GAMMAMI
472
P2I=DCMPLX(M**2,-GAI*M)
473
SQRTTERMI=SQRT_TRAJECTORY(N_SEG,P2I,M12,M22)
474
GAMMA0I=ONE+M12/P2I-M22/P2I
475
GAMMAPI=HALF*(GAMMA0I+SQRTTERMI)
476
GAMMAMI=HALF*(GAMMA0I-SQRTTERMI)
479
ARGI(3)=(GAMMAPI-ONE)/GAMMAPI
480
ARGI(4)=(GAMMAMI-ONE)/GAMMAMI
482
IF(DIMAG(ARGI(J))*DIMAG(ARGIM1(J)).LT.0D0)THEN
483
INTERSECTION=DIMAG(ARGIM1(J))*(DBLE(ARGI(J))
485
INTERSECTION=INTERSECTION/(DIMAG(ARGI(J))-DIMAG(ARGIM1(J)
487
INTERSECTION=INTERSECTION-DBLE(ARGIM1(J))
488
IF(INTERSECTION.GT.0D0)THEN
489
IF(DIMAG(ARGIM1(J)).LT.0)THEN
490
ADDFACTOR(J)=ADDFACTOR(J)-TWOPII
492
ADDFACTOR(J)=ADDFACTOR(J)+TWOPII
499
LOG_TRAJECTORY=-(LOG(GAMMAP-ONE)+ADDFACTOR(1))-(LOG(GAMMAM-ONE)
501
LOG_TRAJECTORY=LOG_TRAJECTORY+GAMMAP*(LOG((GAMMAP-ONE)/GAMMAP)
503
LOG_TRAJECTORY=LOG_TRAJECTORY+GAMMAM*(LOG((GAMMAM-ONE)/GAMMAM)
508
DOUBLE COMPLEX FUNCTION ARG(COMNUM)
510
DOUBLE COMPLEX COMNUM
513
IF(COMNUM.EQ.(0.0D0,0.0D0)) THEN
516
ARG=LOG(COMNUM/ABS(COMNUM))/IIM
521
COMPLEX*32 FUNCTION MP_COND(CONDITION,TRUECASE,FALSECASE)
523
COMPLEX*32 CONDITION,TRUECASE,FALSECASE
524
IF(CONDITION.EQ.(0.0E0_16,0.0E0_16)) THEN
531
COMPLEX*32 FUNCTION MP_CONDIF(CONDITION,TRUECASE,FALSECASE)
534
COMPLEX*32 TRUECASE,FALSECASE
542
COMPLEX*32 FUNCTION MP_RECMS(CONDITION,EXPR)
549
MP_RECMS=CMPLX(REAL(EXPR),KIND=16)
554
COMPLEX*32 FUNCTION MP_REGLOG(ARG_IN)
557
PARAMETER (TWOPII=2.0E0_16
558
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
563
IF(ABS(IMAGPART(ARG)).EQ.0.0E0_16)THEN
564
ARG=CMPLX(REAL(ARG,KIND=16),0.0E0_16)
566
IF(ABS(REAL(ARG,KIND=16)).EQ.0.0E0_16)THEN
567
ARG=CMPLX(0.0E0_16,IMAGPART(ARG))
569
IF(ARG.EQ.(0.0E0_16,0.0E0_16)) THEN
570
MP_REGLOG=(0.0E0_16,0.0E0_16)
576
COMPLEX*32 FUNCTION MP_REGLOGP(ARG_IN)
579
PARAMETER (TWOPII=2.0E0_16
580
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
585
IF(ABS(IMAGPART(ARG)).EQ.0.0E0_16)THEN
586
ARG=CMPLX(REAL(ARG,KIND=16),0.0E0_16)
588
IF(ABS(REAL(ARG,KIND=16)).EQ.0.0E0_16)THEN
589
ARG=CMPLX(0.0E0_16,IMAGPART(ARG))
591
IF(ARG.EQ.(0.0E0_16,0.0E0_16))THEN
592
MP_REGLOGP=(0.0E0_16,0.0E0_16)
594
IF(REAL(ARG,KIND=16).LT.0.0E0_16.AND.IMAGPART(ARG)
596
MP_REGLOGP=LOG(ARG) + TWOPII
603
COMPLEX*32 FUNCTION MP_REGLOGM(ARG_IN)
606
PARAMETER (TWOPII=2.0E0_16
607
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
612
IF(ABS(IMAGPART(ARG)).EQ.0.0E0_16)THEN
613
ARG=CMPLX(REAL(ARG,KIND=16),0.0E0_16)
615
IF(ABS(REAL(ARG,KIND=16)).EQ.0.0E0_16)THEN
616
ARG=CMPLX(0.0E0_16,IMAGPART(ARG))
618
IF(ARG.EQ.(0.0E0_16,0.0E0_16))THEN
619
MP_REGLOGM=(0.0E0_16,0.0E0_16)
621
IF(REAL(ARG,KIND=16).LT.0.0E0_16.AND.IMAGPART(ARG)
623
MP_REGLOGM=LOG(ARG) - TWOPII
630
COMPLEX*32 FUNCTION MP_REGSQRT(ARG_IN)
635
IF(ABS(IMAGPART(ARG)).EQ.0.0E0_16)THEN
636
ARG=CMPLX(REAL(ARG,KIND=16),0.0E0_16)
638
IF(ABS(REAL(ARG,KIND=16)).EQ.0.0E0_16)THEN
639
ARG=CMPLX(0.0E0_16,IMAGPART(ARG))
644
COMPLEX*32 FUNCTION MP_GRREGLOG(LOGSW,EXPR1_IN,EXPR2_IN)
647
PARAMETER (TWOPII=2.0E0_16
648
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
650
COMPLEX*32 EXPR1_IN,EXPR2_IN
651
COMPLEX*32 EXPR1,EXPR2
657
IF(ABS(IMAGPART(EXPR1)).EQ.0.0E0_16)THEN
658
EXPR1=CMPLX(REAL(EXPR1,KIND=16),0.0E0_16)
660
IF(ABS(REAL(EXPR1,KIND=16)).EQ.0.0E0_16)THEN
661
EXPR1=CMPLX(0.0E0_16,IMAGPART(EXPR1))
663
IF(ABS(IMAGPART(EXPR2)).EQ.0.0E0_16)THEN
664
EXPR2=CMPLX(REAL(EXPR2,KIND=16),0.0E0_16)
666
IF(ABS(REAL(EXPR2,KIND=16)).EQ.0.0E0_16)THEN
667
EXPR2=CMPLX(0.0E0_16,IMAGPART(EXPR2))
669
IF(EXPR1.EQ.(0.0E0_16,0.0E0_16))THEN
670
MP_GRREGLOG=(0.0E0_16,0.0E0_16)
672
IMAGEXPR=IMAGPART(EXPR1)*IMAGPART(EXPR2)
673
FIRSTSHEET=IMAGEXPR.GE.0.0E0_16
674
FIRSTSHEET=FIRSTSHEET.OR.REAL(EXPR1,KIND=16).GE.0.0E0_16
675
FIRSTSHEET=FIRSTSHEET.OR.REAL(EXPR2,KIND=16).GE.0.0E0_16
677
MP_GRREGLOG=LOG(EXPR1)
679
IF(IMAGPART(EXPR1).GT.0.0E0_16)THEN
680
MP_GRREGLOG=LOG(EXPR1) - LOGSW*TWOPII
682
MP_GRREGLOG=LOG(EXPR1) + LOGSW*TWOPII
688
MODULE MP_B0F_CACHING
691
COMPLEX*32 P2,M12,M22
693
TYPE(MP_B0F_NODE),POINTER::PARENT
694
TYPE(MP_B0F_NODE),POINTER::LEFT
695
TYPE(MP_B0F_NODE),POINTER::RIGHT
700
SUBROUTINE MP_B0F_SEARCH(ITEM, HEAD, FIND)
702
TYPE(MP_B0F_NODE),POINTER,INTENT(INOUT)::HEAD,ITEM
703
LOGICAL,INTENT(OUT)::FIND
704
TYPE(MP_B0F_NODE),POINTER::ITEM1
707
NULLIFY(ITEM%%PARENT)
710
IF(.NOT.ASSOCIATED(HEAD))THEN
716
ICOMP=MP_B0F_NODE_COMPARE(ITEM,ITEM1)
718
IF(.NOT.ASSOCIATED(ITEM1%%LEFT))THEN
720
ITEM%%PARENT => ITEM1
725
ELSEIF(ICOMP.GT.0)THEN
726
IF(.NOT.ASSOCIATED(ITEM1%%RIGHT))THEN
728
ITEM%%PARENT => ITEM1
731
ITEM1 => ITEM1%%RIGHT
735
ITEM%%VALUE=ITEM1%%VALUE
742
INTEGER FUNCTION MP_B0F_NODE_COMPARE(ITEM1,ITEM2) RESULT(RES)
744
TYPE(MP_B0F_NODE),POINTER,INTENT(IN)::ITEM1,ITEM2
745
RES=MP_COMPLEX_COMPARE(ITEM1%%P2,ITEM2%%P2)
747
RES=MP_COMPLEX_COMPARE(ITEM1%%M22,ITEM2%%M22)
749
RES=MP_COMPLEX_COMPARE(ITEM1%%M12,ITEM2%%M12)
753
INTEGER FUNCTION MP_REAL_COMPARE(R1,R2) RESULT(RES)
758
PARAMETER (TINY=-1.0E-14_16)
759
MAXR=MAX(ABS(R1),ABS(R2))
761
IF(MAXR.LE.1.0E-99_16.OR.ABS(DIFF)/MAX(MAXR,1.0E-99_16)
766
IF(DIFF.GT.0.0E0_16)THEN
775
INTEGER FUNCTION MP_COMPLEX_COMPARE(C1,C2) RESULT(RES)
781
RES=MP_REAL_COMPARE(R1,R2)
785
RES=MP_REAL_COMPARE(R1,R2)
789
END MODULE MP_B0F_CACHING
791
COMPLEX*32 FUNCTION MP_B0F(P2,M12,M22)
794
COMPLEX*32 P2,M12,M22
795
COMPLEX*32 ZERO,TWOPII
796
PARAMETER (ZERO=(0.0E0_16,0.0E0_16))
797
PARAMETER (TWOPII=2.0E0_16
798
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
802
PARAMETER (TINY=-1.0E-14_16)
804
COMPLEX*32 MP_LOG_TRAJECTORY
806
PARAMETER (USE_CACHING=.TRUE.)
807
TYPE(MP_B0F_NODE),POINTER::ITEM
808
TYPE(MP_B0F_NODE),POINTER,SAVE::B0F_BT
816
IF(M.LT.TINY.OR.M2.LT.TINY)THEN
817
WRITE(*,*)'ERROR:MP_B0F is not well defined when M^2'
823
IF(M.EQ.0.0E0_16)THEN
828
IF(M2.EQ.0.0E0_16)THEN
831
GA2=-IMAGPART(M22)/M2
833
IF(P2.NE.M22.AND.P2.NE.ZERO.AND.M22.NE.ZERO)THEN
834
MP_B0F=(M22-P2)/P2*LOG((M22-P2)/M22)
835
IF(M.GT.M2.AND.GA*M2.GT.GA2*M)THEN
840
WRITE(*,*)'ERROR:MP_B0F is not supported for a simple'
855
CALL MP_B0F_SEARCH(ITEM, B0F_BT, FIND)
861
LOGTERMS=MP_LOG_TRAJECTORY(100,P2,M12,M22)
862
MP_B0F=-LOG(P2/M22)+LOGTERMS
867
LOGTERMS=MP_LOG_TRAJECTORY(100,P2,M12,M22)
868
MP_B0F=-LOG(P2/M22)+LOGTERMS
873
COMPLEX*32 FUNCTION MP_SQRT_TRAJECTORY(N_SEG,P2,M12,M22)
876
COMPLEX*32 P2,M12,M22
878
PARAMETER (ZERO=(0.0E0_16,0.0E0_16),ONE=(1.0E0_16,0.0E0_16))
879
COMPLEX*32 GAMMA0,GAMMA1
880
REAL*16 M,GA,DGA,GA_START
881
REAL*16 GAI,INTERSECTION
882
COMPLEX*32 ARGIM1,ARGI,P2I
883
COMPLEX*32 GAMMA0I,GAMMA1I
885
PARAMETER (TINY=-1.0E-24_16)
888
IF(ABS(P2*M12*M22).EQ.0.0E0_16)THEN
889
WRITE(*,*)'ERROR:mp_sqrt_trajectory works when p2*m12*m22'
895
IF(M.EQ.0.0E0_16)THEN
900
GAMMA0=ONE+M12/P2-M22/P2
901
GAMMA1=M12/P2-CMPLX(0.0E0_16,1.0E0_16)*ABS(TINY)/P2
902
IF(ABS(GA).EQ.0.0E0_16)THEN
903
MP_SQRT_TRAJECTORY=SQRT(GAMMA0**2-4.0E0_16*GAMMA1)
906
GA_START=-ABS(TINY*GA)
907
DGA=(GA-GA_START)/N_SEG
910
P2I=CMPLX(M**2,-GAI*M)
911
GAMMA0I=ONE+M12/P2I-M22/P2I
912
GAMMA1I=M12/P2I-CMPLX(0.0E0_16,1.0E0_16)*ABS(TINY)/P2I
913
ARGIM1=GAMMA0I**2-4.0E0_16*GAMMA1I
916
P2I=CMPLX(M**2,-GAI*M)
917
GAMMA0I=ONE+M12/P2I-M22/P2I
918
GAMMA1I=M12/P2I-CMPLX(0.0E0_16,1.0E0_16)*ABS(TINY)/P2I
919
ARGI=GAMMA0I**2-4.0E0_16*GAMMA1I
920
IF(IMAGPART(ARGI)*IMAGPART(ARGIM1).LT.0.0E0_16)THEN
921
INTERSECTION=IMAGPART(ARGIM1)*(REAL(ARGI,KIND=16)
922
$ -REAL(ARGIM1,KIND=16))
923
INTERSECTION=INTERSECTION/(IMAGPART(ARGI)
925
INTERSECTION=INTERSECTION-REAL(ARGIM1,KIND=16)
926
IF(INTERSECTION.GT.0.0E0_16)THEN
932
MP_SQRT_TRAJECTORY=SQRT(GAMMA0**2-4.0E0_16*GAMMA1)*PREFACTOR
936
COMPLEX*32 FUNCTION MP_LOG_TRAJECTORY(N_SEG,P2,M12,M22)
939
COMPLEX*32 P2,M12,M22
940
COMPLEX*32 ZERO,ONE,HALF,TWOPII
941
PARAMETER (ZERO=(0.0E0_16,0.0E0_16),ONE=(1.0E0_16,0.0E0_16))
942
PARAMETER (HALF=(0.5E0_16,0.0E0_16))
943
PARAMETER (TWOPII=2.0E0_16
944
$ *3.14169258478796109557151794433593750E0_16*(0.0E0_16
946
COMPLEX*32 GAMMA0,GAMMAP,GAMMAM,SQRTTERM
947
REAL*16 M,GA,DGA,GA_START
948
REAL*16 GAI,INTERSECTION
949
COMPLEX*32 ARGIM1(4),ARGI(4),P2I,SQRTTERMI
950
COMPLEX*32 GAMMA0I,GAMMAPI,GAMMAMI
952
PARAMETER (TINY=-1.0E-14_16)
954
COMPLEX*32 ADDFACTOR(4)
955
COMPLEX*32 MP_SQRT_TRAJECTORY
956
IF(ABS(P2*M12*M22).EQ.0.0E0_16)THEN
957
WRITE(*,*)'ERROR:mp_log_trajectory works when p2*m12*m22'
963
IF(M.EQ.0.0E0_16)THEN
968
SQRTTERM=MP_SQRT_TRAJECTORY(N_SEG,P2,M12,M22)
969
GAMMA0=ONE+M12/P2-M22/P2
970
GAMMAP=HALF*(GAMMA0+SQRTTERM)
971
GAMMAM=HALF*(GAMMA0-SQRTTERM)
972
IF(ABS(GA).EQ.0.0E0_16)THEN
973
MP_LOG_TRAJECTORY=-LOG(GAMMAP-ONE)-LOG(GAMMAM-ONE)+GAMMAP
974
$ *LOG((GAMMAP-ONE)/GAMMAP)+GAMMAM*LOG((GAMMAM-ONE)/GAMMAM)
977
GA_START=-ABS(TINY*GA)
978
DGA=(GA-GA_START)/N_SEG
981
P2I=CMPLX(M**2,-GAI*M)
982
SQRTTERMI=MP_SQRT_TRAJECTORY(N_SEG,P2I,M12,M22)
983
GAMMA0I=ONE+M12/P2I-M22/P2I
984
GAMMAPI=HALF*(GAMMA0I+SQRTTERMI)
985
GAMMAMI=HALF*(GAMMA0I-SQRTTERMI)
986
ARGIM1(1)=GAMMAPI-ONE
987
ARGIM1(2)=GAMMAMI-ONE
988
ARGIM1(3)=(GAMMAPI-ONE)/GAMMAPI
989
ARGIM1(4)=(GAMMAMI-ONE)/GAMMAMI
992
P2I=CMPLX(M**2,-GAI*M)
993
SQRTTERMI=MP_SQRT_TRAJECTORY(N_SEG,P2I,M12,M22)
994
GAMMA0I=ONE+M12/P2I-M22/P2I
995
GAMMAPI=HALF*(GAMMA0I+SQRTTERMI)
996
GAMMAMI=HALF*(GAMMA0I-SQRTTERMI)
999
ARGI(3)=(GAMMAPI-ONE)/GAMMAPI
1000
ARGI(4)=(GAMMAMI-ONE)/GAMMAMI
1002
IF(IMAGPART(ARGI(J))*IMAGPART(ARGIM1(J)).LT.0.0E0_16)THEN
1003
INTERSECTION=IMAGPART(ARGIM1(J))*(REAL(ARGI(J),KIND=16)
1004
$ -REAL(ARGIM1(J),KIND=16))
1005
INTERSECTION=INTERSECTION/(IMAGPART(ARGI(J))
1006
$ -IMAGPART(ARGIM1(J)))
1007
INTERSECTION=INTERSECTION-REAL(ARGIM1(J),KIND=16)
1008
IF(INTERSECTION.GT.0.0E0_16)THEN
1009
IF(IMAGPART(ARGIM1(J)).LT.0.0E0_16)THEN
1010
ADDFACTOR(J)=ADDFACTOR(J)-TWOPII
1012
ADDFACTOR(J)=ADDFACTOR(J)+TWOPII
1019
MP_LOG_TRAJECTORY=-(LOG(GAMMAP-ONE)+ADDFACTOR(1))
1020
$ -(LOG(GAMMAM-ONE)+ADDFACTOR(2))
1021
MP_LOG_TRAJECTORY=MP_LOG_TRAJECTORY+GAMMAP*(LOG((GAMMAP-ONE)
1022
$ /GAMMAP)+ADDFACTOR(3))
1023
MP_LOG_TRAJECTORY=MP_LOG_TRAJECTORY+GAMMAM*(LOG((GAMMAM-ONE)
1024
$ /GAMMAM)+ADDFACTOR(4))
1028
COMPLEX*32 FUNCTION MP_ARG(COMNUM)
1032
IMM = (0.0E0_16,1.0E0_16)
1033
IF(COMNUM.EQ.(0.0E0_16,0.0E0_16)) THEN
1034
MP_ARG=(0.0E0_16,0.0E0_16)
1036
MP_ARG=LOG(COMNUM/ABS(COMNUM))/IMM