_TEN_PARM_ALLOC _TEN_PARM_RAND _TEN_PARM_STEP _TEN_PARM_DIST _TEN_PARM_COPY static int parmConvert(double *parmDst, const double *parmSrc, const tenModel *modelSrc) { int ret; if (modelSrc == tenModelBall) { TEN_T_SET(parmDst, parmSrc[0], parmSrc[1], 0, 0, parmSrc[1], 0, parmSrc[1]); ret = 0; } else if (modelSrc == tenModel1Stick) { double ten[7]; TEN_T3V_OUTER(ten, parmSrc + 2); TEN_T_SCALE(parmDst, parmSrc[1], ten); parmDst[0] = parmSrc[0]; ret = 0; } else if (modelSrc == tenModelBall1Stick) { double stick[7], ball[7], diff, frac; diff = parmSrc[1]; frac = parmSrc[2]; TEN_T3V_OUTER(stick, parmSrc + 3); TEN_T_SCALE(stick, diff, stick); TEN_T_SET(ball, 1, diff, 0, 0, diff, 0, diff); TEN_T_LERP(parmDst, frac, ball, stick); parmDst[0] = parmSrc[0]; ret = 1; } else if (modelSrc == tenModel1Cylinder) { double stick[7], ball[7], len, rad; len = parmSrc[1]; rad = parmSrc[2]; TEN_T3V_OUTER(stick, parmSrc + 3); TEN_T_SCALE(stick, len-rad, stick); TEN_T_SET(ball, 1, rad, 0, 0, rad, 0, rad); TEN_T_ADD(parmDst, ball, stick); parmDst[0] = parmSrc[0]; ret = 0; } else if (modelSrc == tenModel1Tensor2) { parmCopy(parmDst, parmSrc); ret = 0; } else { unsigned int ii; for (ii=0; ii<PARM_NUM; ii++) { parmDst[ii] = AIR_NAN; } ret = 2; } return ret; }
/* ** watch out for false advertising! */ void _coilKind7TensorFilterSelf(coil_t *delta, coil_t **iv3, double spacing[3], double parm[COIL_PARMS_NUM]) { coil_t hess[7], rspX, rspY, rspZ, parm0; float eval[3], evec[9], tens[7], lin; rspX = AIR_CAST(coil_t, 1.0/spacing[0]); rspY = AIR_CAST(coil_t, 1.0/spacing[1]); rspZ = AIR_CAST(coil_t, 1.0/spacing[2]); TENS(tens, iv3); tenEigensolve_f(eval, evec, tens); lin = (eval[0] - eval[1])/(eval[0] - eval[2] + 0.000001f); TEN_T3V_OUTER(tens, evec + 3*0); delta[0] = 0; parm0 = AIR_CAST(coil_t, parm[0]); HESS(hess, iv3, 1, rspX, rspY, rspZ); delta[1] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); HESS(hess, iv3, 2, rspX, rspY, rspZ); delta[2] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); HESS(hess, iv3, 3, rspX, rspY, rspZ); delta[3] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); HESS(hess, iv3, 4, rspX, rspY, rspZ); delta[4] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); HESS(hess, iv3, 5, rspX, rspY, rspZ); delta[5] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); HESS(hess, iv3, 6, rspX, rspY, rspZ); delta[6] = lin*parm0*tens[0]*TEN_T_DOT(hess, tens); }