def test_GetSetConditionalData(self):
        if using_pykratos:
            self.skipTest("This test cannot be run with pyKratos!")
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "location"        : "condition",
            "variable_name"   : "YOUNG_MODULUS"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "ROTATION",
            "location"        : "condition",
            "dimension"       : 2
        }""")

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec,  self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        exp_data_scal = [ConditionScalarValue(cond.Id) for cond in self.mp.Conditions]
        exp_data_vec = GetVectorValues(self.mp.Conditions, ConditionVectorValue, 2)

        self.__CheckData(exp_data_scal, coupling_data_scal.GetData())
        self.__CheckData(exp_data_vec, coupling_data_vec.GetData())

        # 2. check setting and getting works
        set_data_scal = [NodeScalarHistValuePrevious(cond.Id) for cond in self.mp.Conditions]
        set_data_vec = GetVectorValues(self.mp.Conditions, NodeVectorHistValuePrevious, 2)

        self.__CheckSetGetData(set_data_scal, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec, coupling_data_vec)
    def test_GetSetElementalData(self):
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "location"        : "element",
            "variable_name"   : "DENSITY"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "FORCE",
            "location"        : "element",
            "dimension"       : 2
        }""")

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec,  self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        exp_data_scal = [ElementScalarValue(elem.Id) for elem in self.mp.Elements]
        exp_data_vec = GetVectorValues(self.mp.Elements, ElementVectorValue, 2)

        self.__CheckData(exp_data_scal, coupling_data_scal.GetData())
        self.__CheckData(exp_data_vec, coupling_data_vec.GetData())

        # 2. check setting and getting works
        set_data_scal = [NodeScalarNonHistValue(elem.Id) for elem in self.mp.Elements]
        set_data_vec = GetVectorValues(self.mp.Elements, NodeVectorNonHistValue, 2)

        self.__CheckSetGetData(set_data_scal, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec, coupling_data_vec)
Exemplo n.º 3
0
    def test_GetSetProcessInfoData(self):
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "location"        : "process_info",
            "variable_name"   : "NODAL_ERROR"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "NORMAL",
            "location"        : "process_info",
            "dimension"       : 2
        }""")

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec, self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        self.__CheckData([process_info_scalar_value],
                         coupling_data_scal.GetData())
        self.__CheckData(
            [process_info_vector_value[0], process_info_vector_value[1]],
            coupling_data_vec.GetData())

        # 2. check setting and getting works
        set_data_scal = [model_part_scalar_value]
        set_data_vec = [model_part_vector_value[0], model_part_vector_value[1]]

        self.__CheckSetGetData(set_data_scal, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec, coupling_data_vec)
Exemplo n.º 4
0
    def test_GetSetModelPartData(self):
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "location"        : "model_part",
            "variable_name"   : "NODAL_MASS"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "TORQUE",
            "location"        : "model_part",
            "dimension"       : 1
        }""")

        self.mp.ProcessInfo[KM.DOMAIN_SIZE] = 1

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec, self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        self.__CheckData([model_part_scalar_value],
                         coupling_data_scal.GetData())
        self.__CheckData([model_part_vector_value[0]],
                         coupling_data_vec.GetData())

        # 2. check setting and getting works
        set_data_scal = [model_part_scalar_value_2]
        set_data_vec = [model_part_vector_value_2[0]]

        self.__CheckSetGetData(set_data_scal, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec, coupling_data_vec)
Exemplo n.º 5
0
    def test_basics(self):
        settings_scal_hist = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE"
        }""")

        settings_vec_elem = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "DISPLACEMENT",
            "location"        : "element",
            "dimension"       : 2
        }""")

        coupling_data_scal = CouplingInterfaceData(settings_scal_hist,
                                                   self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec = CouplingInterfaceData(settings_vec_elem,
                                                  self.model)
        coupling_data_vec.Initialize()

        self.assertEqual(coupling_data_scal.GetModelPart().Name, "mp_4_test")
        self.assertEqual(coupling_data_vec.GetModelPart().Name, "mp_4_test")

        self.assertFalse(coupling_data_scal.GetModelPart().IsDistributed())
        self.assertFalse(coupling_data_vec.GetModelPart().IsDistributed())

        self.assertEqual(coupling_data_scal.Size(),
                         5)  # 5 nodes and scalar var
        self.assertEqual(coupling_data_vec.Size(),
                         14)  # 7 elements and vector var with dim==2

        self.assertEqual(coupling_data_scal.GetBufferSize(), 2)
        self.assertEqual(coupling_data_vec.GetBufferSize(), 1)
    def test_GetSetNodalNonHistoricalData(self):
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "location"        : "node_non_historical",
            "variable_name"   : "TEMPERATURE"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "VELOCITY",
            "location"        : "node_non_historical",
            "dimension"       : 3
        }""")

        self.mp.ProcessInfo[KM.DOMAIN_SIZE] = 3

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec,  self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        exp_data_scal = [NodeScalarNonHistValue(node.Id) for node in self.mp.Nodes]
        exp_data_vec = GetVectorValues(self.mp.Nodes, NodeVectorNonHistValue, 3)

        self.__CheckData(exp_data_scal, coupling_data_scal.GetData())
        self.__CheckData(exp_data_vec, coupling_data_vec.GetData())

        # 2. check setting and getting works
        set_data_scal = [ConditionScalarValue(node.Id) for node in self.mp.Nodes]
        set_data_vec = GetVectorValues(self.mp.Nodes, ConditionVectorValue, 3)

        self.__CheckSetGetData(set_data_scal, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec, coupling_data_vec)
    def test_wrong_input_set_data(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE"
        }""")

        settings_model_part = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE",
            "location"        : "model_part"
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        coupling_data.Initialize()
        coupling_data_mp = CouplingInterfaceData(settings_model_part, self.model)
        coupling_data_mp.Initialize()

        wrong_data = [1,2,3]
        correct_data = [1,2,3,4,5]

        with self.assertRaisesRegex(Exception, "The sizes of the data are not matching, got: 3, expected: 5"):
            coupling_data.SetData(wrong_data)

        with self.assertRaisesRegex(Exception, "The buffer-size is not large enough: current buffer size: 2 | requested solution_step_index: 3"):
            coupling_data.SetData(correct_data, 2)

        with self.assertRaisesRegex(Exception, "accessing data from previous steps is only possible with historical nodal data!"):
            coupling_data_mp.SetData(correct_data, 2)
