1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23  from Numeric import dot 
 24  from math import cos, sin 
 25   
 26   
 27   
 28   
 29   
 30   
 31   
 32   
 33   
 34   
 35   
 37      """Function for calculating the direction cosine dz. 
 38   
 39      dz is the dot product between the unit bond vector and the unit vector along Dpar and is given 
 40      by 
 41   
 42          dz = XH . Dpar. 
 43   
 44      The unit Dpar vector is 
 45   
 46                   | sin(theta) * cos(phi) | 
 47          Dpar  =  | sin(theta) * sin(phi) | 
 48                   |      cos(theta)       | 
 49      """ 
 50   
 51       
 52      diff_data.sin_theta = sin(diff_data.params[2]) 
 53      diff_data.cos_theta = cos(diff_data.params[2]) 
 54      diff_data.sin_phi = sin(diff_data.params[3]) 
 55      diff_data.cos_phi = cos(diff_data.params[3]) 
 56   
 57       
 58      diff_data.dpar[0] = diff_data.sin_theta * diff_data.cos_phi 
 59      diff_data.dpar[1] = diff_data.sin_theta * diff_data.sin_phi 
 60      diff_data.dpar[2] = diff_data.cos_theta 
 61   
 62       
 63      data.dz = dot(data.xh_unit_vector, diff_data.dpar) 
  64   
 65   
 66   
 67   
 68   
 69   
 71      """Function for calculating the partial derivatives of the direction cosine dz. 
 72   
 73      The theta partial derivative of the unit Dpar vector is 
 74   
 75          dDpar      | cos(theta) * cos(phi) | 
 76          ------  =  | cos(theta) * sin(phi) | 
 77          dtheta     |      -sin(theta)      | 
 78   
 79      The phi partial derivative of the unit Dpar vector is 
 80   
 81          dDpar     | -sin(theta) * sin(phi) | 
 82          -----  =  |  sin(theta) * cos(phi) | 
 83          dphi      |           0            | 
 84   
 85      O is the orientational parameter set {theta, phi} 
 86      """ 
 87   
 88       
 89      diff_data.dpar_dtheta[0] = diff_data.cos_theta * diff_data.cos_phi 
 90      diff_data.dpar_dtheta[1] = diff_data.cos_theta * diff_data.sin_phi 
 91      diff_data.dpar_dtheta[2] = -diff_data.sin_theta 
 92   
 93       
 94      diff_data.dpar_dphi[0] = -diff_data.sin_theta * diff_data.sin_phi 
 95      diff_data.dpar_dphi[1] = diff_data.sin_theta * diff_data.cos_phi 
 96      diff_data.dpar_dphi[2] = 0.0 
 97   
 98       
 99      data.ddz_dO[0] = dot(data.xh_unit_vector, diff_data.dpar_dtheta) 
100      data.ddz_dO[1] = dot(data.xh_unit_vector, diff_data.dpar_dphi) 
 101   
102   
103   
104   
105   
106   
108      """Function for calculating the second partial derivatives of the direction cosine dz. 
109   
110      The theta-theta second partial derivative of the unit Dpar vector is 
111   
112          d2Dpar      | -sin(theta) * cos(phi) | 
113          -------  =  | -sin(theta) * sin(phi) | 
114          dtheta2     |      -cos(theta)       | 
115   
116      The theta-phi second partial derivative of the unit Dpar vector is 
117   
118            d2Dpar        | -cos(theta) * sin(phi) | 
119          -----------  =  |  cos(theta) * cos(phi) | 
120          dtheta.dphi     |           0            | 
121   
122      The phi-phi second partial derivative of the unit Dpar vector is 
123   
124          dDpar     | -sin(theta) * cos(phi) | 
125          -----  =  | -sin(theta) * sin(phi) | 
126          dphi2     |           0            | 
127   
128      O is the orientational parameter set {theta, phi} 
129      """ 
130   
131       
132      diff_data.dpar_dtheta2[0] = -diff_data.sin_theta * diff_data.cos_phi 
133      diff_data.dpar_dtheta2[1] = -diff_data.sin_theta * diff_data.sin_phi 
134      diff_data.dpar_dtheta2[2] = -diff_data.cos_theta 
135   
136       
137      diff_data.dpar_dthetadphi[0] = -diff_data.cos_theta * diff_data.sin_phi 
138      diff_data.dpar_dthetadphi[1] = diff_data.cos_theta * diff_data.cos_phi 
139      diff_data.dpar_dthetadphi[2] = 0.0 
140   
141       
142      diff_data.dpar_dphi2[0] = -diff_data.sin_theta * diff_data.cos_phi 
143      diff_data.dpar_dphi2[1] = -diff_data.sin_theta * diff_data.sin_phi 
144      diff_data.dpar_dphi2[2] = 0.0 
145   
146       
147      data.d2dz_dO2[0, 0] = dot(data.xh_unit_vector, diff_data.dpar_dtheta2) 
148      data.d2dz_dO2[0, 1] = data.d2dz_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.dpar_dthetadphi) 
149      data.d2dz_dO2[1, 1] = dot(data.xh_unit_vector, diff_data.dpar_dphi2) 
 150   
