Beispiel #1
0
TSIL_COMPLEX TSIL_Tx0y (TSIL_REAL X, TSIL_REAL Y, TSIL_COMPLEX S,
                        TSIL_REAL QQ)
{
    TSIL_COMPLEX sqDeltaSXY, tp, tm, log1mtp, log1mtm;
    TSIL_REAL    lnbarX, lnbarY;

    if (X < TSIL_TOL) {
        TSIL_Warn("TSIL_Tx0y", "T(x,0,y) is undefined for x = 0.");
        return TSIL_Infinity;
    }

    if (TSIL_CABS(S) < TSIL_TOL) return -TSIL_I2p(X, 0.0L, Y, QQ);
    if (Y < TSIL_TOL) return TSIL_Tx00(X, S, QQ);

    S = TSIL_AddIeps(S);
    sqDeltaSXY = TSIL_CSQRT(X*X + Y*Y + S*S - 2.0L*X*Y - 2.0L*X*S - 2.0L*Y*S);
    lnbarX = TSIL_LOG(X/QQ);
    lnbarY = TSIL_LOG(Y/QQ);
    tp = (Y - X + S + sqDeltaSXY)/(2.0L * Y);
    tm = (Y - X + S - sqDeltaSXY)/(2.0L * Y);
    log1mtp = TSIL_CLOG(1.0L - tp);
    log1mtm = TSIL_CLOG(1.0L - tm);

    return (-TSIL_Dilog (tp) - TSIL_Dilog (tm) + (1.0L - Y/S)*log1mtp*log1mtm
            + sqDeltaSXY * (log1mtp - log1mtm) / (2.0L * S)
            + lnbarX*lnbarY - 0.5L*(lnbarY + 1.0L)*(lnbarY + 1.0L)
            + (3.0L*S + Y - X) *(lnbarY-lnbarX)/(2.0L * S));
}
Beispiel #2
0
TSIL_COMPLEX TSIL_TrilogCLZseries(TSIL_COMPLEX z)
{
  TSIL_COMPLEX logz, logzsquared, logztothek, term;
  TSIL_COMPLEX first6terms, remainingterms, result;
  TSIL_REAL accuracygoal;
  int j;

  logz = TSIL_CLOG(z);
  logzsquared = logz*logz;
  logztothek = logzsquared*logzsquared*logzsquared;

  first6terms = logztothek/86400.0L;
  first6terms += -logzsquared*logzsquared/288.0L;
  first6terms += -logzsquared*logz/12.0L;
  first6terms += (0.75L - 0.5L*TSIL_CLOG(-logz))*logzsquared;
  first6terms += cZeta3 + cZeta2*logz; 
  
  accuracygoal = TSIL_TOL* TSIL_CABS (first6terms);
  remainingterms = 0.0L;

  for (j=0; j< 25; j++)
    {
      logztothek = logztothek*logzsquared;
      term = CLZcoeffs_trilog[j]*logztothek;
      remainingterms += term;
      if (TSIL_CABS (term) < accuracygoal) 
	break;
      if (j == 24)
        TSIL_Warn("TSIL_TrilogCLZseries", "trilog CLZ series converging too slowly.");
    }

  result = remainingterms + first6terms;

  return result;
}
Beispiel #3
0
TSIL_COMPLEX TSIL_TrilogregionA (TSIL_COMPLEX z)
{
  TSIL_COMPLEX result;
  TSIL_COMPLEX log1minusz = TSIL_CLOG (1.0L - z);
  TSIL_COMPLEX logminusz = TSIL_CLOG (-z);

  result = -TSIL_Trilogunitdisk(1.0L/(1.0L - z)) - TSIL_Trilogunitdisk (z/(z - 1.0L)) 
           + log1minusz*(log1minusz*log1minusz/3.0L -
	     0.5L*logminusz*log1minusz - cZeta2) + cZeta3;

  return result;
}
Beispiel #4
0
TSIL_COMPLEX TSIL_Trilogoutofunitdisk (TSIL_COMPLEX z)
{
  TSIL_COMPLEX result;
  TSIL_COMPLEX logminusz = TSIL_CLOG(-z);

  if (TSIL_CREAL(z) > 1.0L && TSIL_CIMAG((complex double) z) == 0.0)
    logminusz = I * PI_longdouble + TSIL_CLOG(TSIL_CREAL (z));

  result = TSIL_Trilogunitdisk (1.0L/z) -
    logminusz*(cZeta2 + logminusz*logminusz/6.0L);

  return result;
}
Beispiel #5
0
TSIL_COMPLEX TSIL_Trilogunitdisk (TSIL_COMPLEX z)
{
  TSIL_COMPLEX result;
  TSIL_REAL rez = TSIL_CREAL (z);
  TSIL_REAL absz = TSIL_CABS (z);
  TSIL_REAL absimz = TSIL_FABS (TSIL_CIMAG (z));

  if (TSIL_CABS(z - 1.0L) < 2.0L * TSIL_TOL)
    result = cZeta3;
  else if (TSIL_CABS(z) < 2.0L * TSIL_TOL)
    result = 0.0L;
  else if (TSIL_CABS(TSIL_CLOG(z)) < trilog_CLZseries_radius)
    result = TSIL_TrilogCLZseries (z);
  else if (absz <= trilog_powerseries_radius)
    result = TSIL_Trilogseries (z);
  else if (rez <= 0.0L)
    result = TSIL_TrilogregionA (z);
  else if (rez <= absimz)
    result = TSIL_TrilogregionB (z);
  else {
    TSIL_Warn("TSIL_Trilogunitdisk", "trilog function yielding undefined result.");
    result = TSIL_Infinity;
  }

  return result;
}
Beispiel #6
0
TSIL_COMPLEX TSIL_Trilogseries (TSIL_COMPLEX z)
{
  TSIL_REAL absz = TSIL_CABS (z);
  TSIL_REAL logepsilon = TSIL_LOG (TSIL_TOL);
  TSIL_REAL mlogabsz;
  TSIL_COMPLEX sum = z;
  TSIL_COMPLEX ztothek;
  TSIL_COMPLEX term;
  TSIL_COMPLEX kcubed;
  int k, kmax;

  mlogabsz = -TSIL_CLOG (absz);

/*
  The following kmax is hopefully designed to give accuracy to within
  e^logepsilon, with some safety margin built in. Not completely
  tested, but it seems good enough for government work anyway.
*/

  kmax = 5 + (int) (( 6.0 -logepsilon -3.0 * log(-logepsilon)
		      + 3.0 * log (mlogabsz)) / mlogabsz);

  for (k = kmax; k > 1; k--)
    {
      ztothek = TSIL_CPOW (z, k);
      kcubed = k*k*k;
      term = ztothek/kcubed;
      sum += term;
    }

  return sum;
}
Beispiel #7
0
TSIL_COMPLEX TSIL_B00 (TSIL_COMPLEX S, TSIL_REAL QQ)
{
  if (TSIL_CABS (S) < TSIL_TOL) {
    TSIL_Warn("TSIL_B00", "B(0,0) is undefined when s=0."); 
    return TSIL_Infinity;
  }

  S = TSIL_AddIeps(S);    
  return (2.0L - TSIL_CLOG(-S/QQ));
}
Beispiel #8
0
TSIL_COMPLEX TSIL_B0x (TSIL_REAL X, TSIL_COMPLEX S, TSIL_REAL QQ)
{
  if (TSIL_FABS (X) < TSIL_TOL)
    return TSIL_B00(S,QQ);

  if (TSIL_CABS (S) < TSIL_TOL)
    return (1.0L - TSIL_LOG (X/QQ));

  if (TSIL_CABS (1.0L - S/X) < 10.0L*TSIL_TOL)
    return 2.0L - TSIL_LOG(X/QQ);

  S = TSIL_AddIeps(S);  
  return 2.0L + ((X - S)*TSIL_CLOG((X - S)/QQ) - X*TSIL_LOG(X/QQ))/S;
}
Beispiel #9
0
TSIL_COMPLEX TSIL_Beps0x (TSIL_REAL x, TSIL_COMPLEX s, TSIL_REAL qq)
{
  TSIL_COMPLEX sqrtx, lnbarx, log1msox, lnbarms;

  if (TSIL_CABS(s) < TSIL_TOL) return TSIL_BepsAtZero (0, x, qq);

  if (x < TSIL_TOL) {
    lnbarms = TSIL_CLOG(-TSIL_AddIeps(s)/qq);
    return 4.0L - Zeta2/2.0L - 2.0L*lnbarms + lnbarms*lnbarms/2.0L;
  }

  sqrtx = TSIL_CSQRT(x);
  lnbarx = TSIL_CLOG(x/qq);

  if (TSIL_CABS(1 - s/x) < 10.0*TSIL_TOL)
    return 4.0L + Zeta2/2.0L + lnbarx*(lnbarx - 4.0L)/2.0L;

  log1msox = TSIL_CLOG(1.0L - TSIL_AddIeps(s)/x);

  return 4.0L + Zeta2/2.0L - 2.0L*lnbarx + lnbarx*lnbarx/2.0L 
         + (1.0L - x/s)*(lnbarx*log1msox - 2.0L*log1msox 
         + log1msox*log1msox/2.0L -TSIL_Dilog(s/(s-x)));
}
Beispiel #10
0
TSIL_COMPLEX TSIL_BepsAtZero (TSIL_REAL x, TSIL_REAL y, TSIL_REAL qq)
{
  TSIL_COMPLEX lnbarx, lnbary;
  TSIL_REAL temp;

  if (x < y) {temp = x; x = y; y = temp;}

  if (x < TSIL_TOL) {
    TSIL_Warn("TSIL_BepsAtZero", "Beps(0,0) is undefined at s = 0.");
    return TSIL_Infinity;
  }

  lnbarx = TSIL_CLOG(x/qq);

  if (y < TSIL_TOL) return 1.0L + Zeta2/2.0L - lnbarx + lnbarx*lnbarx/2.0L;

  if (TSIL_FABS(x-y)/(x+y) < TSIL_TOL) return (Zeta2 + lnbarx*lnbarx)/2.0L;

  lnbary = TSIL_CLOG(y/qq);

  return 1.0L + Zeta2/2.0L + (x*lnbarx*(lnbarx/2.0L - 1.0L) -
			      y*lnbary*(lnbary/2.0L - 1.0L))/(x-y);
}
Beispiel #11
0
TSIL_COMPLEX TSIL_B (TSIL_REAL X, TSIL_REAL Y, TSIL_COMPLEX S, TSIL_REAL QQ)
{
  TSIL_REAL    temp;
  TSIL_COMPLEX sqDeltaSXY, lnbarX, lnbarY;

  if (TSIL_FABS (X) < TSIL_FABS (Y)) {temp = Y; Y = X; X = temp;}

  if (TSIL_FABS (X) < TSIL_TOL)
    return TSIL_B00(S,QQ);

  if (TSIL_FABS (Y) < TSIL_TOL)
    return TSIL_B0x(X,S,QQ);

  if (TSIL_CABS (S) < TSIL_TOL) {
    if (TSIL_FABS (1.0L - Y/X) > 0.0L)
      return (1.0L + (Y*TSIL_LOG(Y/QQ) - X*TSIL_LOG(X/QQ))/(X-Y));
    else 
      return (-TSIL_LOG (X/QQ));
  }

  S = TSIL_AddIeps(S);   
  sqDeltaSXY = TSIL_CSQRT(TSIL_Delta(S, X, Y));
  lnbarX = TSIL_LOG (X/QQ);
  lnbarY = TSIL_LOG (Y/QQ);

  /* Following avoids roundoff error for very negative s. */
  if ((TSIL_CREAL(S) < -10.0L*(X+Y)) && (TSIL_CIMAG(S) < TSIL_TOL)) {   
    return (2.0L - 0.5L * (lnbarX + lnbarY) +
	  (sqDeltaSXY * TSIL_CLOG(0.5L*(X + Y - S + sqDeltaSXY)/Y) +
	   0.5L * (Y - X - sqDeltaSXY) * (lnbarX - lnbarY))/S);
  }

  return (2.0L - 0.5L * (lnbarX + lnbarY) +
	  (-sqDeltaSXY * TSIL_CLOG(0.5L*(X + Y - S - sqDeltaSXY)/X) +
	   0.5L * (Y - X - sqDeltaSXY) * (lnbarX - lnbarY))/S);
}
Beispiel #12
0
TSIL_COMPLEX TSIL_Tx00 (TSIL_REAL X, TSIL_COMPLEX S, TSIL_REAL QQ)
{
    TSIL_REAL lnbarX;

    if (X < TSIL_TOL) {
        TSIL_Warn("TSIL_Tx00", "T(x,0,0) is undefined for x = 0.");
        return TSIL_Infinity;
    }

    if (TSIL_CABS(S) < TSIL_TOL) return -TSIL_I2p(X, 0.0L, 0.0L, QQ);

    lnbarX = TSIL_LOG(X/QQ);

    if (TSIL_CABS (1.0L - S/X) < 10.0L*TSIL_TOL)
        return 2.0L*Zeta2 -0.5L -lnbarX + 0.5L*lnbarX*lnbarX;

    S = TSIL_AddIeps(S);

    return Zeta2 - 0.5L + (1.0L - X/S)*TSIL_CLOG(1.0L -S/X)
           -lnbarX + 0.5L*lnbarX*lnbarX + TSIL_Dilog (S/X);
}
Beispiel #13
0
TSIL_COMPLEX TSIL_Beps (TSIL_REAL X, TSIL_REAL Y, TSIL_COMPLEX S, TSIL_REAL QQ)
{
  TSIL_COMPLEX sqrtdeltasxy, t1, t2, t3, t4, logt1, logt2, logt3, logt4;
  TSIL_COMPLEX log1mt1, log1mt2, sqrtx, sqrty, lnbarx, lnbary;
  TSIL_REAL temp;

  if (X < Y) {temp = X; X = Y; Y = temp;}

  if (TSIL_CABS(S) < TSIL_TOL) return TSIL_BepsAtZero (X, Y, QQ);

  if (Y < TSIL_TOL) return TSIL_Beps0x (X, S, QQ);
  
  sqrtx = TSIL_CSQRT(X);
  sqrty = TSIL_CSQRT(Y);
  lnbarx = TSIL_CLOG(X/QQ);
  lnbary = TSIL_CLOG(Y/QQ);

  if (TSIL_CABS(S - (sqrtx + sqrty)*(sqrtx + sqrty))/(X+Y) < 10.0*TSIL_TOL) 
    return 4.0L + Zeta2/2.0L 
           + (sqrtx*lnbarx*(lnbarx - 4.0L) + 
	      sqrty*lnbary*(lnbary - 4.0L))/(2.0L*(sqrtx + sqrty)); 

  if (TSIL_CABS(S - (sqrtx - sqrty)*(sqrtx - sqrty))/(X+Y) < 10.0*TSIL_TOL) 
    return 4.0L + Zeta2/2.0L 
           + (sqrtx*lnbarx*(lnbarx - 4.0L) - 
	      sqrty*lnbary*(lnbary - 4.0L))/(2.0L*(sqrtx - sqrty)); 

  S = TSIL_AddIeps(S);

  sqrtdeltasxy = TSIL_CSQRT(TSIL_Delta(S,X,Y));

  t1 = ( S - X + Y + sqrtdeltasxy)/(2.0L*sqrtdeltasxy);
  t2 = (-S - X + Y + sqrtdeltasxy)/(2.0L*sqrtdeltasxy);
  t3 = (-S + X + Y + sqrtdeltasxy)/(2.0L*X);
  t4 = (-S + X + Y - sqrtdeltasxy)/(2.0L*X);

/*   printf("\ns = ");TSIL_cprintf(S);printf("\n"); */
/*   printf("x = %Lf\n", X); */
/*   printf("y = %Lf\n", Y); */
/*   printf("sqrtdeltasxy = ");TSIL_cprintf(sqrtdeltasxy);printf("\n"); */

/*   printf("\nt1    = ");TSIL_cprintf(t1);printf("\n"); */
/*   printf("t2    = ");TSIL_cprintf(t2);printf("\n"); */
/*   printf("t3    = ");TSIL_cprintf(t3);printf("\n"); */
/*   printf("t4    = ");TSIL_cprintf(t4);printf("\n"); */
  
  logt1 = TSIL_CLOG(t1);
  logt2 = TSIL_CLOG(t2);
  logt3 = TSIL_CLOG(t3);
  logt4 = TSIL_CLOG(t4);

/*   printf("\nlogt1 = ");TSIL_cprintf(logt1);printf("\n"); */
/*   printf("logt2 = ");TSIL_cprintf(logt2);printf("\n"); */
/*   printf("logt3 = ");TSIL_cprintf(logt3);printf("\n"); */
/*   printf("logt4 = ");TSIL_cprintf(logt4);printf("\n"); */

  log1mt1 = TSIL_CLOG(1.0L - t1);
  log1mt2 = TSIL_CLOG(1.0L - t2);

  return 4.0L + Zeta2/2.0L + (lnbarx*lnbarx + lnbary*lnbary)/4.0L 
         - lnbarx - lnbary + (sqrtdeltasxy*(TSIL_Dilog(t2) - TSIL_Dilog(t1) 
              + (logt3 - logt4)*(1.0L - lnbarx/4.0L - lnbary/4.0L) 
              + (log1mt1 + log1mt2)*(logt2 - logt1)/2.0L) 
         + (X - Y)*(lnbary - lnbarx)*(1.0L - lnbarx/4.0L - lnbary/4.0L))/S;
}
Beispiel #14
0
void TSIL_CaseGeneric (TSIL_DATA *foo)
{
  TSIL_COMPLEX sInit, sFinal, rInit, rFinal, imDisp;
  TSIL_REAL    sthresh;
  TSIL_REAL    s = foo->s;
  TSIL_REAL    qq = foo->qq;
  TSIL_REAL    threshMin = foo->threshMin;
  TSIL_REAL    smallestspecialpoint;
  TSIL_REAL    temp;
  int          i;

  TSIL_Info("GENERIC CASE");

  /* Decide how to initialize; is s=0 a threshold, or close to one? */
  if (threshMin < TSIL_TOL) {
    TSIL_Info("There is a threshold at s=0.");
    sInit = I*SINIT;
    TSIL_InitialValueThreshAt0 (foo, sInit);
  }
  else if (threshMin < THRESH_CUTOFF) {
    TSIL_Info("There is a threshold close to, but not at, s=0.");
    sInit = -SINIT;
    TSIL_InitialValue (foo, sInit);
  }
  else {
    sInit = 0.L + 0.L*I;
    TSIL_InitialValue (foo, 0.0L + 0.0L*I);
  }

  /* Find the point nearest s=0 that could give problems: */
  smallestspecialpoint = (foo->threshold)[0];

  for (i=1; i<(foo->nThresh); i++) {
    if ((foo->threshold)[i] < smallestspecialpoint) 
      smallestspecialpoint = (foo->threshold)[i];
  }

  for (i=0; i<(foo->nPthresh); i++) {
    if ((foo->pseudoThreshold)[i] < smallestspecialpoint) 
      smallestspecialpoint = (foo->pseudoThreshold)[i];
  }

  if (s < (smallestspecialpoint - THRESH_CUTOFF)) {
    /* Integrate along real s axis. */
    sFinal = (TSIL_COMPLEX) 0.5L*s;

    if (threshMin < THRESH_CUTOFF) {
      /* The smallest threshold is either 0 or close to 0, so change
         variables to r = lnbar(-s) for the first part of integration. */
      rInit  = TSIL_CLOG(-sInit/qq);
      temp = -0.5L*s/qq;
      if (temp > TSIL_TOL) rFinal = TSIL_CLOG(temp);
      else if (temp < -TSIL_TOL) rFinal = TSIL_CLOG(-temp) - I*PI;
      else rFinal = TSIL_CLOG(0.001L*TSIL_EPSILON) - I*0.5L*PI;
      TSIL_Integrate (foo, rInit, rFinal, TSIL_MaxSteps(foo,rFinal-rInit), 3, 0.0L);
    }
    else
      TSIL_Integrate (foo, sInit, sFinal, TSIL_MaxSteps(foo,sFinal-sInit), 0, 0.0L);

    sInit  = sFinal;
    sFinal = (TSIL_COMPLEX) s;
    TSIL_Integrate (foo, sInit, sFinal, TSIL_MaxSteps(foo, sFinal-sInit), 1, 0.0L);

    /* Set status value */
    foo->status = REAXIS;
  }
  else {
    /* Integrate in complex s plane.                            */
    /* No reason to go too far off the real axis if s is small. */
    if (s < IM_DISPL/10.0)
      imDisp = 10.0L * s * I;
    else
      imDisp = IM_DISPL * I;

    sFinal = imDisp;

    if (threshMin < THRESH_CUTOFF) {
      TSIL_Info("Using ln(-s/qq) as independent variable for first leg of contour.");
      rInit  = TSIL_CLOG(-sInit/qq);
      rFinal = TSIL_CLOG(-sFinal/qq);
      TSIL_Integrate (foo, rInit, rFinal, TSIL_MaxSteps(foo,rFinal-rInit), 3, 0.0L);
    }
    else TSIL_Integrate (foo, sInit, sFinal, TSIL_MaxSteps(foo,sFinal - sInit), 0, 0.0L);

    sInit  = sFinal;
    sFinal = s + imDisp;
    TSIL_Integrate (foo, sInit, sFinal, TSIL_MaxSteps(foo,sFinal - sInit), 0, 0.0L);

    sInit  = sFinal;
    sFinal = s;
    if (TSIL_NearThreshold (foo, &sthresh, THRESH_CUTOFF) == YES) {
      if (TSIL_FABS(sthresh) < TSIL_TOL) {
        rInit  = TSIL_CLOG(-sInit/qq);
        rFinal = TSIL_CLOG(-sFinal/qq - I*TSIL_EPSILON);
        TSIL_Integrate (foo, rInit, rFinal, TSIL_MaxSteps(foo,rFinal-rInit), 3, 0.0L);
      }
      else {
        TSIL_Info("Using near-threshold stepper for final leg of contour.");
        rInit  = TSIL_CLOG(1.L - sInit/sthresh);
        temp = 1.L - s/sthresh;
        if (temp > TSIL_TOL) rFinal = TSIL_CLOG(temp);
        else if (temp < -TSIL_TOL) rFinal = TSIL_CLOG(-temp) - I*PI;
        else rFinal = TSIL_CLOG(0.001L*TSIL_EPSILON) - I*0.5L*PI;
        TSIL_Integrate (foo, rInit, rFinal, TSIL_MaxSteps(foo,rFinal - rInit), 2, sthresh);
      }
    }
    else 
      TSIL_Integrate (foo, sInit, sFinal, TSIL_MaxSteps(foo,sFinal - sInit), 1, 0.0L);

    /* Set status value */
    foo->status = CONTOUR;
  }

  /* Check whether we had a double pole case in any of the U's and fix
     it, if necessary: */
  if ((foo->x < TSIL_TOL) || (foo->y < TSIL_TOL) ||
      (foo->z < TSIL_TOL) || (foo->u < TSIL_TOL))
    TSIL_CorrectUs (foo);

  /* Finally, convert s*M to M */
  foo->M.value /= s;

  return;
}
Beispiel #15
0
void TSIL_InitialValueThreshAt0 (TSIL_DATA *foo, TSIL_COMPLEX sinit)
{
  TSIL_REAL x, y, z, u, v, qq;
  TSIL_COMPLEX rinit;

  /* For convenience */
  x = foo->x;
  y = foo->y;
  z = foo->z;
  u = foo->u;
  v = foo->v;
  qq = foo->qq;
  rinit = TSIL_CLOG(-sinit/qq);

  if (x + z < TSIL_TOL) {
    if (foo->whichFns == STUM) {
      foo->B[xz].value   = 2.0L - rinit;
      foo->B[xz].deriv   = -1.0L/sinit;    
    }
  }
  else {
    if (foo->whichFns == STUM) {
      foo->B[xz].value   = TSIL_BAtZero (x, z, qq);
      foo->B[xz].deriv   = 0.0L;
      foo->U[zxyv].value = TSIL_UAtZero (z, x, y, v, qq);
      foo->U[zxyv].deriv = 0.0L;
    }
    if (foo->whichFns != ST) {
      foo->U[xzuv].value = TSIL_UAtZero (x, z, u, v, qq);
      foo->U[xzuv].deriv = 0.0L;
    }
  }

  if (foo->whichFns == STUM) {
    if (y + u < TSIL_TOL) {
      foo->B[yu].value   = 2.0L - rinit;
      foo->B[yu].deriv   = -1.0L/sinit;    
    }
    else { 
      foo->B[yu].value   = TSIL_BAtZero (y, u, qq);
      foo->B[yu].deriv   = 0.0L;
      foo->U[yuzv].value = TSIL_UAtZero (y, u, z, v, qq);
      foo->U[yuzv].deriv = 0.0L;
      foo->U[uyxv].value = TSIL_UAtZero (u, y, x, v, qq);
      foo->U[uyxv].deriv = 0.0L;
    }
  }

  /* This is needed in all cases: */
  if (x + u + v < TSIL_TOL) {
    foo->S[uxv].value = sinit*(1.625L - 0.5L*rinit);
    foo->S[uxv].deriv = 1.125L - 0.5L*rinit;
  }
  else {
    foo->S[uxv].value = TSIL_SAtZero (u, x, v, qq);
    foo->S[uxv].deriv = TSIL_SprimeAtZero (u, x, v, qq);
    foo->T[uxv].value = TSIL_TAtZero (u, x, v, qq);
    foo->T[xuv].value = TSIL_TAtZero (x, u, v, qq);
    foo->T[vxu].value = TSIL_TAtZero (v, x, u, qq);
  }

  if (foo->whichFns == STUM) {
    if (y + z + v < TSIL_TOL) {
      foo->S[vyz].value = sinit*(1.625L - 0.5L*rinit);
      foo->S[vyz].deriv = 1.125L - 0.5L*rinit;
    }
    else {
      foo->S[vyz].value = TSIL_SAtZero (v, y, z, qq);
      foo->S[vyz].deriv = TSIL_SprimeAtZero (v, y, z, qq);
      foo->T[vyz].value = TSIL_TAtZero (v, y, z, qq);
      foo->T[yzv].value = TSIL_TAtZero (y, z, v, qq);
      foo->T[zyv].value = TSIL_TAtZero (z, y, v, qq);
    }
  }

  /* Next initialize M. */
  if (foo->whichFns == STUM)
    foo->M.value = 0.0L;

  /* Derivatives of T and M always initialized to zero when s=0 is a
     threshold, because dF/dr = s dF/ds -> 0 for very small s. */
  foo->T[uxv].deriv = 0.0L;
  foo->T[xuv].deriv = 0.0L;
  foo->T[vxu].deriv = 0.0L;
  if (foo->whichFns == STUM) {
    foo->T[vyz].deriv = 0.0L;
    foo->T[yzv].deriv = 0.0L;
    foo->T[zyv].deriv = 0.0L;
    foo->M.deriv = 0.0L;
  }

  /* We can set the T's to zero and disable their running if the first
     arg is zero, since they are TSIL_Infinity in this case.  (Note
     that the T derivatives are all taken care of above.)  Some of
     these are accomplished above so this is a bit redundant,
     but... */
  if (foo->whichFns == STUM) {
    if (v < TSIL_TOL)
      foo->T[vyz].value = foo->T[vxu].value = 0.0 + 0.0*I;

    if (y < TSIL_TOL)
      foo->T[yzv].value = 0.0 + 0.0*I;

    if (z < TSIL_TOL)
      foo->T[zyv].value = 0.0 + 0.0*I;
  }
  /* The rest are always needed: */
  if (u < TSIL_TOL)
    foo->T[uxv].value = 0.0 + 0.0*I;

  if (x < TSIL_TOL)
    foo->T[xuv].value = 0.0 + 0.0*I;

  /* Similarly for the U's if the second arg is zero; here they are
     not infinite, but the running gives garbage and they need
     correction at the end of the calculation anyway: */
  if (foo->whichFns == STUM) {
    if (x < TSIL_TOL) {
      foo->U[zxyv].value = 
	foo->U[zxyv].deriv = 0.0 + 0.0*I;
    }

    if (y < TSIL_TOL) {
      foo->U[uyxv].value = 
	foo->U[uyxv].deriv = 0.0 + 0.0*I;
    }

    if (u < TSIL_TOL) {
      foo->U[yuzv].value = 
	foo->U[yuzv].deriv = 0.0 + 0.0*I;
    }
  }
  if (foo->whichFns != ST) {
    if (z < TSIL_TOL) {
      foo->U[xzuv].value = 
	foo->U[xzuv].deriv = 0.0 + 0.0*I;
    }
  }

  return;
}