Exemplo n.º 8
0
    def test_Export_ImportCouplingData(self):
        p = self.__RunPythonInSubProcess("import_export_data")

        model = KM.Model()
        io_settings = KM.Parameters("""{
            "connect_to" : "impExp"
        }""")
        solver_name = "ExpImp"  # aka "my_name" for the CoSimIO
        kratos_co_sim_io = CreateKratosCoSimIO(io_settings, model,
                                               solver_name)  # this connects
        kratos_co_sim_io.Initialize()

        model_part = model.CreateModelPart("for_test")
        model_part.AddNodalSolutionStepVariable(KM.PRESSURE)
        model_part.AddNodalSolutionStepVariable(KM.TEMPERATURE)
        for i in range(5):
            node = model_part.CreateNewNode(
                i + 1, 0.0, 0.0,
                0.0)  # using same coord, doesn't matter for this test
            node.SetSolutionStepValue(KM.PRESSURE, i * 1.7)

        settings_pres = KM.Parameters("""{
            "model_part_name" : "for_test",
            "variable_name"   : "PRESSURE"
        }""")

        settings_temp = KM.Parameters("""{
            "model_part_name" : "for_test",
            "variable_name"   : "TEMPERATURE"
        }""")
        interface_data_pres = CouplingInterfaceData(settings_pres, model,
                                                    "data_exchange_1")
        interface_data_temp = CouplingInterfaceData(settings_temp, model,
                                                    "data_exchange_2")
        interface_data_pres.Initialize()
        interface_data_temp.Initialize()

        data_configuration_export = {
            "type": "coupling_interface_data",
            "interface_data": interface_data_pres
        }
        kratos_co_sim_io.ExportData(data_configuration_export)

        data_configuration_import = {
            "type": "coupling_interface_data",
            "interface_data": interface_data_temp
        }
        kratos_co_sim_io.ImportData(data_configuration_import)

        kratos_co_sim_io.Finalize()  # this disconnects

        # checking the values after disconnecting to avoid deadlock
        for i, node in enumerate(model_part.Nodes):
            self.assertAlmostEqual(node.GetSolutionStepValue(KM.TEMPERATURE),
                                   i * 1.7)

        self.__CheckSubProcess(p)
Exemplo n.º 9
0
    def test_GetSetNodalHistoricalData(self):
        settings_scal = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE"
        }""")

        settings_vec = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "DISPLACEMENT",
            "dimension"       : 2
        }""")

        coupling_data_scal = CouplingInterfaceData(settings_scal, self.model)
        coupling_data_vec = CouplingInterfaceData(settings_vec, self.model)
        coupling_data_scal.Initialize()
        coupling_data_vec.Initialize()

        # 1. check the initial values
        exp_data_scal_cur = [
            NodeScalarHistValueCurrent(node.Id) for node in self.mp.Nodes
        ]
        exp_data_scal_prev = [
            NodeScalarHistValuePrevious(node.Id) for node in self.mp.Nodes
        ]

        exp_data_vec_cur = GetVectorValues(self.mp.Nodes,
                                           NodeVectorHistValueCurrent, 2)
        exp_data_vec_prev = GetVectorValues(self.mp.Nodes,
                                            NodeVectorHistValuePrevious, 2)

        self.__CheckData(exp_data_scal_cur, coupling_data_scal.GetData())
        self.__CheckData(exp_data_vec_cur, coupling_data_vec.GetData())

        self.__CheckData(exp_data_scal_prev, coupling_data_scal.GetData(1))
        self.__CheckData(exp_data_vec_prev, coupling_data_vec.GetData(1))

        # 2. check setting and getting works
        set_data_scal_cur = [
            ElementScalarValue(node.Id) for node in self.mp.Nodes
        ]
        set_data_scal_prev = [
            ConditionScalarValue(node.Id) for node in self.mp.Nodes
        ]

        set_data_vec_cur = GetVectorValues(self.mp.Nodes, ElementVectorValue,
                                           2)
        set_data_vec_prev = GetVectorValues(self.mp.Nodes,
                                            ConditionVectorValue, 2)

        self.__CheckSetGetData(set_data_scal_cur, coupling_data_scal)
        self.__CheckSetGetData(set_data_vec_cur, coupling_data_vec)

        self.__CheckSetGetData(set_data_scal_prev, coupling_data_scal, 1)
        self.__CheckSetGetData(set_data_vec_prev, coupling_data_vec, 1)
    def test_wrong_input_no_dim_vector(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "DISPLACEMENT"
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, '"dimension" has to be specifed for vector variables!'):
            coupling_data.Initialize()
    def test_printing(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "DISPLACEMENT",
            "dimension"       : 2
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        coupling_data.Initialize()
        self.assertMultiLineEqual(str(coupling_data), coupling_interface_data_str)
    def test_non_existing_model_part(self):
        settings = KM.Parameters("""{
            "model_part_name" : "something",
            "variable_name"   : "PRESSURE",
            "location"        : "node_non_historical"
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, "The specified ModelPart is not in the Model, only the following ModelParts are available:"):
            coupling_data.Initialize()
    def test_wrong_input_dim_scalar(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE",
            "dimension"       : 2
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, '"dimension" cannot be specifed for scalar variables!'):
            coupling_data.Initialize()
Exemplo n.º 14
0
    def test_wrong_input_variable_type(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "EXTERNAL_FORCES_VECTOR"
        }""")

        exp_error = 'The input for "variable" "EXTERNAL_FORCES_VECTOR" is of variable type "Vector" which is not allowed, only the following variable types are allowed:\nBool, Integer, Unsigned Integer, Double, Component, Array'

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, exp_error):
            coupling_data.Initialize()
Exemplo n.º 15
0
    def test_wrong_input_missing_solutionstepvar_double(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "TEMPERATURE"
        }""")

        exp_error = '"TEMPERATURE" is missing as SolutionStepVariable in ModelPart "mp_4_test"'

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, exp_error):
            coupling_data.Initialize()
Exemplo n.º 16
0
    def test_wrong_input_location(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE",
            "location"        : "dummy"
        }""")

        exp_error = '"dummy" is not allowed as "location", only the following options are possible:\nnode_historical, node_non_historical, element, condition, process_info, model_part'

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, exp_error):
            coupling_data.Initialize()