151   
152   
153   
154   
155   
156   
157   
158   
159   
160   
161   
163      """Function for calculating the direction cosines dx, dy, and dz. 
164   
165      Direction cosines 
166      ~~~~~~~~~~~~~~~~~ 
167   
168      dx is the dot product between the unit bond vector and the unit vector along Dx.  The 
169      equation is 
170   
171          dx = XH . Dx 
172   
173      dy is the dot product between the unit bond vector and the unit vector along Dy.  The 
174      equation is 
175   
176          dy = XH . Dy 
177   
178      dz is the dot product between the unit bond vector and the unit vector along Dz.  The 
179      equation is 
180   
181          dz = XH . Dz 
182   
183   
184      Unit vectors 
185      ~~~~~~~~~~~~ 
186   
187      The unit Dx vector is 
188   
189                 | -sin(alpha) * sin(gamma) + cos(alpha) * cos(beta) * cos(gamma) | 
190          Dx  =  | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) | 
191                 |                    cos(alpha) * sin(beta)                      | 
192   
193      The unit Dy vector is 
194   
195                 | cos(alpha) * sin(gamma) + sin(alpha) * cos(beta) * cos(gamma) | 
196          Dy  =  | cos(alpha) * cos(gamma) - sin(alpha) * cos(beta) * sin(gamma) | 
197                 |                   sin(alpha) * sin(beta)                      | 
198   
199      The unit Dz vector is 
200   
201                 | -sin(beta) * cos(gamma) | 
202          Dz  =  |  sin(beta) * sin(gamma) | 
203                 |        cos(beta)        | 
204   
205      """ 
206   
207       
208      data.sin_a = sin(diff_data.params[3]) 
209      data.sin_b = sin(diff_data.params[4]) 
210      data.sin_g = sin(diff_data.params[5]) 
211   
212      data.cos_a = cos(diff_data.params[3]) 
213      data.cos_b = cos(diff_data.params[4]) 
214      data.cos_g = cos(diff_data.params[5]) 
215   
216       
217      diff_data.dx[0] = -data.sin_a * data.sin_g + data.cos_a * data.cos_b * data.cos_g 
218      diff_data.dx[1] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g 
219      diff_data.dx[2] =  data.cos_a * data.sin_b 
220   
221       
222      diff_data.dy[0] = data.cos_a * data.sin_g + data.sin_a * data.cos_b * data.cos_g 
223      diff_data.dy[1] = data.cos_a * data.cos_g - data.sin_a * data.cos_b * data.sin_g 
224      diff_data.dy[2] = data.sin_a * data.sin_b 
225   
226       
227      diff_data.dz[0] = -data.sin_b * data.cos_g 
228      diff_data.dz[1] =  data.sin_b * data.sin_g 
229      diff_data.dz[2] =  data.cos_b 
230   
231       
232      data.dx = dot(data.xh_unit_vector, diff_data.dx) 
233      data.dy = dot(data.xh_unit_vector, diff_data.dy) 
234      data.dz = dot(data.xh_unit_vector, diff_data.dz) 
 235   
