def __init__(self, model, custom_settings):
        old_unused_settings = [
            "use_computing_model_part", "computing_model_part_name",
            "problem_domain_sub_model_part_list",
            "processes_sub_model_part_list"
        ]

        for old_setting in old_unused_settings:
            if custom_settings.Has(old_setting):
                KratosMultiphysics.Logger.PrintWarning(
                    "::[MechanicalSolver]:: ",
                    'Settings contain no longer used setting, please remove it: "{}"'
                    .format(old_setting))
                custom_settings.RemoveValue(old_setting)

        settings_have_use_block_builder = custom_settings.Has("block_builder")

        if settings_have_use_block_builder:
            kratos_utilities.IssueDeprecationWarning(
                'MechanicalSolver',
                'Using "block_builder", please move it to "builder_and_solver_settings" as "use_block_builder"'
            )
            if not custom_settings.Has("builder_and_solver_settings"):
                custom_settings.AddEmptyValue("builder_and_solver_settings")

            custom_settings["builder_and_solver_settings"].AddValue(
                "use_block_builder", custom_settings["block_builder"])
            custom_settings.RemoveValue("block_builder")

        self._validate_settings_in_baseclass = True  # To be removed eventually
        super().__init__(model, custom_settings)

        model_part_name = self.settings["model_part_name"].GetString()

        if model_part_name == "":
            raise Exception('Please specify a model_part name!')

        if self.model.HasModelPart(model_part_name):
            self.main_model_part = self.model[model_part_name]
        else:
            self.main_model_part = self.model.CreateModelPart(model_part_name)
            domain_size = self.settings["domain_size"].GetInt()
            if domain_size < 0:
                raise Exception('Please specify a "domain_size" >= 0!')
            self.main_model_part.ProcessInfo.SetValue(
                KratosMultiphysics.DOMAIN_SIZE, domain_size)

        KratosMultiphysics.Logger.PrintInfo("::[MechanicalSolver]:: ",
                                            "Construction finished")

        # Set if the analysis is restarted
        if self.settings["model_import_settings"]["input_type"].GetString(
        ) == "rest":
            self.main_model_part.ProcessInfo[
                KratosMultiphysics.IS_RESTARTED] = True
        else:
            self.main_model_part.ProcessInfo[
                KratosMultiphysics.IS_RESTARTED] = False
Beispiel #2
0
    def __init__(self, model, custom_settings):
        settings_have_smps_for_comp_mp = custom_settings.Has(
            "problem_domain_sub_model_part_list") or custom_settings.Has(
                "processes_sub_model_part_list")

        if settings_have_smps_for_comp_mp:
            kratos_utils.IssueDeprecationWarning(
                'MechanicalSolver',
                'Using "problem_domain_sub_model_part_list" and "processes_sub_model_part_list" is deprecated, please remove it from your "solver_settings"'
            )

        self._validate_settings_in_baseclass = True  # To be removed eventually
        super(MechanicalSolver, self).__init__(model, custom_settings)

        model_part_name = self.settings["model_part_name"].GetString()

        if model_part_name == "":
            raise Exception('Please specify a model_part name!')

        # for explicitly constructing the computing modelpart as a submodelpart of the mainmodelpart
        self.use_computing_model_part = custom_settings[
            "use_computing_model_part"].GetBool()
        if not self.use_computing_model_part and settings_have_smps_for_comp_mp:
            raise Exception(
                '"problem_domain_sub_model_part_list" and "processes_sub_model_part_list" can only be specified when NOT using a ComputingModelPart! It is recommended Not to use a ComputingModelPart, then the entire Modelpart is used for the computation. At some point always the entire Modelpart will be used!'
            )

        # Only needed during the transition of removing the ComputingModelPart
        if self.settings["problem_domain_sub_model_part_list"].size() == 0:
            self.settings["problem_domain_sub_model_part_list"].Append(
                model_part_name)
        if self.settings["processes_sub_model_part_list"].size() == 0:
            self.settings["processes_sub_model_part_list"].Append(
                model_part_name)

        if self.model.HasModelPart(model_part_name):
            self.main_model_part = self.model[model_part_name]
        else:
            self.main_model_part = self.model.CreateModelPart(model_part_name)
            domain_size = self.settings["domain_size"].GetInt()
            if domain_size < 0:
                raise Exception('Please specify a "domain_size" >= 0!')
            self.main_model_part.ProcessInfo.SetValue(
                KratosMultiphysics.DOMAIN_SIZE, domain_size)

        KratosMultiphysics.Logger.PrintInfo("::[MechanicalSolver]:: ",
                                            "Construction finished")

        # Set if the analysis is restarted
        if self.settings["model_import_settings"]["input_type"].GetString(
        ) == "rest":
            self.main_model_part.ProcessInfo[
                KratosMultiphysics.IS_RESTARTED] = True
        else:
            self.main_model_part.ProcessInfo[
                KratosMultiphysics.IS_RESTARTED] = False
