Package maths_fns :: Module weights
[hide private]
[frames] | no frames]

Source Code for Module maths_fns.weights

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