236   
237   
238   
239   
240   
242      """Function for calculating the partial derivatives of the direction cosines dx, dy, and dz. 
243   
244      Dx gradient 
245      ~~~~~~~~~~~ 
246   
247      The alpha partial derivative of the unit Dx vector is 
248   
249           dDx       | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) | 
250          ------  =  | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) | 
251          dalpha     |                   -sin(alpha) * sin(beta)                      | 
252   
253      The beta partial derivative of the unit Dx vector is 
254   
255           dDx      | -cos(alpha) * sin(beta) * cos(gamma) | 
256          -----  =  |  cos(alpha) * sin(beta) * sin(gamma) | 
257          dbeta     |       cos(alpha) * cos(beta)         | 
258   
259      The gamma partial derivative of the unit Dx vector is 
260   
261           dDx       | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) | 
262          ------  =  |  sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) | 
263          dgamma     |                             0                                  | 
264   
265   
266      Dy gradient 
267      ~~~~~~~~~~~ 
268   
269      The alpha partial derivative of the unit Dy vector is 
270   
271           dDy       | -sin(alpha) * sin(gamma) + cos(alpha) * cos(beta) * cos(gamma) | 
272          ------  =  | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) | 
273          dalpha     |                    cos(alpha) * sin(beta)                      | 
274   
275      The beta partial derivative of the unit Dy vector is 
276   
277           dDy      | -sin(alpha) * sin(beta) * cos(gamma) | 
278          -----  =  |  sin(alpha) * sin(beta) * sin(gamma) | 
279          dbeta     |       sin(alpha) * cos(beta)         | 
280   
281      The gamma partial derivative of the unit Dy vector is 
282   
283           dDy       |  cos(alpha) * cos(gamma) - sin(alpha) * cos(beta) * sin(gamma) | 
284          ------  =  | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) | 
285          dgamma     |                             0                                  | 
286   
287   
288      Dz gradient 
289      ~~~~~~~~~~~ 
290   
291      The alpha partial derivative of the unit Dz vector is 
292   
293           dDz       | 0 | 
294          ------  =  | 0 | 
295          dalpha     | 0 | 
296   
297      The beta partial derivative of the unit Dz vector is 
298   
299           dDz      | -cos(beta) * cos(gamma) | 
300          -----  =  |  cos(beta) * sin(gamma) | 
301          dbeta     |        -sin(beta)       | 
302   
303      The gamma partial derivative of the unit Dz vector is 
304   
305           dDz       | sin(beta) * sin(gamma) | 
306          ------  =  | sin(beta) * cos(gamma) | 
307          dgamma     |           0            | 
308      """ 
309   
310       
311       
312   
313       
314      diff_data.ddx_dalpha[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g 
315      diff_data.ddx_dalpha[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g 
316      diff_data.ddx_dalpha[2] = -data.sin_a * data.sin_b 
317   
318       
319      diff_data.ddx_dbeta[0] = -data.cos_a * data.sin_b * data.cos_g 
320      diff_data.ddx_dbeta[1] =  data.cos_a * data.sin_b * data.sin_g 
321      diff_data.ddx_dbeta[2] =  data.cos_a * data.cos_b 
322   
323       
324      diff_data.ddx_dgamma[0] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g 
325      diff_data.ddx_dgamma[1] =  data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g 
326   
327   
328       
329       
330   
331       
332      diff_data.ddy_dalpha[0] = -data.sin_a * data.sin_g + data.cos_a * data.cos_b * data.cos_g 
333      diff_data.ddy_dalpha[1] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g 
334      diff_data.ddy_dalpha[2] =  data.cos_a * data.sin_b 
335   
336       
337      diff_data.ddy_dbeta[0] = -data.sin_a * data.sin_b * data.cos_g 
338      diff_data.ddy_dbeta[1] =  data.sin_a * data.sin_b * data.sin_g 
339      diff_data.ddy_dbeta[2] =  data.sin_a * data.cos_b 
340   
341       
342      diff_data.ddy_dgamma[0] =  data.cos_a * data.cos_g - data.sin_a * data.cos_b * data.sin_g 
343      diff_data.ddy_dgamma[1] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g 
344   
345   
346       
347       
348   
349       
350      diff_data.ddz_dbeta[0] = -data.cos_b * data.cos_g 
351      diff_data.ddz_dbeta[1] =  data.cos_b * data.sin_g 
352      diff_data.ddz_dbeta[2] = -data.sin_b 
353   
354       
355      diff_data.ddz_dgamma[0] = data.sin_b * data.sin_g 
356      diff_data.ddz_dgamma[1] = data.sin_b * data.cos_g 
357   
358   
359       
360       
361   
362      data.ddx_dO[0] = dot(data.xh_unit_vector, diff_data.ddx_dalpha) 
363      data.ddx_dO[1] = dot(data.xh_unit_vector, diff_data.ddx_dbeta) 
364      data.ddx_dO[2] = dot(data.xh_unit_vector, diff_data.ddx_dgamma) 
365   
366      data.ddy_dO[0] = dot(data.xh_unit_vector, diff_data.ddy_dalpha) 
367      data.ddy_dO[1] = dot(data.xh_unit_vector, diff_data.ddy_dbeta) 
368      data.ddy_dO[2] = dot(data.xh_unit_vector, diff_data.ddy_dgamma) 
369   
370      data.ddz_dO[1] = dot(data.xh_unit_vector, diff_data.ddz_dbeta) 
371      data.ddz_dO[2] = dot(data.xh_unit_vector, diff_data.ddz_dgamma) 
 372   
373   
374   
375   
376   
377   
379      """Function for calculating the second partial derivatives of the direction cosines dx, dy, dz. 
380   
381      Dx Hessian 
382      ~~~~~~~~~~ 
383   
384      The alpha-alpha second partial derivative of the unit Dx vector is 
385   
386           d2Dx       | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) | 
387          -------  =  | sin(alpha) * cos(gamma) + cos(alpha) * cos(beta) * sin(gamma) | 
388          dalpha2     |                  -cos(alpha) * sin(beta)                      | 
389   
390      The alpha-beta second partial derivative of the unit Dx vector is 
391   
392              d2Dx         |  sin(alpha) * sin(beta) * cos(gamma) | 
393          ------------  =  | -sin(alpha) * sin(beta) * sin(gamma) | 
394          dalpha.dbeta     |      -sin(alpha) * cos(beta)         | 
395   
396      The alpha-gamma second partial derivative of the unit Dx vector is 
397   
398              d2Dx          | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) | 
399          -------------  =  |  cos(alpha) * sin(gamma) + sin(alpha) * cos(beta) * cos(gamma) | 
400          dalpha.dgamma     |                             0                                  | 
401   
402      The beta-beta second partial derivative of the unit Dx vector is 
403   
404           d2Dx      | -cos(alpha) * cos(beta) * cos(gamma) | 
405          ------  =  |  cos(alpha) * cos(beta) * sin(gamma) | 
406          dbeta2     |      -cos(alpha) * sin(beta)         | 
407   
408      The beta-gamma second partial derivative of the unit Dx vector is 
409   
410              d2Dx         | cos(alpha) * sin(beta) * sin(gamma) | 
411          ------------  =  | cos(alpha) * sin(beta) * cos(gamma) | 
412          dbeta.dgamma     |                 0                   | 
413   
414      The gamma-gamma second partial derivative of the unit Dx vector is 
415   
416           d2Dx       | sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) | 
417          -------  =  | sin(alpha) * cos(gamma) + cos(alpha) * cos(beta) * sin(gamma) | 
418          dgamma2     |                            0                                  | 
419   
420   
421      Dy Hessian 
422      ~~~~~~~~~~ 
423   
424      The alpha-alpha second partial derivative of the unit Dy vector is 
425   
426           d2Dy       | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) | 
427          -------  =  | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) | 
428          dalpha2     |                   -sin(alpha) * sin(beta)                      | 
429   
430      The alpha-beta second partial derivative of the unit Dy vector is 
431   
432              d2Dy         | -cos(alpha) * sin(beta) * cos(gamma) | 
433          ------------  =  |  cos(alpha) * sin(beta) * sin(gamma) | 
434          dalpha.dbeta     |       cos(alpha) * cos(beta)         | 
435   
436      The alpha-gamma second partial derivative of the unit Dy vector is 
437   
438              d2Dy          | -sin(alpha) * cos(gamma) - cos(alpha) * cos(beta) * sin(gamma) | 
439          -------------  =  |  sin(alpha) * sin(gamma) - cos(alpha) * cos(beta) * cos(gamma) | 
440          dalpha.dgamma     |                             0                                  | 
441   
442      The beta-beta second partial derivative of the unit Dy vector is 
443   
444           d2Dy      | -sin(alpha) * cos(beta) * cos(gamma) | 
445          ------  =  |  sin(alpha) * cos(beta) * sin(gamma) | 
446          dbeta2     |      -sin(alpha) * sin(beta)         | 
447   
448      The beta-gamma second partial derivative of the unit Dy vector is 
449   
450              d2Dy         | sin(alpha) * sin(beta) * sin(gamma) | 
451          ------------  =  | sin(alpha) * sin(beta) * cos(gamma) | 
452          dbeta.dgamma     |                 0                   | 
453   
454      The gamma-gamma second partial derivative of the unit Dy vector is 
455   
456           d2Dy       | -cos(alpha) * sin(gamma) - sin(alpha) * cos(beta) * cos(gamma) | 
457          -------  =  | -cos(alpha) * cos(gamma) + sin(alpha) * cos(beta) * sin(gamma) | 
458          dgamma2     |                             0                                  | 
459   
460   
461      Dz Hessian 
462      ~~~~~~~~~~ 
463   
464      The alpha-alpha second partial derivative of the unit Dz vector is 
465   
466           d2Dz       | 0 | 
467          -------  =  | 0 | 
468          dalpha2     | 0 | 
469   
470      The alpha-beta second partial derivative of the unit Dz vector is 
471   
472              d2Dz         | 0 | 
473          ------------  =  | 0 | 
474          dalpha.dbeta     | 0 | 
475   
476      The alpha-gamma second partial derivative of the unit Dz vector is 
477   
478               d2Dz         | 0 | 
479          -------------  =  | 0 | 
480          dalpha.dgamma     | 0 | 
481   
482      The beta-beta second partial derivative of the unit Dz vector is 
483   
484           d2Dz      |  sin(beta) * cos(gamma) | 
485          ------  =  | -sin(beta) * sin(gamma) | 
486          dbeta2     |        -cos(beta)       | 
487   
488      The beta-gamma second partial derivative of the unit Dz vector is 
489   
490              d2Dz         | cos(beta) * sin(gamma) | 
491          ------------  =  | cos(beta) * cos(gamma) | 
492          dbeta.dgamma     |           0            | 
493   
494      The gamma-gamma second partial derivative of the unit Dz vector is 
495   
496           d2Dz       |  sin(beta) * cos(gamma) | 
497          -------  =  | -sin(beta) * sin(gamma) | 
498          dgamma2     |            0            | 
499      """ 
500   
501       
502       
503   
504       
505      diff_data.d2dx_dalpha2[0] =  data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g 
506      diff_data.d2dx_dalpha2[1] =  data.sin_a * data.cos_g + data.cos_a * data.cos_b * data.sin_g 
507      diff_data.d2dx_dalpha2[2] = -data.cos_a * data.sin_b 
508   
509       
510      diff_data.d2dx_dalpha_dbeta[0] =  data.sin_a * data.sin_b * data.cos_g 
511      diff_data.d2dx_dalpha_dbeta[1] = -data.sin_a * data.sin_b * data.sin_g 
512      diff_data.d2dx_dalpha_dbeta[2] = -data.sin_a * data.cos_b 
513   
514       
515      diff_data.d2dx_dalpha_dgamma[0] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g 
516      diff_data.d2dx_dalpha_dgamma[1] =  data.cos_a * data.sin_g + data.sin_a * data.cos_b * data.cos_g 
517   
518       
519      diff_data.d2dx_dbeta2[0] = -data.cos_a * data.cos_b * data.cos_g 
520      diff_data.d2dx_dbeta2[1] =  data.cos_a * data.cos_b * data.sin_g 
521      diff_data.d2dx_dbeta2[2] = -data.cos_a * data.sin_b 
522   
523       
524      diff_data.d2dx_dbeta_dgamma[0] = data.cos_a * data.sin_b * data.sin_g 
525      diff_data.d2dx_dbeta_dgamma[1] = data.cos_a * data.sin_b * data.cos_g 
526   
527       
528      diff_data.d2dx_dgamma2[0] = data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g 
529      diff_data.d2dx_dgamma2[1] = data.sin_a * data.cos_g + data.cos_a * data.cos_b * data.sin_g 
530   
531   
532       
533       
534   
535       
536      diff_data.d2dy_dalpha2[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g 
537      diff_data.d2dy_dalpha2[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g 
538      diff_data.d2dy_dalpha2[2] = -data.sin_a * data.sin_b 
539   
540       
541      diff_data.d2dy_dalpha_dbeta[0] = -data.cos_a * data.sin_b * data.cos_g 
542      diff_data.d2dy_dalpha_dbeta[1] =  data.cos_a * data.sin_b * data.sin_g 
543      diff_data.d2dy_dalpha_dbeta[2] =  data.cos_a * data.cos_b 
544   
545       
546      diff_data.d2dy_dalpha_dgamma[0] = -data.sin_a * data.cos_g - data.cos_a * data.cos_b * data.sin_g 
547      diff_data.d2dy_dalpha_dgamma[1] =  data.sin_a * data.sin_g - data.cos_a * data.cos_b * data.cos_g 
548   
549       
550      diff_data.d2dy_dbeta2[0] = -data.sin_a * data.cos_b * data.cos_g 
551      diff_data.d2dy_dbeta2[1] =  data.sin_a * data.cos_b * data.sin_g 
552      diff_data.d2dy_dbeta2[2] = -data.sin_a * data.sin_b 
553   
554       
555      diff_data.d2dy_dbeta_dgamma[0] = data.sin_a * data.sin_b * data.sin_g 
556      diff_data.d2dy_dbeta_dgamma[1] = data.sin_a * data.sin_b * data.cos_g 
557   
558       
559      diff_data.d2dy_dgamma2[0] = -data.cos_a * data.sin_g - data.sin_a * data.cos_b * data.cos_g 
560      diff_data.d2dy_dgamma2[1] = -data.cos_a * data.cos_g + data.sin_a * data.cos_b * data.sin_g 
561   
562   
563       
564       
565   
566       
567      diff_data.d2dz_dbeta2[0] =  data.sin_b * data.cos_g 
568      diff_data.d2dz_dbeta2[1] = -data.sin_b * data.sin_g 
569      diff_data.d2dz_dbeta2[2] = -data.cos_b 
570   
571       
572      diff_data.d2dz_dbeta_dgamma[0] = data.cos_b * data.sin_g 
573      diff_data.d2dz_dbeta_dgamma[1] = data.cos_b * data.cos_g 
574   
575       
576      diff_data.d2dz_dgamma2[0] =  data.sin_b * data.cos_g 
577      diff_data.d2dz_dgamma2[1] = -data.sin_b * data.sin_g 
578   
579   
580       
581       
582   
583      data.d2dx_dO2[0, 0] =                       dot(data.xh_unit_vector, diff_data.d2dx_dalpha2) 
584      data.d2dx_dO2[0, 1] = data.d2dx_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.d2dx_dalpha_dbeta) 
585      data.d2dx_dO2[0, 2] = data.d2dx_dO2[2, 0] = dot(data.xh_unit_vector, diff_data.d2dx_dalpha_dgamma) 
586      data.d2dx_dO2[1, 1] =                       dot(data.xh_unit_vector, diff_data.d2dx_dbeta2) 
587      data.d2dx_dO2[1, 2] = data.d2dx_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dx_dbeta_dgamma) 
588      data.d2dx_dO2[2, 2] =                       dot(data.xh_unit_vector, diff_data.d2dx_dgamma2) 
589   
590      data.d2dy_dO2[0, 0] =                       dot(data.xh_unit_vector, diff_data.d2dy_dalpha2) 
591      data.d2dy_dO2[0, 1] = data.d2dy_dO2[1, 0] = dot(data.xh_unit_vector, diff_data.d2dy_dalpha_dbeta) 
592      data.d2dy_dO2[0, 2] = data.d2dy_dO2[2, 0] = dot(data.xh_unit_vector, diff_data.d2dy_dalpha_dgamma) 
593      data.d2dy_dO2[1, 1] =                       dot(data.xh_unit_vector, diff_data.d2dy_dbeta2) 
594      data.d2dy_dO2[1, 2] = data.d2dy_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dy_dbeta_dgamma) 
595      data.d2dy_dO2[2, 2] =                       dot(data.xh_unit_vector, diff_data.d2dy_dgamma2) 
596   
597      data.d2dz_dO2[1, 1] =                       dot(data.xh_unit_vector, diff_data.d2dz_dbeta2) 
598      data.d2dz_dO2[1, 2] = data.d2dz_dO2[2, 1] = dot(data.xh_unit_vector, diff_data.d2dz_dbeta_dgamma) 
599      data.d2dz_dO2[2, 2] =                       dot(data.xh_unit_vector, diff_data.d2dz_dgamma2) 
 600