1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from math import sqrt
24 from numpy import outer
25
26
27
28
29
30
31
32
33
34
36 """Weight for spherical diffusion.
37
38 The equation is::
39
40 c0 = 1.
41 """
42
43 data.ci[0] = 1.0
44
45
46
47
48
49
50
51
52
53
54
55
57 """Weights for spheroidal diffusion.
58
59 The equations are::
60
61 c-1 = 1/4 (3dz**2 - 1)**2,
62
63 c0 = 3dz**2 (1 - dz**2),
64
65 c1 = 3/4 (dz**2 - 1)**2,
66
67 where dz is the direction cosine of the unit bond vector along the z-axis of the diffusion
68 tensor which is calculated as the dot product of the unit bond vector with a unit vector along
69 Dpar.
70 """
71
72
73 data.three_dz2_one = 3.0 * data.dz**2 - 1.0
74 data.one_two_dz2 = 1.0 - 2.0 * data.dz**2
75 data.one_dz2 = 1.0 - data.dz**2
76 data.dz2_one = -data.one_dz2
77
78
79 data.ci[0] = 0.25 * data.three_dz2_one**2
80 data.ci[1] = 3.0 * data.dz**2 * data.one_dz2
81 data.ci[2] = 0.75 * data.dz2_one**2
82
83
84
85
86
87
89 """Weight gradient for spheroidal diffusion.
90
91 The equations are::
92
93 dc-1 ddz
94 ---- = 3dz (3dz**2 - 1) --- ,
95 dOi dOi
96
97 dc0 ddz
98 --- = 6dz (1 - 2dz**2) --- ,
99 dOi dOi
100
101 dc1 ddz
102 --- = 3dz (dz**2 - 1) --- ,
103 dOi dOi
104
105 where the orientation parameter set O is {theta, phi}.
106 """
107
108
109 data.dci[2:, 0] = 3.0 * data.dz * data.three_dz2_one * data.ddz_dO
110 data.dci[2:, 1] = 6.0 * data.dz * data.one_two_dz2 * data.ddz_dO
111 data.dci[2:, 2] = 3.0 * data.dz * data.dz2_one * data.ddz_dO
112
113
114
115
116
117
119 """Weight Hessian for spheroidal diffusion.
120
121 The equations are::
122
123 d2c-1 / ddz ddz d2dz \
124 ------- = 3 |(9dz**2 - 1) --- . --- + dz (3dz**2 - 1) ------- | ,
125 dOi.dOj \ dOi dOj dOi.dOj /
126
127 d2c0 / ddz ddz d2dz \
128 ------- = 6 |(1 - 6dz**2) --- . --- + dz (1 - 2dz**2) ------- | ,
129 dOi.dOj \ dOi dOj dOi.dOj /
130
131 d2c1 / ddz ddz d2dz \
132 ------- = 3 |(3dz**2 - 1) --- . --- + dz (dz**2 - 1) ------- | ,
133 dOi.dOj \ dOi dOj dOi.dOj /
134
135 where the orientation parameter set O is {theta, phi}.
136 """
137
138
139 op = outer(data.ddz_dO, data.ddz_dO)
140
141
142 data.d2ci[2:, 2:, 0] = 3.0 * ((9.0 * data.dz**2 - 1.0) * op + data.dz * data.three_dz2_one * data.d2dz_dO2)
143 data.d2ci[2:, 2:, 1] = 6.0 * ((1.0 - 6.0*data.dz**2) * op + data.dz * data.one_two_dz2 * data.d2dz_dO2)
144 data.d2ci[2:, 2:, 2] = 3.0 * (data.three_dz2_one * op + data.dz * data.dz2_one * data.d2dz_dO2)
145
146
147
148
149
150
151
152
153
154
155
156
158 """Weight equations for ellipsoidal diffusion.
159
160 The equations are::
161
162 c-2 = 1/4 (d - e),
163
164 c-1 = 3dy**2.dz**2,
165
166 c0 = 3dx**2.dz**2,
167
168 c1 = 3dx**2.dy**2,
169
170 c2 = 1/4 (d + e),
171
172 where::
173
174 d = 3(dx**4 + dy**4 + dz**4) - 1,
175
176 e = 1/R [(1 + 3Dr)(dx**4 + 2dy**2.dz**2) + (1 - 3Dr)(dy**4 + 2dx**2.dz**2)
177 - 2(dz**4 + 2dx**2.dy**2)],
178
179 and where the factor R is defined as::
180 ___________
181 R = V 1 + 3Dr**2.
182
183 dx, dy, and dz are the direction cosines of the XH bond vector along the x, y, and z-axes of the
184 diffusion tensor, calculated as the dot product of the unit bond vector and the unit vectors
185 along Dx, Dy, and Dz respectively.
186 """
187
188
189 data.R = sqrt(1 + 3.0*diff_data.params[2]**2)
190 data.inv_R = 1.0 / data.R
191
192
193 data.one_3Dr = 1.0 + 3.0 * diff_data.params[2]
194 data.one_m3Dr = 1.0 - 3.0 * diff_data.params[2]
195 data.dx_sqrd = data.dx**2
196 data.dy_sqrd = data.dy**2
197 data.dz_sqrd = data.dz**2
198 data.dx_cubed = data.dx**3
199 data.dy_cubed = data.dy**3
200 data.dz_cubed = data.dz**3
201 data.dx_quar = data.dx**4
202 data.dy_quar = data.dy**4
203 data.dz_quar = data.dz**4
204
205
206 data.ex = data.dx_quar + 2.0 * data.dy_sqrd * data.dz_sqrd
207 data.ey = data.dy_quar + 2.0 * data.dx_sqrd * data.dz_sqrd
208 data.ez = data.dz_quar + 2.0 * data.dx_sqrd * data.dy_sqrd
209
210
211 d = 3.0 * (data.dx_quar + data.dy_quar + data.dz_quar) - 1.0
212
213
214 e = data.inv_R * (data.one_3Dr * data.ex + data.one_m3Dr * data.ey - 2.0 * data.ez)
215
216
217 data.ci[0] = 0.25 * (d - e)
218
219
220 data.ci[1] = 3.0 * data.dy**2 * data.dz**2
221
222
223 data.ci[2] = 3.0 * data.dx**2 * data.dz**2
224
225
226 data.ci[3] = 3.0 * data.dx**2 * data.dy**2
227
228
229 data.ci[4] = 0.25 * (d + e)
230
231
232
233
234
235
237 """Weight gradient for ellipsoidal diffusion.
238
239 Oi partial derivatives
240 ======================
241
242 The equations are::
243
244 dc-2 / ddx ddy ddz \ de
245 ---- = 3 | dx**3 --- + dy**3 --- + dz**3 --- | - --- ,
246 dOi \ dOi dOi dOi / dOi
247
248
249 dc-1 / ddz ddy \
250 ---- = 6dy.dz | dy --- + dz --- | ,
251 dOi \ dOi dOi /
252
253
254 dc0 / ddz ddx \
255 --- = 6dx.dz | dx --- + dz --- | ,
256 dOi \ dOi dOi /
257
258
259 dc1 / ddy ddx \
260 --- = 6dx.dy | dx --- + dy --- | ,
261 dOi \ dOi dOi /
262
263
264 dc2 / ddx ddy ddz \ de
265 --- = 3 | dx**3 --- + dy**3 --- + dz**3 --- | + --- ,
266 dOi \ dOi dOi dOi / dOi
267
268
269 where::
270
271 de 1 / / ddx / ddz ddy \ \
272 --- = - | (1 + 3Dr) |dx**3 --- + dy.dz | dy --- + dz --- | |
273 dOi R \ \ dOi \ dOi dOi / /
274
275 / ddy / ddz ddx \ \
276 + (1 - 3Dr) | dy**3 --- + dx.dz | dx --- + dz --- | |
277 \ dOi \ dOi dOi / /
278
279 / ddz / ddy ddx \ \ \
280 - 2 | dz**3 --- + dx.dy | dx --- + dy --- | | | ,
281 \ dOi \ dOi dOi / / /
282
283
284 and where the orietation parameter set O is::
285
286 O = {alpha, beta, gamma}.
287
288
289 tm partial derivatives
290 ======================
291
292 The equations are::
293
294 dc-2
295 ---- = 0,
296 dtm
297
298 dc-1
299 ---- = 0,
300 dtm
301
302 dc0
303 --- = 0,
304 dtm
305
306 dc1
307 --- = 0,
308 dtm
309
310 dc2
311 --- = 0.
312 dtm
313
314
315 Da partial derivatives
316 ======================
317
318 The equations are::
319
320 dc-2
321 ---- = 0,
322 dDa
323
324 dc-1
325 ---- = 0,
326 dDa
327
328 dc0
329 --- = 0,
330 dDa
331
332 dc1
333 --- = 0,
334 dDa
335
336 dc2
337 --- = 0.
338 dDa
339
340
341
342 Dr partial derivatives
343 ======================
344
345 The equations are::
346
347 dc-2 3 de
348 ---- = - - ---,
349 dDr 4 dDr
350
351 dc-1
352 ---- = 0,
353 dDr
354
355 dc0
356 --- = 0,
357 dDr
358
359 dc1
360 --- = 0,
361 dDr
362
363 dc2 3 de
364 --- = - ---,
365 dDr 4 dDr
366
367 where::
368
369 de 1 / \
370 --- = ---- | (1 - Dr) (dx**4 + 2dy**2.dz**2) - (1 + Dr) (dy**4 + 2dx**2.dz**2) + 2Dr (dz**4 + 2dx**2.dy**2) | .
371 dDr R**3 \ /
372
373
374 """
375
376
377 data.inv_R_cubed = data.inv_R ** 3
378 data.one_Dr = 1.0 + diff_data.params[2]
379 data.one_mDr = 1.0 - diff_data.params[2]
380
381
382
383
384
385
386 data.ci_xy = data.dx * data.dy * (data.dx * data.ddy_dO + data.dy * data.ddx_dO)
387 data.ci_xz = data.dx * data.dz * (data.dx * data.ddz_dO + data.dz * data.ddx_dO)
388 data.ci_yz = data.dy * data.dz * (data.dy * data.ddz_dO + data.dz * data.ddy_dO)
389
390 data.ci_x = data.dx_cubed * data.ddx_dO
391 data.ci_y = data.dy_cubed * data.ddy_dO
392 data.ci_z = data.dz_cubed * data.ddz_dO
393
394 data.ci_X = data.ci_x + data.ci_yz
395 data.ci_Y = data.ci_y + data.ci_xz
396 data.ci_Z = data.ci_z + data.ci_xy
397
398
399 dd_dOi = 3.0 * (data.ci_x + data.ci_y + data.ci_z)
400
401
402 de_dOi = data.inv_R * (data.one_3Dr * data.ci_X + data.one_m3Dr * data.ci_Y - 2.0 * data.ci_Z)
403
404
405 data.dci[3:, 0] = dd_dOi - de_dOi
406
407
408 data.dci[3:, 1] = 6.0 * data.ci_yz
409
410
411 data.dci[3:, 2] = 6.0 * data.ci_xz
412
413
414 data.dci[3:, 3] = 6.0 * data.ci_xy
415
416
417 data.dci[3:, 4] = dd_dOi + de_dOi
418
419
420
421
422
423
424 de_dDr = data.inv_R_cubed * (data.one_mDr * data.ex - data.one_Dr * data.ey + 2.0 * diff_data.params[2] * data.ez)
425
426
427 data.dci[2, 0] = -0.75 * de_dDr
428
429
430 data.dci[2, 4] = 0.75 * de_dDr
431
432
433
434
435
436
438 """Weight Hessian for ellipsoidal diffusion.
439
440 Oi-Oj partial derivatives
441 =========================
442
443 The equations are::
444
445 d2c-2 / / d2dx ddx ddx \ / d2dy ddy ddy \ / d2dz ddz ddz \ \ d2e
446 ------- = 3 | dx**2 | dx ------- + 3 --- . --- | + dy**2 | dy ------- + 3 --- . --- | + dz**2 | dz ------- + 3 --- . --- | | - ------- ,
447 dOi.dOj \ \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj / / dOi.dOj
448
449
450 d2c-1 / d2dz ddz ddz \ / ddy ddz ddz ddy \ / d2dy ddy ddy \
451 ------- = 6 dy**2 | dz ------- + --- . --- | + 12 dy.dz | --- . --- + --- . --- | + 6 dz**2 | dy ------- + --- . --- | ,
452 dOi.dOj \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / \ dOi.dOj dOi dOj /
453
454
455 d2c0 / d2dz ddz ddz \ / ddx ddz ddz ddx \ / d2dx ddx ddx \
456 ------- = 6 dx**2 | dz ------- + --- . --- | + 12 dx.dz | --- . --- + --- . --- | + 6 dz**2 | dx ------- + --- . --- | ,
457 dOi.dOj \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / \ dOi.dOj dOi dOj /
458
459
460 d2c1 / d2dy ddy ddy \ / ddx ddy ddy ddx \ / d2dx ddx ddx \
461 ------- = 6 dx**2 | dy ------- + --- . --- | + 12 dx.dy | --- . --- + --- . --- | + 6 dy**2 | dx ------- + --- . --- | ,
462 dOi.dOj \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / \ dOi.dOj dOi dOj /
463
464
465 d2c2 / / d2dx ddx ddx \ / d2dy ddy ddy \ / d2dz ddz ddz \ \ d2e
466 ------- = 3 | dx**2 | dx ------- + 3 --- . --- | + dy**2 | dy ------- + 3 --- . --- | + dz**2 | dz ------- + 3 --- . --- | | + ------- ,
467 dOi.dOj \ \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj / / dOi.dOj
468
469 where::
470
471 d2e 1 / / / d2dx ddx ddx \ / d2dz ddz ddz \
472 ------- = - | (1 + 3Dr) | dx**2 | dx ------- + 3 --- . --- | + dy**2 | dz ------- + --- . --- |
473 dOi.dOj R \ \ \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj /
474
475 / d2dy ddy ddy \ / ddy ddz ddz ddy \ \
476 + dz**2 | dy ------- + --- . --- | + 2dy.dz | --- . --- + --- . --- | |
477 \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / /
478
479 / / d2dy ddy ddy \ / d2dz ddz ddz \
480 + (1 - 3Dr) | dy**2 | dy ------- + 3 --- . --- | + dx**2 | dz ------- + --- . --- |
481 \ \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj /
482
483 / d2dx ddx ddx \ / ddx ddz ddz ddx \ \
484 + dz**2 | dx ------- + --- . --- | + 2dx.dz | --- . --- + --- . --- | |
485 \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / /
486
487 / / d2dz ddz ddz \ / d2dy ddy ddy \
488 - 2 | dz**2 | dz ------- + 3 --- . --- | + dx**2 | dy ------- + --- . --- |
489 \ \ dOi.dOj dOi dOj / \ dOi.dOj dOi dOj /
490
491 / d2dx ddx ddx \ / ddx ddy ddy ddx \ \ \
492 + dy**2 | dx ------- + --- . --- | + 2dx.dy | --- . --- + --- . --- | | |
493 \ dOi.dOj dOi dOj / \ dOi dOj dOi dOj / / /
494
495
496 Oi-tm partial derivatives
497 =========================
498
499 The equations are::
500
501 d2c-2
502 ------- = 0,
503 dOi.dtm
504
505
506 d2c-1
507 ------- = 0,
508 dOi.dtm
509
510
511 d2c0
512 ------- = 0,
513 dOi.dtm
514
515
516 d2c1
517 ------- = 0,
518 dOi.dtm
519
520
521 d2c2
522 ------- = 0.
523 dOi.dtm
524
525
526 Oi-Da partial derivatives
527 =========================
528
529 The equations are::
530
531 d2c-2
532 ------- = 0,
533 dOi.dDa
534
535
536 d2c-1
537 ------- = 0,
538 dOi.dDa
539
540
541 d2c0
542 ------- = 0,
543 dOi.dDa
544
545
546 d2c1
547 ------- = 0,
548 dOi.dDa
549
550
551 d2c2
552 ------- = 0.
553 dOi.dDa
554
555
556 Oi-Dr partial derivatives
557 =========================
558
559 The equations are::
560
561 d2c-2 d2e
562 ------- = - 3 -------,
563 dOi.dDr dOi.dDr
564
565
566 d2c-1
567 ------- = 0,
568 dOi.dDr
569
570
571 d2c0
572 ------- = 0,
573 dOi.dDr
574
575
576 d2c1
577 ------- = 0,
578 dOi.dDr
579
580
581 d2c2 d2e
582 ------- = 3 -------,
583 dOi.dDr dOi.dDr
584
585 where::
586
587 d2e 1 / / ddx / ddz ddy \ \
588 ------- = ---- | (1 - Dr) | dx**3 --- + dy.dz | dy --- + dz --- | |
589 dOi.dDr R**3 \ \ dOi \ dOi dOi / /
590
591 / ddy / ddz ddx \ \
592 - (1 + Dr) | dy**3 --- + dx.dz | dx --- + dz --- | |
593 \ dOi \ dOi dOi / /
594
595 / ddz / ddy ddx \ \ \
596 + 2Dr | dz**3 --- + dx.dy | dx --- + dy --- | | |
597 \ dOi \ dOi dOi / / /
598
599
600 tm-tm partial derivatives
601 =========================
602
603 The equations are::
604
605 d2c-2
606 ----- = 0,
607 dtm2
608
609
610 d2c-1
611 ----- = 0,
612 dtm2
613
614
615 d2c0
616 ---- = 0,
617 dtm2
618
619
620 d2c1
621 ---- = 0,
622 dtm2
623
624
625 d2c2
626 ---- = 0.
627 dtm2
628
629
630 tm-Da partial derivatives
631 =========================
632
633 The equations are::
634
635 d2c-2
636 ------- = 0,
637 dtm.dDa
638
639
640 d2c-1
641 ------- = 0,
642 dtm.dDa
643
644
645 d2c0
646 ------- = 0,
647 dtm.dDa
648
649
650 d2c1
651 ------- = 0,
652 dtm.dDa
653
654
655 d2c2
656 ------- = 0.
657 dtm.dDa
658
659
660 tm-Dr partial derivatives
661 =========================
662
663 The equations are::
664
665 d2c-2
666 ------- = 0,
667 dtm.dDr
668
669
670 d2c-1
671 ------- = 0,
672 dtm.dDr
673
674
675 d2c0
676 ------- = 0,
677 dtm.dDr
678
679
680 d2c1
681 ------- = 0,
682 dtm.dDr
683
684
685 d2c2
686 ------- = 0.
687 dtm.dDr
688
689
690 Da-Da partial derivatives
691 =========================
692
693 The equations are::
694
695 d2c-2
696 ------ = 0,
697 dDa**2
698
699
700 d2c-1
701 ------ = 0,
702 dDa**2
703
704
705 d2c0
706 ------ = 0,
707 dDa**2
708
709
710 d2c1
711 ------ = 0,
712 dDa**2
713
714
715 d2c2
716 ------ = 0.
717 dDa**2
718
719
720 Da-Dr partial derivatives
721 =========================
722
723 The equations are::
724
725 d2c-2
726 ------- = 0,
727 dDa.dDr
728
729
730 d2c-1
731 ------- = 0,
732 dDa.dDr
733
734
735 d2c0
736 ------- = 0,
737 dDa.dDr
738
739
740 d2c1
741 ------- = 0,
742 dDa.dDr
743
744
745 d2c2
746 ------- = 0.
747 dDa.dDr
748
749
750 Dr-Dr partial derivatives
751 =========================
752
753 The equations are::
754
755 d2c-2 3 d2e
756 ------ = - - ------,
757 dDr**2 4 dDr**2
758
759
760 d2c-1
761 ------ = 0,
762 dDr**2
763
764
765 d2c0
766 ------ = 0,
767 dDr**2
768
769
770 d2c1
771 ------ = 0,
772 dDr**2
773
774
775 d2c2 3 d2e
776 ------ = - ------,
777 dDr**2 4 dDr**2
778
779 where::
780
781 d2e 1 / \
782 ------ = ---- | (6Dr**2 - 9Dr - 1)(dx**4 + 2dy**2.dz**2) + (6Dr**2 + 9Dr - 1)(dy**4 + 2dx**2.dz**2) - 2(6Dr**2 - 1)(ddz*4 + 2dx**2.dy**2) |
783 dDr**2 R**5 \ /
784 """
785
786
787
788
789
790 op_xx = outer(data.ddx_dO, data.ddx_dO)
791 op_yy = outer(data.ddy_dO, data.ddy_dO)
792 op_zz = outer(data.ddz_dO, data.ddz_dO)
793
794 op_xy = outer(data.ddx_dO, data.ddy_dO)
795 op_yx = outer(data.ddy_dO, data.ddx_dO)
796
797 op_xz = outer(data.ddx_dO, data.ddz_dO)
798 op_zx = outer(data.ddz_dO, data.ddx_dO)
799
800 op_yz = outer(data.ddy_dO, data.ddz_dO)
801 op_zy = outer(data.ddz_dO, data.ddy_dO)
802
803
804 x_comp = data.dx * data.d2dx_dO2 + op_xx
805 y_comp = data.dy * data.d2dy_dO2 + op_yy
806 z_comp = data.dz * data.d2dz_dO2 + op_zz
807
808 x3_comp = data.dx_sqrd * (data.dx * data.d2dx_dO2 + 3.0 * op_xx)
809 y3_comp = data.dy_sqrd * (data.dy * data.d2dy_dO2 + 3.0 * op_yy)
810 z3_comp = data.dz_sqrd * (data.dz * data.d2dz_dO2 + 3.0 * op_zz)
811
812 xy_comp = data.dx_sqrd * y_comp + 2.0 * data.dx * data.dy * (op_xy + op_yx) + data.dy_sqrd * x_comp
813 xz_comp = data.dx_sqrd * z_comp + 2.0 * data.dx * data.dz * (op_xz + op_zx) + data.dz_sqrd * x_comp
814 yz_comp = data.dy_sqrd * z_comp + 2.0 * data.dy * data.dz * (op_yz + op_zy) + data.dz_sqrd * y_comp
815
816
817 d2d_dOidOj = 3.0 * (x3_comp + y3_comp + z3_comp)
818
819
820 d2e_dOidOj = data.inv_R * (data.one_3Dr * (x3_comp + yz_comp) + data.one_m3Dr * (y3_comp + xz_comp) - 2.0 * (z3_comp + xy_comp))
821
822
823 data.d2ci[3:, 3:, 0] = d2d_dOidOj - d2e_dOidOj
824
825
826 data.d2ci[3:, 3:, 1] = 6.0 * yz_comp
827
828
829 data.d2ci[3:, 3:, 2] = 6.0 * xz_comp
830
831
832 data.d2ci[3:, 3:, 3] = 6.0 * xy_comp
833
834
835 data.d2ci[3:, 3:, 4] = d2d_dOidOj + d2e_dOidOj
836
837
838
839
840
841
842 d2e_dOidDr = data.inv_R_cubed * (data.one_mDr * data.ci_X - data.one_Dr * data.ci_Y + 2.0 * diff_data.params[2] * data.ci_Z)
843
844
845 data.d2ci[3:, 2, 0] = data.d2ci[2, 3:, 0] = -3.0 * d2e_dOidDr
846
847
848 data.d2ci[3:, 2, 4] = data.d2ci[2, 3:, 4] = 3.0 * d2e_dOidDr
849
850
851
852
853
854
855 d2e1_dDr2 = 6.0 * diff_data.params[2]**2 - 9.0 * diff_data.params[2] - 1.0
856 d2e2_dDr2 = 6.0 * diff_data.params[2]**2 + 9.0 * diff_data.params[2] - 1.0
857 d2e3_dDr2 = 6.0 * diff_data.params[2]**2 - 1.0
858
859
860 d2e_dDr2 = data.inv_R**5 * (d2e1_dDr2 * data.ex + d2e2_dDr2 * data.ey - 2.0 * d2e3_dDr2 * data.ez)
861
862
863 data.d2ci[2, 2, 0] = -0.75 * d2e_dDr2
864
865
866 data.d2ci[2, 2, 4] = 0.75 * d2e_dDr2
867