def CreateSolverByParameters(model, solver_settings, parallelism):

    solver_type = solver_settings["solver_type"].GetString()

    if solver_settings.Has("time_integration_method"):
        time_integration_method = solver_settings[
            "time_integration_method"].GetString()
    else:
        time_integration_method = "implicit"  # defaulting to implicit time-integration

    try_import_custom_solver = False

    # Solvers for OpenMP parallelism
    if parallelism == "OpenMP":
        if solver_type == "dynamic" or solver_type == "Dynamic":
            if time_integration_method == "implicit":
                solver_module_name = "structural_mechanics_implicit_dynamic_solver"
            elif time_integration_method == "explicit":
                solver_module_name = "structural_mechanics_explicit_dynamic_solver"
            else:
                err_msg = "The requested time integration method \"" + time_integration_method + "\" is not in the python solvers wrapper\n"
                err_msg += "Available options are: \"implicit\", \"explicit\""
                raise Exception(err_msg)

        elif solver_type == "static" or solver_type == "Static":
            solver_module_name = "structural_mechanics_static_solver"

        elif solver_type == "eigen_value":
            solver_module_name = "structural_mechanics_eigensolver"

        elif solver_type == "harmonic_analysis":
            solver_module_name = "structural_mechanics_harmonic_analysis_solver"

        elif solver_type == "formfinding":
            solver_module_name = "structural_mechanics_formfinding_solver"

        elif solver_type == "adjoint_static":
            solver_module_name = "structural_mechanics_adjoint_static_solver"

        else:
            available_solver_types = [
                "static", "dynamic", "eigen_value", "harmonic_analysis",
                "formfinding", "adjoint_static"
            ]
            try_import_custom_solver = True

    # Solvers for MPI parallelism
    elif parallelism == "MPI":
        if solver_type == "dynamic" or solver_type == "Dynamic":
            if time_integration_method == "implicit":
                solver_module_name = "trilinos_structural_mechanics_implicit_dynamic_solver"
            else:
                err_msg = "The requested time integration method \"" + time_integration_method + "\" is not in the python solvers wrapper\n"
                err_msg += "Available options are: \"implicit\""
                raise Exception(err_msg)

        elif solver_type == "static" or solver_type == "Static":
            solver_module_name = "trilinos_structural_mechanics_static_solver"

        else:
            available_solver_types = ["static", "dynamic"]
            try_import_custom_solver = True
    else:
        err_msg = "The requested parallel type \"" + parallelism + "\" is not available!\n"
        err_msg += "Available options are: \"OpenMP\", \"MPI\""
        raise Exception(err_msg)

    if try_import_custom_solver:
        KratosMultiphysics.Logger.PrintInfo(
            "MechanicalSolversWrapper",
            'Selected "solver_type" "{0}" not available in the python solvers wrapper, attempting to import custom solver from module "{0}"'
            .format(solver_type))
        try:
            solver = import_module(solver_type).CreateSolver(
                model, solver_settings)
            KratosMultiphysics.Logger.PrintInfo(
                "MechanicalSolversWrapper",
                'Using custom solver "{}", defined in module "{}"'.format(
                    solver.__class__.__name__, solver.__class__.__module__))
            return solver
        except:
            err_msg = 'Importing custom solver from module "{}" failed.\n'.format(
                solver_type)
            err_msg += 'The requested solver type "{}" is not in the python solvers wrapper\n'.format(
                solver_type)
            err_msg += "Available options are: {}".format(
                ', '.join(available_solver_types))
            raise Exception(err_msg)

    if solver_settings.Has("contact_settings"):  # This is a contact problem
        kratos_module = "KratosMultiphysics.ContactStructuralMechanicsApplication"
        solver_module_name = "contact_" + solver_module_name

    elif solver_settings.Has(
            "mpc_contact_settings"):  # This is a mpc contact problem
        kratos_module = "KratosMultiphysics.ContactStructuralMechanicsApplication"
        solver_module_name = "mpc_contact_" + solver_module_name

    else:
        kratos_module = "KratosMultiphysics.StructuralMechanicsApplication"

        if solver_settings.Has("use_computing_model_part"):
            if solver_settings["use_computing_model_part"].GetBool():
                kratos_utils.IssueDeprecationWarning(
                    'MechanicalSolver',
                    'Using ["use_computing_model_part" : True] is deprecated, please remove this setting'
                )
        elif not (solver_settings.Has("problem_domain_sub_model_part_list")
                  or solver_settings.Has("processes_sub_model_part_list")):
            solver_settings.AddEmptyValue("use_computing_model_part").SetBool(
                False)

    solver = import_module(kratos_module + "." +
                           solver_module_name).CreateSolver(
                               model, solver_settings)

    return solver