def test_tensor_rotation_z(): transform = vtk.vtkTransform() transform.RotateZ(20) transform.Update() rot_matrix = transform.GetMatrix() # rot_matrix.Invert() # <-- this should not be necessary trans = pv.trans_from_matrix(rot_matrix) s_test = stress.copy().reshape(1, -1) _binary_reader.tensor_arbitrary(s_test, trans) assert np.allclose(s_test, stress_rot_z)
def expand_cyclic_static(self, result, tensor=False): """ expands cyclic static results """ cs_cord = self.resultheader['csCord'] if cs_cord > 1: matrix = self.cs_4x4(cs_cord, as_vtk_matrix=True) i_matrix = self.cs_4x4(cs_cord, as_vtk_matrix=True) i_matrix.Invert() else: matrix = vtk.vtkMatrix4x4() i_matrix = vtk.vtkMatrix4x4() shp = (self.n_sector, result.shape[0], result.shape[1]) full_result = np.empty(shp) full_result[:] = result rang = 360.0 / self.n_sector for i in range(self.n_sector): # transform to standard position, rotate about Z axis, # transform back transform = vtk.vtkTransform() transform.RotateZ(rang * i) transform.Update() rot_matrix = transform.GetMatrix() if cs_cord > 1: temp_matrix = vtk.vtkMatrix4x4() rot_matrix.Multiply4x4(i_matrix, rot_matrix, temp_matrix) rot_matrix.Multiply4x4(temp_matrix, matrix, rot_matrix) trans = pv.trans_from_matrix(rot_matrix) if tensor: _binary_reader.tensor_arbitrary(full_result[i], trans) else: _binary_reader.affline_transform_double(full_result[i], trans) return full_result
def expand_cyclic_modal_stress(self, result, result_r, hindex, phase, as_complex, full_rotor, scale=True): """ Combines repeated results from ANSYS """ if as_complex or full_rotor: result_combined = result + result_r * 1j if phase: result_combined *= 1 * np.cos(phase) - 1j * np.sin(phase) else: # convert to real result_combined = result * np.cos(phase) - result_r * np.sin(phase) # just return single sector if not full_rotor: return result_combined # Generate full rotor solution result_expanded = np.empty( (self.n_sector, result.shape[0], result.shape[1]), np.complex128) result_expanded[:] = result_combined # scale # if scale: # if hindex == 0 or hindex == self.n_sector/2: # result_expanded /= self.n_sector**0.5 # else: # result_expanded /= (self.n_sector/2)**0.5 f_arr = np.zeros(self.n_sector) f_arr[hindex] = 1 jang = np.fft.ifft(f_arr)[:self.n_sector] * self.n_sector cjang = jang * (np.cos(phase) - np.sin(phase) * 1j) full_result = np.real(result_expanded * cjang.reshape(-1, 1, 1)) # # rotate cyclic result inplace # angles = np.linspace(0, 2*np.pi, self.n_sector + 1)[:-1] + phase # for i, angle in enumerate(angles): # isnan = _binary_reader.tensor_rotate_z(result_expanded[i], angle) # result_expanded[i, isnan] = np.nan cs_cord = self.resultheader['csCord'] if cs_cord > 1: matrix = self.cs_4x4(cs_cord, as_vtk_matrix=True) i_matrix = self.cs_4x4(cs_cord, as_vtk_matrix=True) i_matrix.Invert() else: matrix = vtk.vtkMatrix4x4() i_matrix = vtk.vtkMatrix4x4() shp = (self.n_sector, result.shape[0], result.shape[1]) full_result = np.empty(shp) full_result[:] = result rang = 360.0 / self.n_sector for i in range(self.n_sector): # transform to standard position, rotate about Z axis, # transform back transform = vtk.vtkTransform() transform.RotateZ(rang * i) transform.Update() rot_matrix = transform.GetMatrix() if cs_cord > 1: temp_matrix = vtk.vtkMatrix4x4() rot_matrix.Multiply4x4(i_matrix, rot_matrix, temp_matrix) rot_matrix.Multiply4x4(temp_matrix, matrix, rot_matrix) trans = pv.trans_from_matrix(rot_matrix) _binary_reader.tensor_arbitrary(full_result[i], trans) return full_result