def test_EulerAngles(self): euler_angles = [-math.pi / 2.0, -math.pi / 2.0, math.pi / 2.0] reference_point = [-1.0, 0.0, 0.0] translation_vector = [1.0, 2.0, 3.0] transform = MeshMoving.LinearTransform(euler_angles, reference_point, translation_vector) self.CheckPoints( [transform.Apply(point) for point in self.GeneratePoints()])
def test_AxisAngle(self): axis = [0.0, 1.0, 0.0] angle = -math.pi / 2.0 reference_point = [-1.0, 0.0, 0.0] translation_vector = [1.0, 2.0, 3.0] transform = MeshMoving.LinearTransform(axis, angle, reference_point, translation_vector) self.CheckPoints( [transform.Apply(point) for point in self.GeneratePoints()])
def test_Quaternion(self): quaternion = KratosMultiphysics.Quaternion() quaternion.X = 0.0 quaternion.Y = -math.sqrt(2.0) / 2.0 quaternion.Z = 0.0 quaternion.W = math.sqrt(2.0) / 2.0 reference_point = [-1.0, 0.0, 0.0] translation_vector = [1.0, 2.0, 3.0] transform = MeshMoving.LinearTransform(quaternion, reference_point, translation_vector) self.CheckPoints( [transform.Apply(point) for point in self.GeneratePoints()])
def __init__(self, model: KratosMultiphysics.Model, parameters: KratosMultiphysics.Parameters): """Impose a rotation followed by translation on a ModelPart.""" KratosMultiphysics.Process.__init__(self) # 'rotation_angle' can either be a float or "End", but the validator can't handle both # => convert 'rotation_angle' to the input type default_parameters = self.GetDefaultParameters() if parameters.Has("rotation_angle") and parameters["rotation_angle"].IsString(): default_parameters.RemoveValue("rotation_angle") default_parameters.AddValue("rotation_angle", parameters["rotation_angle"]) parameters.ValidateAndAssignDefaults(default_parameters) self.model_part = model[parameters["model_part_name"].GetString()] # Parse interval self.interval_utility = KratosMultiphysics.IntervalUtility(parameters) # Determine whether a constant transform will suffice or a parametric one is needed requires_parametric_transform = False euler_angle_parameters = parameters["euler_angles"] rotation_axis_parameters = parameters["rotation_axis"] rotation_angle_parameters = parameters["rotation_angle"] reference_point_parameters = parameters["reference_point"] translation_vector_parameters = parameters["translation_vector"] if rotation_angle_parameters.IsString(): requires_parametric_transform = True else: for i in range(3): if euler_angle_parameters[i].IsString() or rotation_axis_parameters[i].IsString() or reference_point_parameters[i].IsString() or translation_vector_parameters[i].IsString(): requires_parametric_transform = True break rotation_definition = parameters["rotation_definition"].GetString() if requires_parametric_transform: if rotation_definition == "rotation_axis": self.transform = MeshMovingApplication.ParametricLinearTransform( rotation_axis_parameters, rotation_angle_parameters, reference_point_parameters, translation_vector_parameters) elif rotation_definition == "euler_angles": self.transform = MeshMovingApplication.ParametricLinearTransform( euler_angle_parameters, reference_point_parameters, translation_vector_parameters) else: raise ValueError("Invalid rotation definition '{}'".format(rotation_definition)) else: reference_point = reference_point_parameters.GetVector() translation_vector = translation_vector_parameters.GetVector() if rotation_definition == "rotation_axis": rotation_axis = rotation_axis_parameters.GetVector() rotation_angle = rotation_angle_parameters.GetDouble() self.transform = MeshMovingApplication.LinearTransform( rotation_axis, rotation_angle, reference_point, translation_vector) elif rotation_definition == "euler_angles": euler_angles = euler_angle_parameters.GetVector() self.transform = MeshMovingApplication.LinearTransform( euler_angles, reference_point, translation_vector) else: raise ValueError("Invalid rotation definition '{}'".format(rotation_definition))