18 matrix_double_t tmp31m, tmp41Am, tmp41Bm, tmp41Cm, tmp91m, Xm, Am, Qrm, Wrm, Arm, dQrm, ddQrm;
25 double a = exp(-h * p);
34 matrix_set(&Am, 0, 0, (a*(hsq*psq + 2.0*hp + 2.0))/2.0);
38 matrix_set(&Am, 1, 1, a*(- hsq*psq + hp + 1.0));
40 matrix_set(&Am, 2, 0, (hp*psq*a*(hp - 2.0))/2.0);
42 matrix_set(&Am, 2, 2, (a*(hsq*psq - 4.0*h*p + 2.0))/2.0);
43 Bm[0] = 1.0 - (hsq*psq*a)/2.0 - hp*a - a;
44 Bm[1] = (hsq*pcb*a)/2.0;
45 Bm[2] = -(hp*psq*a*(hp - 2.0))/2.0;
47 for (i = 0; i < 4; i++){
51 for (j = 0; j < 3; j++ ) mem->
pData[i*3 + j] = tmp[j] + Bm[j] * commands->
pData[i];
61 cont_SU2_triple_derivatives(&tmp91m, 0, 0, 0, &Qrm);
64 cont_SU2_triple_derivatives(&tmp91m, 1, 0, 0, &dQrm);
65 cont_SU2_triple_derivatives(&tmp91m, 0, 1, 0, &tmp41Am);
67 cont_SU2_triple_derivatives(&tmp91m, 0, 0, 1, &tmp41Am);
71 cont_SU2_triple_derivatives(&tmp91m, 2, 0, 0, &ddQrm);
72 cont_SU2_triple_derivatives(&tmp91m, 0, 2, 0, &tmp41Am);
74 cont_SU2_triple_derivatives(&tmp91m, 0, 0, 2, &tmp41Am);
76 cont_SU2_triple_derivatives(&tmp91m, 1, 1, 0, &tmp41Am);
79 cont_SU2_triple_derivatives(&tmp91m, 1, 0, 1, &tmp41Am);
82 cont_SU2_triple_derivatives(&tmp91m, 0, 1, 1, &tmp41Am);
89 for (i = 0; i < 3; i++ ) Wrm.
pData[i] = 2.0*tmp41Bm.
pData[i+1];
94 for (i = 0; i < 4; i++ ) tmp41Am.
pData[i] = 2.0*ddQrm.
pData[i] - tmp41Bm.
pData[i];
114 int cont_SU2_triple_derivatives(
121 double ca, cb, cc, sa, sb, sc;
128 TRACE(5, (
"Bad input dimensions\n"));
133 cont_get_cossin(&tmp31m, derivA, &ca, &sa);
135 cont_get_cossin(&tmp31m, derivB, &cb, &sb);
137 cont_get_cossin(&tmp31m, derivC, &cc, &sc);
139 out->
pData[0] = ca*cb*cc - sa*sb*sc;
140 out->
pData[1] = cb*cc*sa + ca*sb*sc;
141 out->
pData[2] = ca*cc*sb - cb*sa*sc;
142 out->
pData[3] = ca*cb*sc + cc*sa*sb;
148 int cont_get_cossin(
matrix_double_t * input,
int deriv,
double * ca,
double * sa) {
149 double a = input->
pData[0] / 2.0;
150 double da = input->
pData[1] / 2.0;
151 double dda = input->
pData[2] / 2.0;
158 }
else if (deriv == 1){
161 }
else if (deriv == 2){
162 *ca = -cos(a)*da*da - sin(a)*dda;
163 *sa = -sin(a)*da*da + cos(a)*dda ;
165 TRACE(5, (
"Bad input derivative order - must be {0,1,2}\n"));