TSIL_COMPLEX TSIL_Bp (TSIL_REAL X, TSIL_REAL Y, TSIL_COMPLEX S, TSIL_REAL QQ) { if (X < TSIL_TOL) { TSIL_Warn("Bp", "B(x',y) is undefined for x=0."); return TSIL_Infinity; } if (TSIL_CABS(1.0L - S/(X+Y+2.0L*TSIL_SQRT(X*Y))) < TSIL_TOL) { TSIL_Warn("Bp", "B(x',y) is undefined at s = (sqrt(x) + sqrt(y))^2."); return TSIL_Infinity; } if (TSIL_CABS(S) < TSIL_TOL) { if (TSIL_FABS(1.0L - X/Y) < TSIL_TOL) return (-0.5L/X); else return 1.0L/(Y-X) + Y*TSIL_LOG(X/Y)/((Y-X)*(Y-X)); } if (TSIL_CABS(1.0L - (X + Y - 2.0L*TSIL_SQRT(X*Y))/S) < TSIL_TOL) return (1.0L - TSIL_SQRT(Y/X) +0.5L*TSIL_LOG(Y/X))/(X + Y - 2.0L*TSIL_SQRT(X*Y)); else return ((X-Y-S)*TSIL_B(X,Y,S,QQ) + (X+Y-S)*TSIL_LOG(X/QQ) -2.0L*TSIL_A(Y,QQ) + 2.0L*(S-X))/TSIL_Delta(S,X,Y); }
int main (int argc, char *argv[]) { TSIL_DATA result; /* Top-level TSIL data object */ TSIL_REAL qq; /* Ensures correct basic type; see also TSIL_COMPLEX */ TSIL_REAL x, g, lambda; TSIL_COMPLEX pi1, pi1prime, pi2, s1, s2; TSIL_REAL factor = 1.0L/(16.0L*PI*PI); /* If incorrect number of args, print message on stderr and exit: */ if (argc != 5) TSIL_Error("main", "Expected 4 arguments: m^2, g, lambda, and Q^2", 1); /* Note cast to appropriate floating-point type for safety */ x = (TSIL_REAL) strtold(argv[1], (char **) NULL); g = (TSIL_REAL) strtold(argv[2], (char **) NULL); lambda = (TSIL_REAL) strtold(argv[3], (char **) NULL); qq = (TSIL_REAL) strtold(argv[4], (char **) NULL); /* All loop integrals have a common squared-mass argument x: */ TSIL_SetParameters (&result, x, x, x, x, x, qq); /* For the pole mass calculation, evaluate two-loop integrals at s = x: */ TSIL_Evaluate (&result, x); /* Assemble one- and two-loop mass squared results: */ pi1 = 0.5L*lambda*TSIL_A(x,qq) - 0.5L*g*g*TSIL_B(x,x,x,qq); pi1prime = -0.5L*g*g*TSIL_dBds(x, x, x, qq); pi2 = - 0.5L*g*g*g*g*TSIL_GetFunction(&result, "M") - 0.5L*g*g*g*g*TSIL_GetFunction(&result, "Vzxyv") + g*g*g*TSIL_GetFunction(&result, "Uzxyv") - (1.0L/6.0L)*lambda*lambda*TSIL_GetFunction(&result, "Svyz") + 0.25L*lambda*g*g*TSIL_POW(TSIL_GetFunction(&result, "Bxz"), 2) + 0.25L*lambda*lambda*TSIL_A(x,qq)*(TSIL_A(x,qq)/x + 1.0L) - 0.5L*lambda*g*g*TSIL_A(x,qq)*TSIL_Bp(x, x, x, qq) - 0.25L*lambda*g*g*TSIL_I2p(x,x,x,qq); s1 = x + factor*pi1; s2 = x + factor*pi1 + factor*factor*(pi2 + pi1*pi1prime); printf("Tree-level squared mass: %lf\n", (double) x); printf("One-loop pole squared mass: %lf\n", (double) s1); printf("Two-loop pole squared mass: %lf\n", (double) s2); return 0; }
TSIL_COMPLEX TSIL_dBds (TSIL_REAL x, TSIL_REAL y, TSIL_COMPLEX s, TSIL_REAL qq) { TSIL_REAL thxy, psxy, sqrtx, sqrty, alphax, alphay, temp; TSIL_COMPLEX Btemp, result; if (x < y) {temp = y; y = x; x = temp;} if (x + TSIL_CABS(s) < TSIL_TOL) { TSIL_Warn("TSIL_dBds", "dBds(0,0) is undefined when s=0."); return TSIL_Infinity; } if (TSIL_CABS(s/x) < TSIL_TOL) return TSIL_BprimeAtZero (x, y, qq); thxy = TSIL_Th2 (x, y); psxy = TSIL_Ps2 (x, y); sqrtx = TSIL_SQRT(x); sqrty = TSIL_SQRT(y); alphax = TSIL_Alpha(x,qq); alphay = TSIL_Alpha(y,qq); if (TSIL_CABS(1.0L - s/thxy) < TSIL_TOL) { TSIL_Warn("TSIL_dBds", "dBds(x,y) is undefined at threshold."); return TSIL_Infinity; } if (TSIL_CABS(1.0L - s/psxy) < TSIL_TOL) { return (0.5L * alphax * (1.0L + sqrty/sqrtx) - 0.5L * alphay * (1.0L + sqrtx/sqrty) + 2.0L * (sqrty - sqrtx) )/TSIL_POW(sqrtx - sqrty,3); } Btemp = TSIL_B (x, y, s, qq); result = (0.5L/s) * ( (thxy * Btemp - s + (sqrtx + sqrty)*(alphax + alphay))/(s - thxy) + (psxy * Btemp - s + (sqrtx - sqrty)*(alphax - alphay))/(s - psxy)); return result; }