def test_variable_scaling_step(self):
        scaling_op_settings = KM.Parameters("""{
            "type"           : "scaling",
            "solver"         : "dummy_solver",
            "data_name"      : "data_4_testing",
            "scaling_factor" : "1.5*sqrt(step)*pi",
            "echo_level"     : 0
        }""")

        scaling_op = coupling_operation_factory.CreateCouplingOperation(scaling_op_settings, self.solver_wrappers, self.solver_process_info)

        factors = [1.5*pi*sqrt(1), 1.5*pi*sqrt(2), 1.5*pi*sqrt(3), 1.5*pi*sqrt(4), 1.5*pi*sqrt(5)]

        self.__ExecuteTest(scaling_op, factors)
    def test_variable_scaling_time(self):
        scaling_op_settings = KM.Parameters("""{
            "type"           : "scaling",
            "solver"         : "dummy_solver",
            "data_name"      : "data_4_testing",
            "scaling_factor" : "1.5*t",
            "echo_level"     : 0
        }""")

        scaling_op = coupling_operation_factory.CreateCouplingOperation(scaling_op_settings, self.solver_wrappers, self.solver_process_info)

        factors = [1.5*0.25, 1.5*0.5, 1.5*0.75]

        self.__ExecuteTest(scaling_op, factors)
    def test_constant_scaling_from_string(self):
        scaling_op_settings = KM.Parameters("""{
            "type"           : "scaling",
            "solver"         : "dummy_solver",
            "data_name"      : "data_4_testing",
            "scaling_factor" : "1.5",
            "echo_level"     : 0
        }""")

        scaling_op = coupling_operation_factory.CreateCouplingOperation(scaling_op_settings, self.solver_wrappers, self.solver_process_info)

        factors = [1.5] * 3

        self.__ExecuteTest(scaling_op, factors)
    def test_scaling_in_interval_2(self):
        scaling_op_settings = KM.Parameters("""{
            "type"           : "scaling",
            "solver"         : "dummy_solver",
            "data_name"      : "data_4_testing",
            "scaling_factor" : 1.22,
            "interval"       : [0.8, "End"]
        }""")

        scaling_op = coupling_operation_factory.CreateCouplingOperation(
            scaling_op_settings, self.solver_wrappers,
            self.solver_process_info)

        factors = [1.0] * 3
        factors.extend([1.22] * 3)

        self.__ExecuteTest(scaling_op, factors)
    def test_scaling_in_interval(self):
        if using_pykratos:
            self.skipTest("This test can only be run with pyKratos after the IntervalUtility is implemented!")

        scaling_op_settings = KM.Parameters("""{
            "type"           : "scaling",
            "solver"         : "dummy_solver",
            "data_name"      : "data_4_testing",
            "scaling_factor" : 1.22,
            "interval"       : [0.0, 0.3]
        }""")

        scaling_op = coupling_operation_factory.CreateCouplingOperation(scaling_op_settings, self.solver_wrappers, self.solver_process_info)

        factors = [1.0] * 5
        factors[0] = 1.22

        self.__ExecuteTest(scaling_op, factors)
    def test_elemental_to_nodal_conversion(self):
        self.model = KM.Model()
        self.model_part = self.model.CreateModelPart("default")
        self.model_part.AddNodalSolutionStepVariable(KM.FORCE)
        self.model_part.ProcessInfo[KM.DOMAIN_SIZE] = 3
        props = self.model_part.CreateNewProperties(1)

        self.model_part.CreateNewNode(1, 0.0, 0.0, 0.0)
        self.model_part.CreateNewNode(2, 1.0, 0.0, 0.0)
        self.model_part.CreateNewNode(3, 1.0, 1.0, 0.0)
        self.model_part.CreateNewNode(4, 0.0, 1.0, 0.0)

        new_element = self.model_part.CreateNewElement("Element2D4N", 1,
                                                       [1, 2, 3, 4], props)
        new_element.SetValue(KM.FORCE, [12.0, 8.0, 0.0])

        self.model_part.CreateNewNode(5, 2.0, 0.0, 0.0)
        self.model_part.CreateNewNode(6, 2.0, 1.0, 0.0)
        new_element = self.model_part.CreateNewElement("Element2D4N", 2,
                                                       [2, 5, 6, 3], props)
        new_element.SetValue(KM.FORCE, [16.0, 4.0, 0.0])

        elemental_data = KM.Parameters("""{
            "model_part_name" : "default",
            "location"        : "element",
            "variable_name"   : "FORCE",
            "dimension"       : 3
        }""")

        self.interface_data = CouplingInterfaceData(elemental_data, self.model)

        self.solver_wrappers = {
            "dummy_solver":
            DummySolverWrapper({"elemental_data": self.interface_data})
        }

        self.solver_process_info = KM.ProcessInfo()

        conversion_op_settings = KM.Parameters("""{
            "type"           : "elemental_data_to_nodal_data",
            "solver"         : "dummy_solver",
            "data_name"      : "elemental_data",
            "echo_level"     : 0
        }""")

        conversion_operation = coupling_operation_factory.CreateCouplingOperation(
            conversion_op_settings, self.solver_wrappers,
            self.solver_process_info)

        conversion_operation.Check()

        conversion_operation.Execute()

        nodal_data_output_setting = KM.Parameters("""{
            "model_part_name"       : "default",
            "variable_name"         : "FORCE",
            "location"              : "node_historical",
            "dimension"             : 3
        }""")

        nodal_data_output = CouplingInterfaceData(nodal_data_output_setting,
                                                  self.model)

        expected_nodal_values = [
            3, 2, 0, 7, 3, 0, 7, 3, 0, 3, 2, 0, 4, 1, 0, 4, 1, 0
        ]

        self.assertVectorAlmostEqual(expected_nodal_values,
                                     nodal_data_output.GetData())