void _gen_basepowtable(int bytes, double base) { int i; base--; printf("#if ATOMBYTES == %d\n", bytes); printf("struct sbn_basepow basepowtable[%d] = {\n", SBN_MAXBASE+1); for (i = 0; i <= SBN_MAXBASE; i++) { unsigned long bexp; unsigned long bpow; if (i < 2) { printf("\t{0,0}, /* unused */\n"); continue; } bexp = (unsigned long) floor(logbn(i, base)); bpow = lexp(i, bexp); printf("\t{%luU, %luU}, /* floor(log of %d in base %.0f) */\n", bpow, bexp, i, base); } printf("};\n#endif\n\n"); }
/* ** This does (non-optionally) use biff, to report convergence failures ** ** we do in fact require non-NULL tip, because it holds the buffers we need */ int _tenQGLInterpNEval(double evalOut[3], const double *evalIn, /* size 3 -by- NN */ const double *wght, /* size NN */ unsigned int NN, int ptype, tenInterpParm *tip) { static const char me[]="_tenQGLInterpNEval"; double RTh_Out[3], elen; unsigned int ii, iter; int rttype; void (*llog)(double lg[3], const double RTh_A[3], const double RTh_B[3]); void (*lexp)(double RTh_B[3], const double RTh_A[3], const double lg[3]); if (!(evalOut && evalIn && tip)) { biffAddf(TEN, "%s: got NULL pointer", me); return 1; } /* convert to (R,Th,_) and initialize RTh_Out */ if (tenInterpTypeQuatGeoLoxK == ptype) { rttype = tenTripleTypeRThetaZ; llog = _tenQGL_Klog; lexp = _tenQGL_Kexp; } else { rttype = tenTripleTypeRThetaPhi; llog = _tenQGL_Rlog; lexp = _tenQGL_Rexp; } ELL_3V_SET(RTh_Out, 0, 0, 0); for (ii=0; ii<NN; ii++) { double ww; tenTripleConvertSingle_d(tip->rtIn + 3*ii, rttype, evalIn + 3*ii, tenTripleTypeEigenvalue); ww = wght ? wght[ii] : 1.0/NN; ELL_3V_SCALE_INCR(RTh_Out, ww, tip->rtIn + 3*ii); } /* compute iterated weighted mean, stored in RTh_Out */ iter = 0; do { double logavg[3]; /* take log of everyone */ for (ii=0; ii<NN; ii++) { llog(tip->rtLog + 3*ii, RTh_Out, tip->rtIn + 3*ii); } /* average, and find length */ ELL_3V_SET(logavg, 0, 0, 0); for (ii=0; ii<NN; ii++) { double ww; ww = wght ? wght[ii] : 1.0/NN; ELL_3V_SCALE_INCR(logavg, ww, tip->rtLog + 3*ii); } elen = ELL_3V_LEN(logavg); lexp(RTh_Out, RTh_Out, logavg); iter++; } while ((!tip->maxIter || iter < tip->maxIter) && elen > tip->convEps); if (elen > tip->convEps) { ELL_3V_SET(evalOut, AIR_NAN, AIR_NAN, AIR_NAN); biffAddf(TEN, "%s: still have error %g (> eps %g) after max %d iters", me, elen, tip->convEps, tip->maxIter); return 1; } /* finish, convert to eval */ tenTripleConvertSingle_d(evalOut, tenTripleTypeEigenvalue, RTh_Out, rttype); return 0; }