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 pi 
  24  from numpy import array, float64, zeros 
  25  from unittest import TestCase 
  26   
  27   
  28  import dep_check 
  29  from lib.frame_order.format import print_frame_order_2nd_degree 
  30  from lib.frame_order.free_rotor import compile_2nd_matrix_free_rotor 
  31  from lib.frame_order.iso_cone import compile_2nd_matrix_iso_cone 
  32  from lib.frame_order.iso_cone_free_rotor import compile_2nd_matrix_iso_cone_free_rotor 
  33  from lib.frame_order.iso_cone_torsionless import compile_2nd_matrix_iso_cone_torsionless 
  34  from lib.frame_order.pseudo_ellipse import compile_2nd_matrix_pseudo_ellipse 
  35  from lib.frame_order.pseudo_ellipse_free_rotor import compile_2nd_matrix_pseudo_ellipse_free_rotor 
  36  from lib.frame_order.pseudo_ellipse_torsionless import compile_2nd_matrix_pseudo_ellipse_torsionless 
  37  from lib.frame_order.rotor import compile_2nd_matrix_rotor 
  38  from lib.frame_order.matrix_ops import reduce_alignment_tensor 
  39  from lib.geometry.coord_transform import cartesian_to_spherical, spherical_to_cartesian 
  40  from lib.geometry.rotations import euler_to_R_zyz, two_vect_to_R 
  41  from lib.linear_algebra.kronecker_product import kron_prod, transpose_23 
  42  from lib.order.order_parameters import iso_cone_theta_to_S 
  43  from status import Status; status = Status() 
  44   
  45   
  47      """Unit tests for the lib.frame_order_matrix_ops relax module.""" 
  48   
  49 -    def __init__(self, methodName='runTest'): 
   50          """Skip the tests if scipy is not installed. 
  51   
  52          @keyword methodName:    The name of the test. 
  53          @type methodName:       str 
  54          """ 
  55   
  56           
  57          if not dep_check.scipy_module: 
  58               
  59              status.skipped_tests.append([methodName, 'Scipy', 'unit']) 
  60   
  61           
  62          super(Test_matrix_ops, self).__init__(methodName) 
   63   
  64   
  66          """Initialise a few data structures for the tests.""" 
  67   
  68           
  69          self.f2_temp = zeros((9, 9), float64) 
  70          self.R_temp = zeros((3, 3), float64) 
  71          self.z_axis = array([0, 0, 1], float64) 
  72          self.cone_axis = zeros(3, float64) 
  73   
  74           
  75          self.setup_identity() 
  76   
  77           
  78          self.setup_identity_free_rotor() 
  79   
  80           
  81          self.out_of_frame_alpha = 1.10714871779 
  82          self.out_of_frame_beta = 0.841068670568 
  83          self.out_of_frame_gamma = 5.81953769818 
   84   
  85   
  87          """Calculate the Kronecker product of the eigenframe rotation for the z-axis based frame.""" 
  88   
  89           
  90          spherical_to_cartesian([1.0, axis_theta, axis_phi], self.cone_axis) 
  91   
  92           
  93          two_vect_to_R(self.z_axis, self.cone_axis, self.R_temp) 
  94   
  95           
  96          return kron_prod(self.R_temp, self.R_temp) 
   97   
  98   
 100          """Calculate the Kronecker product of the eigenframe rotation for the full eigenframe.""" 
 101   
 102           
 103          euler_to_R_zyz(eigen_alpha, eigen_beta, eigen_gamma, self.R_temp) 
 104   
 105           
 106          return kron_prod(self.R_temp, self.R_temp) 
  107   
 108   
 110          """Set up a few identity matrices.""" 
 111   
 112           
 113          self.I_order = zeros((9, 9), float64) 
 114          for i in range(9): 
 115              self.I_order[i, i] = 1.0 
 116   
 117           
 118          data = [[0, 0, 1.0/3.0], 
 119                  [4, 4, 1.0/3.0], 
 120                  [8, 8, 1.0/3.0], 
 121                  [0, 4, 1.0/3.0], 
 122                  [4, 0, 1.0/3.0], 
 123                  [0, 8, 1.0/3.0], 
 124                  [8, 0, 1.0/3.0], 
 125                  [4, 8, 1.0/3.0], 
 126                  [8, 4, 1.0/3.0]] 
 127          self.I_disorder = zeros((9, 9), float64) 
 128          for i, j, val in data: 
 129              self.I_disorder[i, j] = val 
 130   
 131           
 132          data = [[0, 0, 1.0/3.0], 
 133                  [4, 4, 1.0/3.0], 
 134                  [8, 8, 1.0/3.0], 
 135                  [0, 4, 1.0/3.0], 
 136                  [4, 0, 1.0/3.0], 
 137                  [0, 8, 1.0/3.0], 
 138                  [8, 0, 1.0/3.0], 
 139                  [4, 8, 1.0/3.0], 
 140                  [8, 4, 1.0/3.0], 
 141                  [1, 3, -0.25], 
 142                  [3, 1, -0.25], 
 143                  [1, 1, 0.25], 
 144                  [3, 3, 0.25]] 
 145          self.f2_half_cone = zeros((9, 9), float64) 
 146          for i, j, val in data: 
 147              self.f2_half_cone[i, j] = val 
 148   
 149           
 150          data = [[0, 0, 1.0/3.0], 
 151                  [4, 4, 1.0/3.0], 
 152                  [8, 8, 1.0/3.0], 
 153                  [0, 4, 1.0/3.0], 
 154                  [4, 0, 1.0/3.0], 
 155                  [0, 8, 1.0/3.0], 
 156                  [8, 0, 1.0/3.0], 
 157                  [4, 8, 1.0/3.0], 
 158                  [8, 4, 1.0/3.0], 
 159                  [5, 7, -0.25], 
 160                  [7, 5, -0.25], 
 161                  [7, 7, 0.25], 
 162                  [5, 5, 0.25]] 
 163          self.f2_half_cone_90_y = zeros((9, 9), float64) 
 164          for i, j, val in data: 
 165              self.f2_half_cone_90_y[i, j] = val 
  166   
 167   
 169          """Set up a few identity matrices.""" 
 170   
 171           
 172          data = [[0, 0,  0.5], 
 173                  [1, 1,  0.5], 
 174                  [3, 3,  0.5], 
 175                  [4, 4,  0.5], 
 176                  [0, 4,  0.5], 
 177                  [4, 0,  0.5], 
 178                  [1, 3, -0.5], 
 179                  [3, 1, -0.5], 
 180                  [8, 8,  1.0]] 
 181          self.I_order_free_rotor = zeros((9, 9), float64) 
 182          for i, j, val in data: 
 183              self.I_order_free_rotor[i, j] = val 
 184   
 185           
 186          data = [[0, 0,  0.25], 
 187                  [1, 1,  0.125], 
 188                  [3, 3,  0.125], 
 189                  [4, 4,  0.25], 
 190                  [0, 4,  0.25], 
 191                  [4, 0,  0.25], 
 192                  [1, 3, -0.125], 
 193                  [3, 1, -0.125], 
 194                  [0, 8,  0.5], 
 195                  [8, 0,  0.5], 
 196                  [4, 8,  0.5], 
 197                  [8, 4,  0.5]] 
 198          self.I_disorder_free_rotor = zeros((9, 9), float64) 
 199          for i, j, val in data: 
 200              self.I_disorder_free_rotor[i, j] = val 
  201   
 202   
 204          """Check the operation of the compile_2nd_matrix_free_rotor() function.""" 
 205   
 206           
 207          real = array( 
 208                      [[    0.5001,    0.0001,         0,    0.0001,    0.4999,         0,         0,         0,         0], 
 209                       [   -0.0001,    0.5001,         0,   -0.4999,    0.0001,         0,         0,         0,         0], 
 210                       [         0,         0,    0.0006,         0,         0,   -0.0005,         0,         0,         0], 
 211                       [   -0.0001,   -0.4999,         0,    0.5001,    0.0001,         0,         0,         0,         0], 
 212                       [    0.4999,   -0.0001,         0,   -0.0001,    0.5001,         0,         0,         0,         0], 
 213                       [         0,         0,    0.0005,         0,         0,    0.0006,         0,         0,         0], 
 214                       [         0,         0,         0,         0,         0,         0,    0.0006,   -0.0005,         0], 
 215                       [         0,         0,         0,         0,         0,         0,    0.0005,    0.0006,         0], 
 216                       [         0,         0,         0,         0,         0,         0,         0,         0,    1.0000]]) 
 217   
 218           
 219          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 220   
 221           
 222          f2 = compile_2nd_matrix_free_rotor(self.f2_temp, Rx2_eigen) 
 223   
 224           
 225          print_frame_order_2nd_degree(real, "real") 
 226          print_frame_order_2nd_degree(f2, "calculated") 
 227          print_frame_order_2nd_degree(real-f2, "difference") 
 228   
 229           
 230          for i in range(9): 
 231              for j in range(9): 
 232                  print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) 
 233                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
  234   
 235   
 237          """Check the operation of the compile_2nd_matrix_free_rotor() function.""" 
 238   
 239           
 240          real = array( 
 241                      [[    0.3367,   -0.0100,   -0.0307,   -0.0100,    0.3521,   -0.0152,   -0.0307,   -0.0152,    0.3112], 
 242                       [   -0.0104,    0.3520,   -0.0152,   -0.2908,   -0.0559,    0.2602,    0.1989,   -0.1685,    0.0664], 
 243                       [   -0.0306,   -0.0155,    0.3112,    0.1991,   -0.1683,    0.0666,    0.2399,    0.2092,    0.1989], 
 244                       [   -0.0104,   -0.2908,    0.1989,    0.3520,   -0.0559,   -0.1685,   -0.0152,    0.2602,    0.0664], 
 245                       [    0.3520,   -0.0563,   -0.1684,   -0.0563,    0.4362,   -0.0841,   -0.1684,   -0.0841,    0.2118], 
 246                       [   -0.0153,    0.2602,    0.0661,   -0.1684,   -0.0844,    0.2117,    0.2093,   -0.0740,    0.0997], 
 247                       [   -0.0306,    0.1991,    0.2399,   -0.0155,   -0.1683,    0.2092,    0.3112,    0.0666,    0.1989], 
 248                       [   -0.0153,   -0.1684,    0.2093,    0.2602,   -0.0844,   -0.0740,    0.0661,    0.2117,    0.0997], 
 249                       [    0.3113,    0.0663,    0.1991,    0.0663,    0.2117,    0.0993,    0.1991,    0.0993,    0.4770]]) 
 250   
 251           
 252          r, theta, phi = cartesian_to_spherical([2, 1, 3]) 
 253   
 254           
 255          Rx2_eigen = self.calc_Rx2_eigen_axis(theta, phi) 
 256   
 257           
 258          f2 = compile_2nd_matrix_free_rotor(self.f2_temp, Rx2_eigen) 
 259   
 260           
 261          print_frame_order_2nd_degree(real, "real") 
 262          print_frame_order_2nd_degree(f2, "calculated") 
 263          print_frame_order_2nd_degree(real-f2, "difference") 
 264   
 265           
 266          for i in range(9): 
 267              for j in range(9): 
 268                  print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) 
 269                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
  270   
 271   
 273          """Check if compile_2nd_matrix_iso_cone() can return the identity matrix for disorder.""" 
 274   
 275           
 276          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 277   
 278           
 279          f2 = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen, pi, pi) 
 280   
 281           
 282          print_frame_order_2nd_degree(self.I_disorder, "Identity for disorder") 
 283          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 284   
 285           
 286          for i in range(9): 
 287              for j in range(9): 
 288                  print("Element %s, %s." % (i, j)) 
 289                  self.assertAlmostEqual(f2[i, j], self.I_disorder[i, j]) 
  290   
 291   
 293          """Check if compile_2nd_matrix_iso_cone() can return the matrix for a half cone.""" 
 294   
 295           
 296          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 297   
 298           
 299          f2 = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen, pi/2.0, pi) 
 300   
 301           
 302          print_frame_order_2nd_degree(self.f2_half_cone, "The half cone frame order matrix") 
 303          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 304   
 305           
 306          for i in range(9): 
 307              for j in range(9): 
 308                  print("Element %s, %s." % (i, j)) 
 309                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone[i, j]) 
  310   
 311   
 313          """Check if compile_2nd_matrix_iso_cone() can return the matrix for a half cone rotated 90 degrees about y.""" 
 314   
 315           
 316          Rx2_eigen = self.calc_Rx2_eigen_axis(pi/2.0, 0.0) 
 317   
 318           
 319          f2 = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen, pi/2.0, pi) 
 320   
 321           
 322          print_frame_order_2nd_degree(self.f2_half_cone_90_y, "The half cone frame order matrix") 
 323          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 324   
 325           
 326          for i in range(9): 
 327              for j in range(9): 
 328                  print("Element %s, %s." % (i, j)) 
 329                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone_90_y[i, j]) 
  330   
 331   
 333          """Check if compile_2nd_matrix_iso_cone() can return the identity matrix for order.""" 
 334   
 335           
 336          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 337   
 338           
 339          f2 = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen, 1e-5, 1e-10) 
 340   
 341           
 342          print_frame_order_2nd_degree(self.I_order, "Identity for order") 
 343          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 344   
 345           
 346          for i in range(9): 
 347              for j in range(9): 
 348                  print("Element %s, %s." % (i, j)) 
 349                  self.assertAlmostEqual(f2[i, j], self.I_order[i, j]) 
  350   
 351   
 353          """2nd check if compile_2nd_matrix_iso_cone() can return the identity matrix for order.""" 
 354   
 355           
 356          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 357   
 358           
 359          f2 = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen, 0.0, 0.0) 
 360   
 361           
 362          print_frame_order_2nd_degree(self.I_order, "Identity for order") 
 363          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 364   
 365           
 366          for i in range(9): 
 367              for j in range(9): 
 368                  print("Element %s, %s." % (i, j)) 
 369                  self.assertAlmostEqual(f2[i, j], self.I_order[i, j]) 
  370   
 371   
 373          """Check if compile_2nd_matrix_iso_cone() can approximate compile_2nd_matrix_iso_cone_free_rotor().""" 
 374   
 375           
 376          Rx2_eigen_a = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 377          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 378   
 379           
 380          f2a = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen_a, pi/4.6, pi) 
 381          f2b = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen_b, iso_cone_theta_to_S(pi/4.6)) 
 382   
 383           
 384          print_frame_order_2nd_degree(f2a, "Isotropic cone frame order") 
 385          print_frame_order_2nd_degree(f2b, "Free rotor isotropic cone frame order") 
 386          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 387   
 388           
 389          for i in range(9): 
 390              for j in range(9): 
 391                  print("Element %s, %s." % (i, j)) 
 392                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  393   
 394   
 396          """Check if compile_2nd_matrix_iso_cone() can approximate compile_2nd_matrix_iso_cone_torsionless().""" 
 397   
 398           
 399          Rx2_eigen_a = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 400          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 401   
 402           
 403          f2a = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen_a, pi/4.6, 0) 
 404          f2b = compile_2nd_matrix_iso_cone_torsionless(self.f2_temp, Rx2_eigen_b, pi/4.6) 
 405   
 406           
 407          print_frame_order_2nd_degree(f2a, "Isotropic cone frame order") 
 408          print_frame_order_2nd_degree(f2b, "Torsionless isotropic cone frame order") 
 409          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 410   
 411           
 412          for i in range(9): 
 413              for j in range(9): 
 414                  print("Element %s, %s." % (i, j)) 
 415                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  416   
 417   
 419          """Check if compile_2nd_matrix_iso_cone_free_rotor() can return the identity matrix for disorder.""" 
 420   
 421           
 422          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 423   
 424           
 425          f2 = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen, 0.0) 
 426   
 427           
 428          f2_ref = self.f2_half_cone 
 429   
 430           
 431          print_frame_order_2nd_degree(self.I_disorder, "Identity for disorder") 
 432          print_frame_order_2nd_degree(f2_ref, "The half cone frame order matrix") 
 433          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 434   
 435           
 436          for i in range(9): 
 437              for j in range(9): 
 438                  print("Element %s, %s." % (i, j)) 
 439                  self.assertAlmostEqual(f2[i, j], f2_ref[i, j]) 
  440   
 441   
 443          """Check if compile_2nd_matrix_iso_cone() can return the matrix for a half cone.""" 
 444   
 445           
 446          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 447   
 448           
 449          f2 = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen, 0.0) 
 450   
 451           
 452          print_frame_order_2nd_degree(self.f2_half_cone, "The half cone frame order matrix") 
 453          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 454   
 455           
 456          for i in range(9): 
 457              for j in range(9): 
 458                  print("Element %s, %s." % (i, j)) 
 459                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone[i, j]) 
  460   
 461   
 463          """Check if compile_2nd_matrix_iso_cone() can return the matrix for a half cone rotated 90 degrees about y.""" 
 464   
 465           
 466          self.z_axis = array([1, 0, 0], float64) 
 467   
 468           
 469          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 470   
 471           
 472          f2 = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen, 0.0) 
 473   
 474           
 475          print_frame_order_2nd_degree(self.f2_half_cone_90_y, "The half cone frame order matrix") 
 476          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 477   
 478           
 479          for i in range(9): 
 480              for j in range(9): 
 481                  print("Element %s, %s." % (i, j)) 
 482                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone_90_y[i, j]) 
  483   
 484   
 486          """Check if compile_2nd_matrix_iso_cone_free_rotor() can return the identity matrix for order.""" 
 487   
 488           
 489          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 490   
 491           
 492          f2 = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen, 1.0) 
 493   
 494           
 495          print_frame_order_2nd_degree(self.I_order_free_rotor, "Free rotor identity for order") 
 496          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 497   
 498           
 499          for i in range(9): 
 500              for j in range(9): 
 501                  print("Element %s, %s." % (i, j)) 
 502                  self.assertAlmostEqual(f2[i, j], self.I_order_free_rotor[i, j]) 
  503   
 504   
 506          """Check the operation of the compile_2nd_matrix_pseudo_ellipse() function.""" 
 507   
 508           
 509          real = array( 
 510                      [[    0.7901,         0,         0,         0,    0.7118,         0,         0,         0,    0.6851], 
 511                       [         0,    0.0816,         0,   -0.0606,         0,         0,         0,         0,         0], 
 512                       [         0,         0,    0.1282,         0,         0,         0,   -0.1224,         0,         0], 
 513                       [         0,   -0.0606,         0,    0.0708,         0,         0,         0,         0,         0], 
 514                       [    0.7118,         0,         0,         0,    0.6756,         0,         0,         0,    0.6429], 
 515                       [         0,         0,         0,         0,         0,    0.2536,         0,   -0.2421,         0], 
 516                       [         0,         0,   -0.1224,         0,         0,         0,    0.1391,         0,         0], 
 517                       [         0,         0,         0,         0,         0,   -0.2421,         0,    0.2427,         0], 
 518                       [    0.6851,         0,         0,         0,    0.6429,         0,         0,         0,    0.6182]], float64) 
 519          transpose_23(real) 
 520   
 521           
 522          x = pi/4.0 
 523          y = 3.0*pi/8.0 
 524          z = pi/6.0 
 525   
 526           
 527          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 528   
 529           
 530          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, x, y, z) 
 531   
 532           
 533          print_frame_order_2nd_degree(real, "real") 
 534          print_frame_order_2nd_degree(f2, "calculated") 
 535          print_frame_order_2nd_degree(real-f2, "difference") 
 536   
 537           
 538          for i in range(9): 
 539              for j in range(9): 
 540                  print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) 
 541                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-4) 
  542   
 543   
 545          """Check the operation of the compile_2nd_matrix_pseudo_ellipse() function.""" 
 546   
 547           
 548          real = array( 
 549                      [[    0.7379,         0,         0,         0,    0.1338,         0,         0,         0,    0.1284], 
 550                       [         0,    0.6637,         0,   -0.1085,         0,         0,         0,         0,         0], 
 551                       [         0,         0,    0.6603,         0,         0,         0,   -0.1181,         0,         0], 
 552                       [         0,   -0.1085,         0,    0.6637,         0,         0,         0,         0,         0], 
 553                       [    0.1154,         0,         0,         0,    0.6309,         0,         0,         0,    0.2536], 
 554                       [         0,         0,         0,         0,         0,    0.6196,         0,   -0.2336,         0], 
 555                       [         0,         0,   -0.1181,         0,         0,         0,    0.6603,         0,         0], 
 556                       [         0,         0,         0,         0,         0,   -0.2336,         0,    0.6196,         0], 
 557                       [    0.1467,         0,         0,         0,    0.2353,         0,         0,         0,    0.6180]], float64) 
 558   
 559           
 560          x = pi/4.0 
 561          y = 3.0*pi/8.0 
 562          z = 40.0 / 360.0 * 2.0 * pi 
 563   
 564           
 565          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 566   
 567           
 568          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, x, y, z) 
 569   
 570           
 571          print_frame_order_2nd_degree(real, "real") 
 572          print_frame_order_2nd_degree(f2, "calculated") 
 573          print_frame_order_2nd_degree(real-f2, "difference") 
 574   
 575           
 576          for i in range(9): 
 577              for j in range(9): 
 578                  print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) 
 579                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
  580   
 581   
 583          """Check the operation of the compile_2nd_matrix_pseudo_ellipse() function.""" 
 584   
 585           
 586          real = array( 
 587                      [[    0.6314,    0.0232,   -0.0344,    0.0232,    0.1558,   -0.0222,   -0.0344,   -0.0222,    0.2128], 
 588                       [    0.0220,    0.6366,    0.0069,   -0.1352,    0.0243,   -0.0722,    0.0206,   -0.0277,   -0.0464], 
 589                       [   -0.0332,    0.0097,    0.6137,    0.0222,    0.0668,    0.0173,   -0.1967,    0.0489,   -0.0336], 
 590                       [    0.0220,   -0.1352,    0.0206,    0.6366,    0.0243,   -0.0277,    0.0069,   -0.0722,   -0.0464], 
 591                       [    0.1554,    0.0233,    0.0669,    0.0233,    0.6775,    0.0113,    0.0669,    0.0113,    0.1671], 
 592                       [   -0.0222,   -0.0738,    0.0188,   -0.0286,    0.0113,    0.6310,    0.0507,   -0.1502,    0.0109], 
 593                       [   -0.0332,    0.0222,   -0.1967,    0.0097,    0.0668,    0.0489,    0.6137,    0.0173,   -0.0336], 
 594                       [   -0.0222,   -0.0286,    0.0507,   -0.0738,    0.0113,   -0.1502,    0.0188,    0.6310,    0.0109], 
 595                       [    0.2132,   -0.0465,   -0.0324,   -0.0465,    0.1667,    0.0110,   -0.0324,    0.0110,    0.6201]], float64) 
 596   
 597           
 598          x = 60.0 / 360.0 * 2.0 * pi 
 599          y = 3.0 * pi / 8.0 
 600          z = pi / 6.0 
 601   
 602           
 603          Rx2_eigen = self.calc_Rx2_eigen_full(self.out_of_frame_alpha, self.out_of_frame_beta, self.out_of_frame_gamma) 
 604   
 605           
 606          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, x, y, z) 
 607   
 608           
 609          print_frame_order_2nd_degree(real, "real") 
 610          print_frame_order_2nd_degree(f2, "calculated") 
 611          print_frame_order_2nd_degree(real-f2, "difference") 
 612   
 613           
 614          for i in range(9): 
 615              for j in range(9): 
 616                  print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) 
 617                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
  618   
 619   
 621          """Check if compile_2nd_matrix_pseudo_ellipse() can return the identity matrix for disorder.""" 
 622   
 623           
 624          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 625   
 626           
 627          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, pi, pi, pi) 
 628   
 629           
 630          print_frame_order_2nd_degree(self.I_disorder, "Identity for disorder") 
 631          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 632   
 633           
 634          for i in range(9): 
 635              for j in range(9): 
 636                  print("Element %s, %s." % (i, j)) 
 637                  self.assertAlmostEqual(f2[i, j], self.I_disorder[i, j]) 
  638   
 639   
 641          """Check if compile_2nd_matrix_pseudo_ellipse() can return the matrix for a half cone.""" 
 642   
 643           
 644          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 645   
 646           
 647          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, pi/2.0, pi/2.0, pi) 
 648   
 649           
 650          print_frame_order_2nd_degree(self.f2_half_cone, "The half cone frame order matrix") 
 651          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 652   
 653           
 654          for i in range(9): 
 655              for j in range(9): 
 656                  print("Element %s, %s." % (i, j)) 
 657                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone[i, j]) 
  658   
 659   
 661          """Check if compile_2nd_matrix_pseudo_ellipse() can return the matrix for a half cone rotated 90 degrees about y.""" 
 662   
 663           
 664          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, pi/2.0, 0.0) 
 665   
 666           
 667          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, pi/2.0, pi/2.0, pi) 
 668   
 669           
 670          print_frame_order_2nd_degree(self.f2_half_cone_90_y, "The half cone frame order matrix") 
 671          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 672   
 673           
 674          for i in range(9): 
 675              for j in range(9): 
 676                  print("Element %s, %s." % (i, j)) 
 677                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone_90_y[i, j]) 
  678   
 679   
 681          """Check if compile_2nd_matrix_pseudo_ellipse() can return the identity matrix for order.""" 
 682   
 683           
 684          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 685   
 686           
 687          f2 = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen, 1e-2, 1e-2, 1e-10) 
 688   
 689           
 690          print_frame_order_2nd_degree(self.I_order, "Identity for order") 
 691          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 692          print_frame_order_2nd_degree(f2-self.I_order, "difference") 
 693   
 694           
 695          for i in range(9): 
 696              for j in range(9): 
 697                  print("Element %s, %s." % (i, j)) 
 698                  self.assertAlmostEqual(f2[i, j], self.I_order[i, j], 4) 
  699   
 700   
 702          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate compile_2nd_matrix_pseudo_ellipse_free_rotor().""" 
 703   
 704           
 705          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 706          Rx2_eigen_b = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 707   
 708           
 709          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/1.6, pi/5.8, pi) 
 710          f2b = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen_b, pi/1.6, pi/5.8) 
 711   
 712           
 713          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 714          print_frame_order_2nd_degree(f2b, "Free rotor pseudo-ellipse frame order") 
 715          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 716   
 717           
 718          for i in range(9): 
 719              for j in range(9): 
 720                  print("Element %s, %s." % (i, j)) 
 721                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  722   
 723   
 725          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate a pi/2 rotated compile_2nd_matrix_pseudo_ellipse_free_rotor().""" 
 726   
 727           
 728          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 729          Rx2_eigen_b = self.calc_Rx2_eigen_full(pi/2, 0.0, 0.0) 
 730   
 731           
 732          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/1.6, pi/5.8, pi) 
 733          f2b = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen_b, pi/5.8, pi/1.6) 
 734   
 735           
 736          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 737          print_frame_order_2nd_degree(f2b, "pi/2 rotated free rotor pseudo-ellipse frame order") 
 738          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 739   
 740           
 741          for i in range(9): 
 742              for j in range(9): 
 743                  print("Element %s, %s." % (i, j)) 
 744                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  745   
 746   
 748          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate compile_2nd_matrix_pseudo_ellipse_torsionless().""" 
 749   
 750           
 751          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 752          Rx2_eigen_b = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 753   
 754           
 755          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/2.1, pi/4.6, 0) 
 756          f2b = compile_2nd_matrix_pseudo_ellipse_torsionless(self.f2_temp, Rx2_eigen_b, pi/2.1, pi/4.6) 
 757   
 758           
 759          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 760          print_frame_order_2nd_degree(f2b, "Torsionless pseudo-ellipse frame order") 
 761          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 762   
 763           
 764          for i in range(9): 
 765              for j in range(9): 
 766                  print("Element %s, %s; diff %s." % (i, j, f2b[i, j] - f2a[i, j])) 
 767                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  768   
 769   
 771          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate compile_2nd_matrix_iso_cone().""" 
 772   
 773           
 774          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 775          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 776   
 777           
 778          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/4.6, pi/4.6, 0.2) 
 779          f2b = compile_2nd_matrix_iso_cone(self.f2_temp, Rx2_eigen_b, pi/4.6, 0.2) 
 780   
 781           
 782          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 783          print_frame_order_2nd_degree(f2b, "Isotropic cone frame order") 
 784          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 785   
 786           
 787          for i in range(9): 
 788              for j in range(9): 
 789                  print("Element %s, %s." % (i, j)) 
 790                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  791   
 792   
 794          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate compile_2nd_matrix_iso_cone_free_rotor().""" 
 795   
 796           
 797          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 798          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 799   
 800           
 801          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/4.6, pi/4.6, pi) 
 802          f2b = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen_b, iso_cone_theta_to_S(pi/4.6)) 
 803   
 804           
 805          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 806          print_frame_order_2nd_degree(f2b, "Free rotor isotropic cone frame order") 
 807          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 808   
 809           
 810          for i in range(9): 
 811              for j in range(9): 
 812                  print("Element %s, %s." % (i, j)) 
 813                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  814   
 815   
 817          """Check if compile_2nd_matrix_pseudo_ellipse() can approximate compile_2nd_matrix_iso_cone_torsionless().""" 
 818   
 819           
 820          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 821          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 0.0) 
 822   
 823           
 824          f2a = compile_2nd_matrix_pseudo_ellipse(self.f2_temp, Rx2_eigen_a, pi/8.6, pi/8.6, 0) 
 825          f2b = compile_2nd_matrix_iso_cone_torsionless(self.f2_temp, Rx2_eigen_b, pi/8.6) 
 826   
 827           
 828          print_frame_order_2nd_degree(f2a, "Pseudo-ellipse frame order") 
 829          print_frame_order_2nd_degree(f2b, "Torsionless isotropic cone frame order") 
 830          print_frame_order_2nd_degree(f2b-f2a, "difference") 
 831   
 832           
 833          for i in range(9): 
 834              for j in range(9): 
 835                  print("Element %s, %s." % (i, j)) 
 836                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
  837   
 838   
 840          """Check if compile_2nd_matrix_pseudo_ellipse_free_rotor() can return the identity matrix for disorder.""" 
 841   
 842           
 843          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 844   
 845           
 846          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, pi, pi) 
 847   
 848           
 849          print_frame_order_2nd_degree(self.I_disorder, "Identity for disorder") 
 850          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 851   
 852           
 853          for i in range(9): 
 854              for j in range(9): 
 855                  print("Element %s, %s." % (i, j)) 
 856                  self.assertAlmostEqual(f2[i, j], self.I_disorder[i, j]) 
  857   
 858   
 860          """Check if compile_2nd_matrix_pseudo_ellipse() can return the matrix for a half cone.""" 
 861   
 862           
 863          Rx2_eigen = self.calc_Rx2_eigen_full(pi, 0.0, pi) 
 864   
 865           
 866          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, pi/2.0, pi/2.0) 
 867   
 868           
 869          print_frame_order_2nd_degree(self.f2_half_cone, "The half cone frame order matrix") 
 870          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 871   
 872           
 873          for i in range(9): 
 874              for j in range(9): 
 875                  print("Element %s, %s." % (i, j)) 
 876                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone[i, j]) 
  877   
 878   
 880          """Check if compile_2nd_matrix_pseudo_ellipse() can return the matrix for a half cone rotated 90 degrees about y.""" 
 881   
 882           
 883          Rx2_eigen = self.calc_Rx2_eigen_full(pi, pi/2.0, pi) 
 884   
 885           
 886          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, pi/2.0, pi/2.0) 
 887   
 888           
 889          print_frame_order_2nd_degree(self.f2_half_cone_90_y, "The half cone frame order matrix") 
 890          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 891   
 892           
 893          for i in range(9): 
 894              for j in range(9): 
 895                  print("Element %s, %s." % (i, j)) 
 896                  self.assertAlmostEqual(f2[i, j], self.f2_half_cone_90_y[i, j]) 
  897   
 898   
 900          """Check if compile_2nd_matrix_pseudo_ellipse_free_rotor() can return the identity matrix for order.""" 
 901   
 902           
 903          Rx2_eigen = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 904   
 905           
 906          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, 1e-10, 1e-10) 
 907   
 908           
 909          print_frame_order_2nd_degree(self.I_order_free_rotor, "Free rotor identity for order") 
 910          print_frame_order_2nd_degree(f2, "Compiled frame order") 
 911   
 912           
 913          for i in range(9): 
 914              for j in range(9): 
 915                  print("Element %s, %s." % (i, j)) 
 916                  self.assertAlmostEqual(f2[i, j], self.I_order_free_rotor[i, j]) 
  917   
 918   
 920          """Check the operation of the compile_2nd_matrix_pseudo_ellipse_free_rotor() function.""" 
 921   
 922           
 923          real = array( 
 924                      [[    0.3428,   -0.0193,    0.0389,   -0.0193,    0.3137,   -0.0194,    0.0389,   -0.0194,    0.3435], 
 925                       [   -0.0225,    0.2313,    0.0034,   -0.1413,    0.0449,    0.2309,   -0.1830,   -0.1412,   -0.0224], 
 926                       [    0.0417,    0.0091,    0.2142,   -0.1767,   -0.0838,    0.0092,    0.1211,   -0.1770,    0.0421], 
 927                       [   -0.0225,   -0.1413,   -0.1830,    0.2313,    0.0449,   -0.1412,    0.0034,    0.2309,   -0.0224], 
 928                       [    0.3124,    0.0418,   -0.0840,    0.0418,    0.3758,    0.0418,   -0.0840,    0.0418,    0.3118], 
 929                       [   -0.0193,    0.2251,    0.0151,   -0.1476,    0.0389,    0.2251,   -0.1706,   -0.1468,   -0.0196], 
 930                       [    0.0417,   -0.1767,    0.1211,    0.0091,   -0.0838,   -0.1770,    0.2142,    0.0092,    0.0421], 
 931                       [   -0.0193,   -0.1476,   -0.1706,    0.2251,    0.0389,   -0.1468,    0.0151,    0.2251,   -0.0196], 
 932                       [    0.3448,   -0.0225,    0.0450,   -0.0225,    0.3104,   -0.0224,    0.0450,   -0.0224,    0.3447]], float64) 
 933   
 934           
 935          x = pi/4.0 
 936          y = 50.0 / 360.0 * 2.0 * pi 
 937   
 938           
 939          Rx2_eigen = self.calc_Rx2_eigen_full(self.out_of_frame_alpha, self.out_of_frame_beta, self.out_of_frame_gamma) 
 940   
 941           
 942          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, x, y) 
 943   
 944           
 945          print_frame_order_2nd_degree(real, "real") 
 946          print_frame_order_2nd_degree(f2, "calculated") 
 947          print_frame_order_2nd_degree(real-f2, "difference") 
 948   
 949           
 950          for i in range(9): 
 951              for j in range(9): 
 952                  print("Element %s, %s." % (i, j)) 
 953                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
  954   
 955   
 957          """Check the operation of the compile_2nd_matrix_pseudo_ellipse_free_rotor() function.""" 
 958   
 959           
 960          real = array( 
 961                      [[    0.3251,    0.0163,   -0.0324,    0.0163,    0.3493,    0.0164,   -0.0324,    0.0164,    0.3256], 
 962                       [   -0.0248,    0.1481,   -0.0480,   -0.0500,    0.0492,    0.1475,   -0.1472,   -0.0500,   -0.0244], 
 963                       [    0.0079,    0.0328,    0.0572,   -0.0661,   -0.0163,    0.0331,    0.0074,   -0.0662,    0.0084], 
 964                       [   -0.0248,   -0.0500,   -0.1472,    0.1481,    0.0492,   -0.0500,   -0.0480,    0.1475,   -0.0244], 
 965                       [    0.3289,    0.0081,   -0.0167,    0.0081,    0.3426,    0.0080,   -0.0167,    0.0080,    0.3285], 
 966                       [    0.0163,    0.0669,    0.1139,   -0.1322,   -0.0324,    0.0662,    0.0157,   -0.1307,    0.0161], 
 967                       [    0.0079,   -0.0661,    0.0074,    0.0328,   -0.0163,   -0.0662,    0.0572,    0.0331,    0.0084], 
 968                       [    0.0163,   -0.1322,    0.0157,    0.0669,   -0.0324,   -0.1307,    0.1139,    0.0662,    0.0161], 
 969                       [    0.3459,   -0.0245,    0.0491,   -0.0245,    0.3081,   -0.0244,    0.0491,   -0.0244,    0.3460]], float64) 
 970   
 971           
 972          x = pi / 4.0 
 973          y = 150.0 / 360.0 * 2.0 * pi 
 974   
 975           
 976          Rx2_eigen = self.calc_Rx2_eigen_full(self.out_of_frame_alpha, self.out_of_frame_beta, self.out_of_frame_gamma) 
 977   
 978           
 979          f2 = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen, x, y) 
 980   
 981           
 982          print_frame_order_2nd_degree(real, "real") 
 983          print_frame_order_2nd_degree(f2, "calculated") 
 984          print_frame_order_2nd_degree(real-f2, "difference") 
 985   
 986           
 987          for i in range(9): 
 988              for j in range(9): 
 989                  print("Element %s, %s." % (i, j)) 
 990                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-2) 
  991   
 992   
 994          """Check if compile_2nd_matrix_pseudo_ellipse_free_rotor() can approximate compile_2nd_matrix_iso_cone_free_rotor().""" 
 995   
 996           
 997          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
 998          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 1.0) 
 999   
1000           
1001          f2a = compile_2nd_matrix_pseudo_ellipse_free_rotor(self.f2_temp, Rx2_eigen_a, pi/4.6, pi/4.6) 
1002          f2b = compile_2nd_matrix_iso_cone_free_rotor(self.f2_temp, Rx2_eigen_b, iso_cone_theta_to_S(pi/4.6)) 
1003   
1004           
1005          print_frame_order_2nd_degree(f2a, "Free rotor pseudo-ellipse frame order") 
1006          print_frame_order_2nd_degree(f2b, "Free rotor isotropic cone frame order") 
1007          print_frame_order_2nd_degree(f2b-f2a, "difference") 
1008   
1009           
1010          for i in range(9): 
1011              for j in range(9): 
1012                  print("Element %s, %s." % (i, j)) 
1013                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
 1014   
1015   
1017          """Check if compile_2nd_matrix_pseudo_ellipse_torsionless() can approximate compile_2nd_matrix_iso_cone_torsionless().""" 
1018   
1019           
1020          Rx2_eigen_a = self.calc_Rx2_eigen_full(0.0, 0.0, 0.0) 
1021          Rx2_eigen_b = self.calc_Rx2_eigen_axis(0.0, 0.0) 
1022   
1023           
1024          f2a = compile_2nd_matrix_pseudo_ellipse_torsionless(self.f2_temp, Rx2_eigen_a, pi/4.6, pi/4.6) 
1025          f2b = compile_2nd_matrix_iso_cone_torsionless(self.f2_temp, Rx2_eigen_b, pi/4.6) 
1026   
1027           
1028          print_frame_order_2nd_degree(f2a, "Torsionless pseudo-ellipse frame order") 
1029          print_frame_order_2nd_degree(f2b, "Torsionless isotropic cone frame order") 
1030          print_frame_order_2nd_degree(f2b-f2a, "difference") 
1031   
1032           
1033          for i in range(9): 
1034              for j in range(9): 
1035                  print("Element %s, %s." % (i, j)) 
1036                  self.assertAlmostEqual(f2a[i, j], f2b[i, j]) 
 1037   
1038   
1040          """Check the operation of the compile_2nd_matrix_rotor() function.""" 
1041   
1042           
1043          real = array( 
1044                      [[  7.06775425e-01,  1.36710179e-04,  0.00000000e+00,  1.36710179e-04, 2.93224575e-01,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1045                       [ -1.36710179e-04,  7.06775425e-01,  0.00000000e+00, -2.93224575e-01, 1.36710179e-04,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1046                       [  0.00000000e+00,  0.00000000e+00,  8.27014112e-01,  0.00000000e+00, 0.00000000e+00,  2.19539417e-04,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1047                       [ -1.36710179e-04, -2.93224575e-01,  0.00000000e+00,  7.06775425e-01, 1.36710179e-04,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1048                       [  2.93224575e-01, -1.36710179e-04,  0.00000000e+00, -1.36710179e-04, 7.06775425e-01,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1049                       [  0.00000000e+00,  0.00000000e+00, -2.19539417e-04,  0.00000000e+00, 0.00000000e+00,  8.27014112e-01,  0.00000000e+00, 0.00000000e+00, 0.00000000e+00], 
1050                       [  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00,  0.00000000e+00,  8.27014112e-01, 2.19539417e-04, 0.00000000e+00], 
1051                       [  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00,  0.00000000e+00, -2.19539417e-04, 8.27014112e-01, 0.00000000e+00], 
1052                       [  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, 0.00000000e+00, 1.00000000e+00]]) 
1053   
1054           
1055          sigma_max = 60.0 / 180.0 * pi 
1056   
1057           
1058          Rx2_eigen = self.calc_Rx2_eigen_axis(0.0, 0.0) 
1059   
1060           
1061          f2 = compile_2nd_matrix_rotor(self.f2_temp, Rx2_eigen, sigma_max) 
1062   
1063           
1064          print_frame_order_2nd_degree(real, "real") 
1065          print_frame_order_2nd_degree(f2, "calculated") 
1066          print_frame_order_2nd_degree(real-f2, "difference") 
1067   
1068           
1069          for i in range(9): 
1070              for j in range(9): 
1071                  print("Element %s, %s." % (i, j)) 
1072                  self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3) 
 1073   
1074   
1076          """Test the alignment tensor reduction for the order identity matrix.""" 
1077   
1078           
1079          A = array([1, 2, 3, 4, 5], float64) 
1080          red = zeros(5, float64) 
1081   
1082           
1083          reduce_alignment_tensor(self.I_order, A, red) 
1084   
1085           
1086          for i in range(5): 
1087              self.assertEqual(A[i], red[i]) 
 1088   
1089   
1091          """Test the alignment tensor reduction for the order identity matrix.""" 
1092   
1093           
1094          A = array([1, 2, 3, 4, 5], float64) 
1095          red = zeros(5, float64) 
1096   
1097           
1098          reduce_alignment_tensor(self.I_disorder, A, red) 
1099   
1100           
1101          for i in range(5): 
1102              self.assertEqual(red[i], 0.0) 
 1103   
1104   
1106          """Test the alignment tensor reduction for the order identity matrix.""" 
1107   
1108           
1109          A = array([1, 2, 3, 4, 5], float64) 
1110          red = zeros(5, float64) 
1111   
1112           
1113          reduce_alignment_tensor(self.f2_half_cone, A, red) 
1114   
1115           
1116          for i in range(5): 
1117              self.assertEqual(red[i], 0.0) 
  1118