Exemplo n.º 17
0
    def test_wrong_input_dim_array(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "DISPLACEMENT",
            "dimension"       : 4
        }""")

        exp_error = '"dimension" can only be 1,2,3 when using variables of type "Array"'

        coupling_data = CouplingInterfaceData(settings, self.model)
        with self.assertRaisesRegex(Exception, exp_error):
            coupling_data.Initialize()
    def test_inplace_mult(self):
        settings = KM.Parameters("""{
            "model_part_name" : "mp_4_test",
            "variable_name"   : "PRESSURE"
        }""")

        coupling_data = CouplingInterfaceData(settings, self.model)
        coupling_data.Initialize()

        factor = 1.55

        data_init = coupling_data.GetData()
        coupling_data.InplaceMultiply(factor)
        data_mod = coupling_data.GetData()

        for v_old, v_new in zip(data_init, data_mod):
            self.assertAlmostEqual(v_old * factor, v_new)
Exemplo n.º 19
0
class TestConvergenceCriteria(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        self.model_part = self.model.CreateModelPart("default")
        self.model_part.AddNodalSolutionStepVariable(KM.PRESSURE)

        for i in range(
                10):  # using 10 nodes gives suitable values in the tests
            node = self.model_part.CreateNewNode(
                i + 1, 0.0, 0.0,
                0.0)  # position of nodes does not matter for this test
            node.SetSolutionStepValue(KM.PRESSURE, 1.0)

        data_settings = KM.Parameters("""{
            "model_part_name" : "default",
            "variable_name"   : "PRESSURE"
        }""")
        self.interface_data = CouplingInterfaceData(data_settings, self.model)
        self.interface_data.Initialize()

        self.dummy_solver_wrapper = DummySolverWrapper(
            {"data_4_testing": self.interface_data})

    def test_RelativeNormInitialResidual_abs_tol(self):
        conv_crit_settings = KM.Parameters("""{
            "type"           : "relative_norm_initial_residual",
            "data_name"      : "data_4_testing",
            "abs_tolerance"  : 1e-5,
            "rel_tolerance"  : 1e-12,
            "echo_level"     : 0
        }""")
        conv_crit = ConvergenceCriteriaWrapper(conv_crit_settings,
                                               self.dummy_solver_wrapper)

        sol_values = [(2e-1, False), (2e-4, False), (2e-6, False),
                      (2e-7, True), (2e-8, True), (2e-9, True), (2e-4, False),
                      (2e-6, False), (2e-7, True)]

        self.__ExecuteTest(conv_crit, sol_values)

    def test_RelativeNormInitialResidual_rel_tol(self):
        conv_crit_settings = KM.Parameters("""{
            "type"           : "relative_norm_initial_residual",
            "data_name"      : "data_4_testing",
            "abs_tolerance"  : 1e-12,
            "rel_tolerance"  : 1e-5,
            "echo_level"     : 0
        }""")
        conv_crit = ConvergenceCriteriaWrapper(conv_crit_settings,
                                               self.dummy_solver_wrapper)

        sol_values = [
            (2e-1, False),
            (2e-2, False),
            (2e-3, False),
            (2e-4, False),
            (2e-5, False),
            (2e-6, False),
            (1e-6, True),
            (1e-7, True),
            (2e-5, False),
            (2e-6, False),
            (1e-6, True),
        ]

        self.__ExecuteTest(conv_crit, sol_values)

    def test_RelativeNormPreviousResidual_abs_tol(self):
        conv_crit_settings = KM.Parameters("""{
            "type"           : "relative_norm_previous_residual",
            "data_name"      : "data_4_testing",
            "abs_tolerance"  : 1e-5,
            "rel_tolerance"  : 1e-12,
            "echo_level"     : 0
        }""")
        conv_crit = ConvergenceCriteriaWrapper(conv_crit_settings,
                                               self.dummy_solver_wrapper)

        sol_values = [(2e-1, False), (2e-4, False), (2e-6, False),
                      (2e-7, True), (2e-8, True), (2e-9, True), (2e-4, False),
                      (2e-6, False), (2e-7, True)]

        self.__ExecuteTest(conv_crit, sol_values)

    def test_RelativeNormPreviousResidual_rel_tol(self):
        conv_crit_settings = KM.Parameters("""{
            "type"           : "relative_norm_previous_residual",
            "data_name"      : "data_4_testing",
            "abs_tolerance"  : 1e-12,
            "rel_tolerance"  : 1e-5,
            "echo_level"     : 0
        }""")
        conv_crit = ConvergenceCriteriaWrapper(conv_crit_settings,
                                               self.dummy_solver_wrapper)

        sol_values = [
            (2e-1, False),
            (2e-2, False),
            (2.00001e-2,
             True),  # small change in the values leads to convergence
            (2e-4, False),
            (8e-6, False),
            (7e-6, False),
            (7.00001e-6, True
             )  # small change in the values leads to convergence
        ]

        self.__ExecuteTest(conv_crit, sol_values)

    def __ExecuteTest(self, conv_crit, solution_values):
        conv_crit.Initialize()
        conv_crit.Check()  # not yet implemented

        conv_crit.InitializeSolutionStep()

        for vals_tuple in solution_values:

            conv_crit.InitializeNonLinearIteration()

            KM.VariableUtils().SetScalarVar(KM.PRESSURE, vals_tuple[0],
                                            self.model_part.Nodes)

            self.assertEqual(vals_tuple[1], conv_crit.IsConverged())

            conv_crit.FinalizeNonLinearIteration()

        conv_crit.FinalizeSolutionStep()

        conv_crit.Finalize()
Exemplo n.º 20
0
class TestDataTransferOperators(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        mp_o = self.model.CreateModelPart("mp_origin", 2)
        mp_d_m = self.model.CreateModelPart("mp_destination_matching", 2)
        mp_d_nm = self.model.CreateModelPart("mp_destination_non_matching", 2)
        mp_one_n = self.model.CreateModelPart("mp_single_node", 2)

        mp_o.AddNodalSolutionStepVariable(KM.PRESSURE)
        mp_o.AddNodalSolutionStepVariable(KM.DISPLACEMENT)
        mp_d_m.AddNodalSolutionStepVariable(KM.TEMPERATURE)
        mp_d_m.AddNodalSolutionStepVariable(KM.FORCE)
        mp_d_nm.AddNodalSolutionStepVariable(KM.TEMPERATURE)
        mp_d_nm.AddNodalSolutionStepVariable(KM.FORCE)
        mp_one_n.AddNodalSolutionStepVariable(KMC.SCALAR_DISPLACEMENT)
        mp_one_n.AddNodalSolutionStepVariable(KMC.SCALAR_FORCE)

        mp_o.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_d_m.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_d_nm.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_one_n.ProcessInfo[KM.DOMAIN_SIZE] = 2

        num_nodes_matching = 5
        num_nodes_non_matching = 8

        for i in range(num_nodes_matching):
            node_id = i + 1
            node_o = mp_o.CreateNewNode(node_id, 0.0, 0.0, i + 1)
            mp_d_m.CreateNewNode(node_id, 0.0, 0.0, i + 1)

            node_o.SetSolutionStepValue(KM.PRESSURE, 0,
                                        ScalarValueFromId(node_id))
            node_o.SetSolutionStepValue(KM.DISPLACEMENT, 0,
                                        VectorValueFromId(node_id))

        for i in range(num_nodes_non_matching - 1, -1, -1):
            node_id = i + 15
            mp_d_nm.CreateNewNode(node_id, 0.0, 0.0, i + 1.1)

        mp_one_n.CreateNewNode(1, 0.0, 0.0, 0.0)

        origin_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_origin",
            "variable_name"   : "PRESSURE"
        }""")
        origin_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_origin",
            "variable_name"   : "DISPLACEMENT",
            "dimension" : 2
        }""")
        origin_data_settings_single_node = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "SCALAR_DISPLACEMENT"
        }""")

        self.origin_data_scalar = CouplingInterfaceData(
            origin_data_settings_scalar, self.model)
        self.origin_data_vector = CouplingInterfaceData(
            origin_data_settings_vector, self.model)
        self.origin_data_single_node = CouplingInterfaceData(
            origin_data_settings_single_node, self.model)
        self.origin_data_scalar.Initialize()
        self.origin_data_vector.Initialize()
        self.origin_data_single_node.Initialize()

        destination_matching_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_destination_matching",
            "variable_name"   : "TEMPERATURE"
        }""")
        destination_matching_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_destination_matching",
            "variable_name"   : "FORCE",
            "dimension" : 2
        }""")
        destination_data_settings_single_node = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "SCALAR_FORCE"
        }""")

        self.destination_matching_data_scalar = CouplingInterfaceData(
            destination_matching_data_settings_scalar, self.model)
        self.destination_matching_data_vector = CouplingInterfaceData(
            destination_matching_data_settings_vector, self.model)
        self.destination_data_single_node = CouplingInterfaceData(
            destination_data_settings_single_node, self.model)
        self.destination_matching_data_scalar.Initialize()
        self.destination_matching_data_vector.Initialize()
        self.destination_data_single_node.Initialize()

        destination_non_matching_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_destination_non_matching",
            "variable_name"   : "TEMPERATURE"
        }""")
        destination_non_matching_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_destination_non_matching",
            "variable_name"   : "FORCE",
            "dimension" : 2
        }""")

        self.destination_non_matching_data_scalar = CouplingInterfaceData(
            destination_non_matching_data_settings_scalar, self.model)
        self.destination_non_matching_data_vector = CouplingInterfaceData(
            destination_non_matching_data_settings_vector, self.model)
        self.destination_non_matching_data_scalar.Initialize()
        self.destination_non_matching_data_vector.Initialize()

    def test_copy_transfer_operator(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)

        self.__TestTransferMatching(data_transfer_op)
        self.__TestTransferMatchingSwapSign(data_transfer_op)
        self.__TestTransferMatchingAddValues(data_transfer_op)
        self.__TestTransferMatchingAddValuesAndSwapSign(data_transfer_op)

        transfer_options_empty = KM.Parameters(""" [] """)
        exp_error = 'The sizes of the data are not matching: {} != {} for interface data "{}" of solver "{}" and interface data "{}" of solver "{}"!'.format(
            self.origin_data_scalar.Size(),
            self.destination_non_matching_data_scalar.Size(),
            self.origin_data_scalar.name, self.origin_data_scalar.solver_name,
            self.destination_non_matching_data_scalar.name,
            self.destination_non_matching_data_scalar.solver_name)
        with self.assertRaisesRegex(Exception, exp_error):
            data_transfer_op.TransferData(
                self.origin_data_scalar,
                self.destination_non_matching_data_scalar,
                transfer_options_empty)

    def test_kratos_mapping_transfer_operator(self):
        if not mapping_app_available:
            self.skipTest("MappingApplication not available!")

        data_transfer_op_settings_missing = KM.Parameters("""{
            "type" : "kratos_mapping"
        }""")

        exp_error = 'No "mapper_settings" provided!'
        with self.assertRaisesRegex(Exception, exp_error):
            data_transfer_operator_factory.CreateDataTransferOperator(
                data_transfer_op_settings_missing)

        data_transfer_op_settings = KM.Parameters("""{
            "type" : "kratos_mapping",
            "mapper_settings" : {
                "mapper_type" : "nearest_neighbor"
            }
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)

        self.__TestTransferMatching(data_transfer_op)
        self.__TestTransferMatchingSwapSign(data_transfer_op)
        self.__TestTransferMatchingAddValues(data_transfer_op)
        self.__TestTransferMatchingAddValuesAndSwapSign(data_transfer_op)

        # with this we make sure that only one mapper is created (and not several ones for each mapping operation!)
        # Hint: requires access to private member
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            1)

        self.__TestTransferMatchingInverse(data_transfer_op)
        # here we check explicitly the InverseMap fct
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            1)

        transfer_options_empty = KM.Parameters(""" [] """)
        data_transfer_op.TransferData(
            self.origin_data_scalar, self.destination_non_matching_data_scalar,
            transfer_options_empty)
        # here we check explicitly the creation of a second mapper, which is required since the interfaces are not the same this time
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            2)

        data_settings_model_part = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "TEMPERATURE",
            "location"        : "model_part"
        }""")

        data_model_part = CouplingInterfaceData(data_settings_model_part,
                                                self.model)
        data_model_part.Initialize()

        with self.assertRaisesRegex(
                Exception,
                'Currently only historical nodal values are supported'):
            data_transfer_op.TransferData(self.origin_data_scalar,
                                          data_model_part,
                                          transfer_options_empty)

    def test_copy_single_to_dist_transfer_operator(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 1)

        with self.assertRaisesRegex(
                Exception,
                'Interface data "default" of solver "default_solver" requires to be of size 1, got: 5'
        ):
            data_transfer_op.TransferData(
                self.origin_data_scalar, self.destination_matching_data_scalar,
                transfer_options)

    def test_copy_single_to_dist_transfer_operator_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["swap_sign"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -1)

    def test_copy_single_to_dist_transfer_operator_distribute_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["distribute_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 0.2)

    def test_copy_single_to_dist_transfer_operator_add_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add = KM.Parameters(""" ["add_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 1)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 2)

    def test_copy_single_to_dist_transfer_operator_distribute_values_swap_sign(
            self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(
            """ ["distribute_values", "swap_sign"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.2)

    def test_copy_single_to_dist_transfer_operator_distribute_values_swap_sign_add_values(
            self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(
            """ ["distribute_values", "swap_sign"] """)
        transfer_options_with_add_vals = KM.Parameters(
            """ ["distribute_values", "swap_sign", "add_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.2)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_with_add_vals)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.4)

    def test_sum_dist_to_single(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 5)

        with self.assertRaisesRegex(
                Exception,
                'Interface data "default" of solver "default_solver" requires to be of size 1, got: 5'
        ):
            data_transfer_op.TransferData(
                self.origin_data_scalar, self.destination_matching_data_scalar,
                transfer_options)

    def test_sum_dist_to_single_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["swap_sign"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, -5)

    def test_sum_dist_to_single_add_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["add_values"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        for node in self.destination_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_FORCE, 0, 500.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 10.0)

    def test_sum_dist_to_single_add_values_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["add_values", "swap_sign"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        for node in self.destination_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_FORCE, 0, 500.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 0.0)

    def test_sum_dist_to_single_check_var(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        with self.assertRaisesRegex(
                Exception,
                'Variable of interface data "default" of solver "default_solver" has to be a scalar!'
        ):
            data_transfer_op.TransferData(
                self.destination_matching_data_vector,
                self.destination_data_single_node, transfer_options)

    def test_copy_single_to_dist_check_var(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        with self.assertRaisesRegex(
                Exception,
                'Variable of interface data "default" of solver "default_solver" has to be a scalar!'
        ):
            data_transfer_op.TransferData(
                self.destination_data_single_node,
                self.destination_matching_data_vector, transfer_options)

    def __TestTransferMatching(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2)

    def __TestTransferMatchingInverse(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        data_transfer_op.TransferData(self.destination_matching_data_scalar,
                                      self.origin_data_scalar,
                                      transfer_options_empty)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE)
        data_transfer_op.TransferData(self.destination_matching_data_vector,
                                      self.origin_data_vector,
                                      transfer_options_empty)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2)

        transfer_options_fail = KM.Parameters(
            """ ["thisWillHopefullyNeverBeImplementedOtherWiseThisTestWillFail"] """
        )
        with self.assertRaisesRegex(Exception, ' not recognized for '):
            data_transfer_op.TransferData(
                self.origin_data_scalar, self.destination_matching_data_scalar,
                transfer_options_fail)

    def __TestTransferMatchingSwapSign(self, data_transfer_op):
        transfer_options_swap_sign = KM.Parameters(""" ["swap_sign"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_swap_sign)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, -1.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_swap_sign)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, -1.0)

    def __TestTransferMatchingAddValues(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add_values = KM.Parameters(""" ["add_values"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, 2.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, 2.0)

    def __TestTransferMatchingAddValuesAndSwapSign(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add_values = KM.Parameters(""" ["add_values"] """)
        transfer_options_add_values_swap_sign = KM.Parameters(
            """ ["add_values", "swap_sign"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values_swap_sign)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, 2.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values_swap_sign)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, 2.0)

    def __CompareScalarNodalValues(self,
                                   nodes,
                                   nodes_ref,
                                   var,
                                   var_ref,
                                   factor=1.0):
        for node, node_ref in zip(nodes, nodes_ref):
            self.assertAlmostEqual(
                node.GetSolutionStepValue(var),
                node_ref.GetSolutionStepValue(var_ref) * factor, 10)

    def __CompareVectorNodalValues(self,
                                   nodes,
                                   nodes_ref,
                                   var,
                                   var_ref,
                                   dimension,
                                   factor=1.0):
        for node, node_ref in zip(nodes, nodes_ref):
            val = node.GetSolutionStepValue(var)
            val_ref = node_ref.GetSolutionStepValue(var_ref)
            for i in range(dimension):
                self.assertAlmostEqual(val[i], val_ref[i] * factor, 10)
Exemplo n.º 21
0
    def test_kratos_mapping_transfer_operator(self):
        if not mapping_app_available:
            self.skipTest("MappingApplication not available!")

        data_transfer_op_settings_missing = KM.Parameters("""{
            "type" : "kratos_mapping"
        }""")

        exp_error = 'No "mapper_settings" provided!'
        with self.assertRaisesRegex(Exception, exp_error):
            data_transfer_operator_factory.CreateDataTransferOperator(
                data_transfer_op_settings_missing)

        data_transfer_op_settings = KM.Parameters("""{
            "type" : "kratos_mapping",
            "mapper_settings" : {
                "mapper_type" : "nearest_neighbor"
            }
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)

        self.__TestTransferMatching(data_transfer_op)
        self.__TestTransferMatchingSwapSign(data_transfer_op)
        self.__TestTransferMatchingAddValues(data_transfer_op)
        self.__TestTransferMatchingAddValuesAndSwapSign(data_transfer_op)

        # with this we make sure that only one mapper is created (and not several ones for each mapping operation!)
        # Hint: requires access to private member
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            1)

        self.__TestTransferMatchingInverse(data_transfer_op)
        # here we check explicitly the InverseMap fct
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            1)

        transfer_options_empty = KM.Parameters(""" [] """)
        data_transfer_op.TransferData(
            self.origin_data_scalar, self.destination_non_matching_data_scalar,
            transfer_options_empty)
        # here we check explicitly the creation of a second mapper, which is required since the interfaces are not the same this time
        self.assertEqual(
            len(data_transfer_op._KratosMappingDataTransferOperator__mappers),
            2)

        data_settings_model_part = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "TEMPERATURE",
            "location"        : "model_part"
        }""")

        data_model_part = CouplingInterfaceData(data_settings_model_part,
                                                self.model)
        data_model_part.Initialize()

        with self.assertRaisesRegex(
                Exception,
                'Currently only historical nodal values are supported'):
            data_transfer_op.TransferData(self.origin_data_scalar,
                                          data_model_part,
                                          transfer_options_empty)
class TestConvergenceAcceleratorWrapper(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        self.model_part = self.model.CreateModelPart("default")
        self.model_part.AddNodalSolutionStepVariable(KM.PRESSURE)
        self.model_part.AddNodalSolutionStepVariable(KM.PARTITION_INDEX)
        self.dimension = 3
        self.model_part.ProcessInfo[KM.DOMAIN_SIZE] = self.dimension

        self.my_pid = KM.DataCommunicator.GetDefault().Rank()
        self.num_nodes = self.my_pid % 5 + 3  # num_nodes in range (3 ... 7)
        if self.my_pid == 4:
            self.num_nodes = 0  # in order to emulate one partition not having local nodes

        for i in range(self.num_nodes):
            node = self.model_part.CreateNewNode(
                i, 0.1 * i, 0.0, 0.0
            )  # this creates the same coords in different ranks, which does not matter for this test

            node.SetSolutionStepValue(KM.PARTITION_INDEX, self.my_pid)
            node.SetSolutionStepValue(KM.PRESSURE, uniform(-10, 50))

        if KM.IsDistributedRun():
            KratosMPI.ParallelFillCommunicator(self.model_part).Execute()

        data_settings = KM.Parameters("""{
            "model_part_name" : "default",
            "variable_name"   : "PRESSURE"
        }""")
        self.interface_data = CouplingInterfaceData(data_settings, self.model)
        self.interface_data.Initialize()

        self.dummy_solver_wrapper = DummySolverWrapper(
            {"data_4_testing": self.interface_data})

    def test_accelerator_without_support_for_distributed_data(self):
        conv_acc_settings = KM.Parameters("""{
            "type"      : "constant_relaxation",
            "data_name" : "data_4_testing"
        }""")
        conv_acc_wrapper = ConvergenceAcceleratorWrapper(
            conv_acc_settings, self.dummy_solver_wrapper)

        exp_inp = self.interface_data.GetData()
        update_solution_return_value = [
            uniform(-10, 50) for _ in range(self.num_nodes)
        ]

        global_update_solution_return_value = np.array(
            np.concatenate(KM.DataCommunicator.GetDefault().GathervDoubles(
                update_solution_return_value, 0)))

        conv_acc_mock = Mock()

        attrs = {
            'SupportsDistributedData.return_value': False,
            'UpdateSolution.return_value': global_update_solution_return_value
        }
        conv_acc_mock.configure_mock(**attrs)

        conv_acc_wrapper.conv_acc = conv_acc_mock

        conv_acc_wrapper.InitializeSolutionStep()

        self.assertEqual(conv_acc_mock.SupportsDistributedData.call_count, 1)
        self.assertEqual(
            conv_acc_wrapper.gather_scatter_required,
            self.interface_data.IsDistributed(
            ))  # gather-scatter is only required in case of distributed data
        self.assertEqual(conv_acc_wrapper.executing_rank, self.my_pid == 0)

        conv_acc_wrapper.InitializeNonLinearIteration()

        # setting new solution for computing the residual
        rand_data = [uniform(-10, 50) for _ in range(self.num_nodes)]
        self.interface_data.SetData(rand_data)
        exp_res = rand_data - exp_inp

        conv_acc_wrapper.ComputeAndApplyUpdate()

        self.assertEqual(
            conv_acc_mock.UpdateSolution.call_count,
            int(self.my_pid == 0))  # only one rank calls "UpdateSolution"
        global_exp_res = np.array(
            np.concatenate(KM.DataCommunicator.GetDefault().GathervDoubles(
                exp_res, 0)))
        global_exp_inp = np.array(
            np.concatenate(KM.DataCommunicator.GetDefault().GathervDoubles(
                exp_inp, 0)))
        if self.my_pid == 0:
            # numpy arrays cannot be compared using the mock-functions, hence using the numpy functions
            np.testing.assert_array_equal(
                global_exp_res, conv_acc_mock.UpdateSolution.call_args[0][0])
            np.testing.assert_array_equal(
                global_exp_inp, conv_acc_mock.UpdateSolution.call_args[0][1])

        np.testing.assert_array_equal(exp_inp + update_solution_return_value,
                                      self.interface_data.GetData())

    def test_accelerator_with_support_for_distributed_data(self):
        conv_acc_settings = KM.Parameters("""{
            "type"      : "constant_relaxation",
            "data_name" : "data_4_testing"
        }""")
        conv_acc_wrapper = ConvergenceAcceleratorWrapper(
            conv_acc_settings, self.dummy_solver_wrapper)

        exp_inp = self.interface_data.GetData()
        update_solution_return_value = [
            uniform(-10, 50) for _ in range(self.num_nodes)
        ]

        conv_acc_mock = Mock()

        attrs = {
            'SupportsDistributedData.return_value': True,
            'UpdateSolution.return_value': update_solution_return_value
        }
        conv_acc_mock.configure_mock(**attrs)

        conv_acc_wrapper.conv_acc = conv_acc_mock

        conv_acc_wrapper.InitializeSolutionStep()

        self.assertEqual(conv_acc_mock.SupportsDistributedData.call_count, 1)
        self.assertFalse(conv_acc_wrapper.gather_scatter_required)
        self.assertTrue(conv_acc_wrapper.executing_rank)

        conv_acc_wrapper.InitializeNonLinearIteration()

        # setting new solution for computing the residual
        rand_data = [uniform(-10, 50) for _ in range(self.num_nodes)]
        self.interface_data.SetData(rand_data)
        exp_res = rand_data - exp_inp

        conv_acc_wrapper.ComputeAndApplyUpdate()

        self.assertEqual(conv_acc_mock.UpdateSolution.call_count, 1)

        # numpy arrays cannot be compared using the mock-functions, hence using the numpy functions
        np.testing.assert_array_equal(
            exp_res, conv_acc_mock.UpdateSolution.call_args[0][0])
        np.testing.assert_array_equal(
            exp_inp, conv_acc_mock.UpdateSolution.call_args[0][1])

        np.testing.assert_array_equal(exp_inp + update_solution_return_value,
                                      self.interface_data.GetData())
Exemplo n.º 23
0
class TestConvergenceCriteriaWrapper(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        self.model_part = self.model.CreateModelPart("default")
        self.model_part.AddNodalSolutionStepVariable(KM.PRESSURE)
        self.model_part.AddNodalSolutionStepVariable(KM.PARTITION_INDEX)
        self.dimension = 3
        self.model_part.ProcessInfo[KM.DOMAIN_SIZE] = self.dimension

        self.my_pid = KM.DataCommunicator.GetDefault().Rank()
        self.num_nodes = self.my_pid % 5 + 3  # num_nodes in range (3 ... 7)
        if self.my_pid == 4:
            self.num_nodes = 0  # in order to emulate one partition not having local nodes

        for i in range(self.num_nodes):
            node = self.model_part.CreateNewNode(
                i, 0.1 * i, 0.0, 0.0
            )  # this creates the same coords in different ranks, which does not matter for this test

            node.SetSolutionStepValue(KM.PARTITION_INDEX, self.my_pid)
            node.SetSolutionStepValue(KM.PRESSURE, uniform(-10, 50))

        if KM.IsDistributedRun():
            KratosMPI.ParallelFillCommunicator(self.model_part).Execute()

        data_settings = KM.Parameters("""{
            "model_part_name" : "default",
            "variable_name"   : "PRESSURE"
        }""")
        self.interface_data = CouplingInterfaceData(data_settings, self.model)
        self.interface_data.Initialize()

        self.dummy_solver_wrapper = DummySolverWrapper(
            {"data_4_testing": self.interface_data})

    def test_wrapper(self):
        conv_acc_settings = KM.Parameters("""{
            "type"      : "relative_norm_previous_residual",
            "data_name" : "data_4_testing"
        }""")
        conv_crit_wrapper = ConvergenceCriteriaWrapper(
            conv_acc_settings, self.dummy_solver_wrapper)

        data_init = self.interface_data.GetData()

        conv_crit_mock = Mock()

        is_converged = True
        attrs = {'IsConverged.return_value': is_converged}
        conv_crit_mock.configure_mock(**attrs)

        conv_crit_wrapper.conv_crit = conv_crit_mock

        conv_crit_wrapper.InitializeSolutionStep()

        conv_crit_wrapper.InitializeNonLinearIteration()

        # setting new solution for computing the residual
        rand_data = [uniform(-10, 50) for _ in range(self.num_nodes)]
        self.interface_data.SetData(rand_data)
        exp_res = rand_data - data_init

        self.assertEqual(conv_crit_wrapper.IsConverged(), is_converged)

        self.assertEqual(
            conv_crit_mock.IsConverged.call_count,
            int(self.my_pid == 0))  # only one rank calls "IsConverged"

        global_exp_res = np.array(
            np.concatenate(KM.DataCommunicator.GetDefault().GathervDoubles(
                exp_res, 0)))
        global_rand_data_inp = np.array(
            np.concatenate(KM.DataCommunicator.GetDefault().GathervDoubles(
                rand_data, 0)))
        if self.my_pid == 0:
            # numpy arrays cannot be compared using the mock-functions, hence using the numpy functions
            np.testing.assert_array_equal(
                global_exp_res, conv_crit_mock.IsConverged.call_args[0][0])
            np.testing.assert_array_equal(
                global_rand_data_inp,
                conv_crit_mock.IsConverged.call_args[0][1])
Exemplo n.º 24
0
class TestScalingOperation(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        self.model_part = self.model.CreateModelPart("default")
        self.model_part.AddNodalSolutionStepVariable(KM.PRESSURE)
        self.model_part.ProcessInfo[KM.TIME] = 0.0
        self.model_part.ProcessInfo[KM.STEP] = 0

        for i in range(5):
            new_node = self.model_part.CreateNewNode(i + 1, i * 0.1, 0.0, 0.0)
            new_node.SetSolutionStepValue(KM.PRESSURE, 0, i + 1.3)

        data_settings = KM.Parameters("""{
            "model_part_name" : "default",
            "variable_name"   : "PRESSURE"
        }""")
        self.interface_data = CouplingInterfaceData(data_settings, self.model)
        self.interface_data.Initialize()

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

        self.solver_process_info = KM.ProcessInfo()

    def test_constant_scaling(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_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_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_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_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_scaling_in_interval_2(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.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 __ExecuteTest(self, scaling_operation, factors):
        scaling_operation.Check()

        for fac in factors:
            self.model_part.ProcessInfo[KM.TIME] += 0.25
            self.model_part.ProcessInfo[KM.STEP] += 1

            old_data = self.interface_data.GetData()

            scaling_operation.Execute()

            new_data = self.interface_data.GetData()

            self.__CompareValues(old_data, new_data, fac)

    def __CompareValues(self, old_data, new_data, factor):
        for old_val, new_val in zip(old_data, new_data):
            self.assertAlmostEqual(old_val * factor, new_val)
Exemplo n.º 25
0
class TestDataTransferOperators(KratosUnittest.TestCase):
    def setUp(self):
        self.model = KM.Model()
        mp_o = self.model.CreateModelPart("mp_origin", 2)
        mp_d_m = self.model.CreateModelPart("mp_destination_matching", 2)
        mp_d_nm = self.model.CreateModelPart("mp_destination_non_matching", 2)
        mp_one_n = self.model.CreateModelPart("mp_single_node", 2)

        mp_o.AddNodalSolutionStepVariable(KM.PRESSURE)
        mp_o.AddNodalSolutionStepVariable(KM.DISPLACEMENT)
        mp_d_m.AddNodalSolutionStepVariable(KM.TEMPERATURE)
        mp_d_m.AddNodalSolutionStepVariable(KM.FORCE)
        mp_d_nm.AddNodalSolutionStepVariable(KM.TEMPERATURE)
        mp_d_nm.AddNodalSolutionStepVariable(KM.FORCE)
        mp_one_n.AddNodalSolutionStepVariable(KMC.SCALAR_DISPLACEMENT)
        mp_one_n.AddNodalSolutionStepVariable(KMC.SCALAR_FORCE)

        mp_o.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_d_m.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_d_nm.ProcessInfo[KM.DOMAIN_SIZE] = 2
        mp_one_n.ProcessInfo[KM.DOMAIN_SIZE] = 2

        num_nodes_matching = 5
        num_nodes_non_matching = 8

        for i in range(num_nodes_matching):
            node_id = i + 1
            node_o = mp_o.CreateNewNode(node_id, 0.0, 0.0, i + 1)
            mp_d_m.CreateNewNode(node_id, 0.0, 0.0, i + 1)

            node_o.SetSolutionStepValue(KM.PRESSURE, 0,
                                        ScalarValueFromId(node_id))
            node_o.SetSolutionStepValue(KM.DISPLACEMENT, 0,
                                        VectorValueFromId(node_id))

        for i in range(num_nodes_non_matching - 1, -1, -1):
            node_id = i + 15
            mp_d_nm.CreateNewNode(node_id, 0.0, 0.0, i + 1.1)

        mp_one_n.CreateNewNode(1, 0.0, 0.0, 0.0)

        origin_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_origin",
            "variable_name"   : "PRESSURE"
        }""")
        origin_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_origin",
            "variable_name"   : "DISPLACEMENT",
            "dimension" : 2
        }""")
        origin_data_settings_single_node = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "SCALAR_DISPLACEMENT"
        }""")

        self.origin_data_scalar = CouplingInterfaceData(
            origin_data_settings_scalar, self.model)
        self.origin_data_vector = CouplingInterfaceData(
            origin_data_settings_vector, self.model)
        self.origin_data_single_node = CouplingInterfaceData(
            origin_data_settings_single_node, self.model)
        self.origin_data_scalar.Initialize()
        self.origin_data_vector.Initialize()
        self.origin_data_single_node.Initialize()

        destination_matching_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_destination_matching",
            "variable_name"   : "TEMPERATURE"
        }""")
        destination_matching_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_destination_matching",
            "variable_name"   : "FORCE",
            "dimension" : 2
        }""")
        destination_data_settings_single_node = KM.Parameters("""{
            "model_part_name" : "mp_single_node",
            "variable_name"   : "SCALAR_FORCE"
        }""")

        self.destination_matching_data_scalar = CouplingInterfaceData(
            destination_matching_data_settings_scalar, self.model)
        self.destination_matching_data_vector = CouplingInterfaceData(
            destination_matching_data_settings_vector, self.model)
        self.destination_data_single_node = CouplingInterfaceData(
            destination_data_settings_single_node, self.model)
        self.destination_matching_data_scalar.Initialize()
        self.destination_matching_data_vector.Initialize()
        self.destination_data_single_node.Initialize()

        destination_non_matching_data_settings_scalar = KM.Parameters("""{
            "model_part_name" : "mp_destination_non_matching",
            "variable_name"   : "TEMPERATURE"
        }""")
        destination_non_matching_data_settings_vector = KM.Parameters("""{
            "model_part_name" : "mp_destination_non_matching",
            "variable_name"   : "FORCE",
            "dimension" : 2
        }""")

        self.destination_non_matching_data_scalar = CouplingInterfaceData(
            destination_non_matching_data_settings_scalar, self.model)
        self.destination_non_matching_data_vector = CouplingInterfaceData(
            destination_non_matching_data_settings_vector, self.model)
        self.destination_non_matching_data_scalar.Initialize()
        self.destination_non_matching_data_vector.Initialize()

    def test_copy_transfer_operator(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)

        self.__TestTransferMatching(data_transfer_op)
        self.__TestTransferMatchingSwapSign(data_transfer_op)
        self.__TestTransferMatchingAddValues(data_transfer_op)
        self.__TestTransferMatchingAddValuesAdSwapSign(data_transfer_op)

        transfer_options_empty = KM.Parameters(""" [] """)
        exp_error = 'The sizes of the data are not matching: {} != {}!'.format(
            self.origin_data_scalar.Size(),
            self.destination_non_matching_data_scalar.Size())
        with self.assertRaisesRegex(Exception, exp_error):
            data_transfer_op.TransferData(
                self.origin_data_scalar,
                self.destination_non_matching_data_scalar,
                transfer_options_empty)

    def test_kratos_mapping_transfer_operator(self):
        if using_pykratos:
            self.skipTest("This test cannot be run with pyKratos!")
        if not mapping_app_available:
            self.skipTest("MappingApplication not available!")

        data_transfer_op_settings_missing = KM.Parameters("""{
            "type" : "kratos_mapping"
        }""")

        exp_error = 'No "mapper_settings" provided!'
        with self.assertRaisesRegex(Exception, exp_error):
            data_transfer_operator_factory.CreateDataTransferOperator(
                data_transfer_op_settings_missing)

        data_transfer_op_settings = KM.Parameters("""{
            "type" : "kratos_mapping",
            "mapper_settings" : {
                "mapper_type" : "nearest_neighbor"
            }
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)

        self.__TestTransferMatching(data_transfer_op)
        self.__TestTransferMatchingSwapSign(data_transfer_op)
        self.__TestTransferMatchingAddValues(data_transfer_op)
        self.__TestTransferMatchingAddValuesAdSwapSign(data_transfer_op)

    def test_copy_single_to_dist_transfer_operator(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 1)

    def test_copy_single_to_dist_transfer_operator_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["swap_sign"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -1)

    def test_copy_single_to_dist_transfer_operator_distribute_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["distribute_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 0.2)

    def test_copy_single_to_dist_transfer_operator_add_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add = KM.Parameters(""" ["add_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 1)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, 2)

    def test_copy_single_to_dist_transfer_operator_distribute_values_swap_sign(
            self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(
            """ ["distribute_values", "swap_sign"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.2)

    def test_copy_single_to_dist_transfer_operator_distribute_values_swap_sign_add_values(
            self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(
            """ ["distribute_values", "swap_sign"] """)
        transfer_options_with_add_vals = KM.Parameters(
            """ ["distribute_values", "swap_sign", "add_values"] """)

        for node in self.origin_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_DISPLACEMENT, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.2)

        data_transfer_op.TransferData(self.origin_data_single_node,
                                      self.destination_matching_data_scalar,
                                      transfer_options_with_add_vals)

        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_single_node.GetModelPart().Nodes, KM.TEMPERATURE,
            KMC.SCALAR_DISPLACEMENT, -0.4)

    def test_sum_dist_to_single(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 5)

    def test_sum_dist_to_single_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["swap_sign"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, -5)

    def test_sum_dist_to_single_add_values(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["add_values"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        for node in self.destination_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_FORCE, 0, 500.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 10.0)

    def test_sum_dist_to_single_add_values_swap_sign(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" ["add_values", "swap_sign"] """)

        for node in self.origin_data_scalar.GetModelPart().Nodes:
            node.SetSolutionStepValue(KM.PRESSURE, 0, 100.0)

        for node in self.destination_data_single_node.GetModelPart().Nodes:
            node.SetSolutionStepValue(KMC.SCALAR_FORCE, 0, 500.0)

        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_data_single_node,
                                      transfer_options)

        self.__CompareScalarNodalValues(
            self.destination_data_single_node.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KMC.SCALAR_FORCE,
            KM.PRESSURE, 0.0)

    def test_sum_dist_to_single_check_var(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "sum_distributed_to_single"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        with self.assertRaisesRegex(
                Exception,
                'Variable of interface data "default" of solver "default_solver" has to be a scalar!'
        ):
            data_transfer_op.TransferData(
                self.destination_matching_data_vector,
                self.destination_data_single_node, transfer_options)

    def test_copy_single_to_dist_check_var(self):
        data_transfer_op_settings = KM.Parameters("""{
            "type" : "copy_single_to_distributed"
        }""")

        data_transfer_op = data_transfer_operator_factory.CreateDataTransferOperator(
            data_transfer_op_settings)
        transfer_options = KM.Parameters(""" [] """)

        with self.assertRaisesRegex(
                Exception,
                'Variable of interface data "default" of solver "default_solver" has to be a scalar!'
        ):
            data_transfer_op.TransferData(
                self.destination_data_single_node,
                self.destination_matching_data_vector, transfer_options)

    def __TestTransferMatching(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2)

    def __TestTransferMatchingSwapSign(self, data_transfer_op):
        transfer_options_swap_sign = KM.Parameters(""" ["swap_sign"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_swap_sign)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, -1.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_swap_sign)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, -1.0)

    def __TestTransferMatchingAddValues(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add_values = KM.Parameters(""" ["add_values"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, 2.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, 2.0)

    def __TestTransferMatchingAddValuesAdSwapSign(self, data_transfer_op):
        transfer_options_empty = KM.Parameters(""" [] """)
        transfer_options_add_values = KM.Parameters(""" ["add_values"] """)
        transfer_options_add_values_swap_sign = KM.Parameters(
            """ ["add_values", "swap_sign"] """)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_scalar,
                                      self.destination_matching_data_scalar,
                                      transfer_options_add_values_swap_sign)
        self.__CompareScalarNodalValues(
            self.destination_matching_data_scalar.GetModelPart().Nodes,
            self.origin_data_scalar.GetModelPart().Nodes, KM.TEMPERATURE,
            KM.PRESSURE, 2.0)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_empty)  # "resetting"
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values)
        data_transfer_op.TransferData(self.origin_data_vector,
                                      self.destination_matching_data_vector,
                                      transfer_options_add_values_swap_sign)
        self.__CompareVectorNodalValues(
            self.destination_matching_data_vector.GetModelPart().Nodes,
            self.origin_data_vector.GetModelPart().Nodes, KM.FORCE,
            KM.DISPLACEMENT, 2, 2.0)

    def __CompareScalarNodalValues(self,
                                   nodes,
                                   nodes_ref,
                                   var,
                                   var_ref,
                                   factor=1.0):
        for node, node_ref in zip(nodes, nodes_ref):
            self.assertAlmostEqual(
                node.GetSolutionStepValue(var),
                node_ref.GetSolutionStepValue(var_ref) * factor, 10)

    def __CompareVectorNodalValues(self,
                                   nodes,
                                   nodes_ref,
                                   var,
                                   var_ref,
                                   dimension,
                                   factor=1.0):
        for node, node_ref in zip(nodes, nodes_ref):
            val = node.GetSolutionStepValue(var)
            val_ref = node_ref.GetSolutionStepValue(var_ref)
            for i in range(dimension):
                self.assertAlmostEqual(val[i], val_ref[i] * factor, 10)