in src/cpp/modules/tapenade/ba/ba_b.c [113:191]
void rodrigues_rotate_point_b(const double *rot, double *rotb, const double *
pt, double *ptb, double *rotatedPt, double *rotatedPtb) {
int i;
double sqtheta;
double sqthetab;
int ii1;
sqtheta = sqsum_nodiff(3, rot);
if (sqtheta != 0) {
double theta, costheta, sintheta, theta_inverse;
double w[3], w_cross_pt[3], tmp;
double tempb;
theta = sqrt(sqtheta);
costheta = cos(theta);
sintheta = sin(theta);
theta_inverse = 1.0/theta;
double thetab, costhetab, sinthetab, theta_inverseb;
double wb[3], w_cross_ptb[3], tmpb;
for (i = 0; i < 3; ++i)
w[i] = rot[i]*theta_inverse;
cross_nodiff(w, pt, w_cross_pt);
tmp = (w[0]*pt[0]+w[1]*pt[1]+w[2]*pt[2])*(1.-costheta);
for (i = 0; i < 3; i++) /* TFIX */
ptb[i] = 0.0;
for (ii1 = 0; ii1 < 3; ++ii1)
w_cross_ptb[ii1] = 0.0;
for (ii1 = 0; ii1 < 3; ++ii1)
wb[ii1] = 0.0;
costhetab = 0.0;
tmpb = 0.0;
sinthetab = 0.0;
for (i = 2; i > -1; --i) {
ptb[i] = ptb[i] + costheta*rotatedPtb[i];
costhetab = costhetab + pt[i]*rotatedPtb[i];
w_cross_ptb[i] = w_cross_ptb[i] + sintheta*rotatedPtb[i];
sinthetab = sinthetab + w_cross_pt[i]*rotatedPtb[i];
wb[i] = wb[i] + tmp*rotatedPtb[i];
tmpb = tmpb + w[i]*rotatedPtb[i];
rotatedPtb[i] = 0.0;
}
tempb = (1.-costheta)*tmpb;
wb[0] = wb[0] + pt[0]*tempb;
ptb[0] = ptb[0] + w[0]*tempb;
wb[1] = wb[1] + pt[1]*tempb;
ptb[1] = ptb[1] + w[1]*tempb;
wb[2] = wb[2] + pt[2]*tempb;
ptb[2] = ptb[2] + w[2]*tempb;
costhetab = costhetab - (w[0]*pt[0]+w[1]*pt[1]+w[2]*pt[2])*tmpb;
cross_b(w, wb, pt, ptb, w_cross_pt, w_cross_ptb);
theta_inverseb = 0.0;
for (i = 2; i > -1; --i) {
rotb[i] = rotb[i] + theta_inverse*wb[i];
theta_inverseb = theta_inverseb + rot[i]*wb[i];
wb[i] = 0.0;
}
thetab = cos(theta)*sinthetab - sin(theta)*costhetab - theta_inverseb/
(theta*theta);
if (sqtheta == 0.0)
sqthetab = 0.0;
else
sqthetab = thetab/(2.0*sqrt(sqtheta));
} else {
{
double rot_cross_pt[3];
double rot_cross_ptb[3];
for (i = 0; i < 3; i++) /* TFIX */
ptb[i] = 0.0;
for (ii1 = 0; ii1 < 3; ++ii1)
rot_cross_ptb[ii1] = 0.0;
for (i = 2; i > -1; --i) {
ptb[i] = ptb[i] + rotatedPtb[i];
rot_cross_ptb[i] = rot_cross_ptb[i] + rotatedPtb[i];
rotatedPtb[i] = 0.0;
}
cross_b(rot, rotb, pt, ptb, rot_cross_pt, rot_cross_ptb);
}
sqthetab = 0.0;
}
sqsum_b(3, rot, rotb, sqthetab);
}