예제 #1
0
    def ExecuteInitialize(self):

        # set model part
        self.model_part = self.model[
            self.settings["model_part_name"].GetString()]

        self.TimeDiscretizationProcess = KratosSolid.TimeDiscretizationProcess(
            self.model_part, self.settings)
    def ExecuteInitialize(self):

        # set model part
        self.model_part = self.model[self.settings["model_part_name"].GetString()]
        if( self.model_part.ProcessInfo[KratosMultiphysics.IS_RESTARTED] == False ):
            self.model_part.ProcessInfo.SetValue(KratosMultiphysics.INTERVAL_END_TIME, self.interval[1])
        
        # set processes
        params = KratosMultiphysics.Parameters("{}")           
        params.AddValue("model_part_name", self.settings["model_part_name"])

        params.AddEmptyValue("value")
        params.__setitem__("value", self.settings["direction"])
        
        if( self.value_is_numeric ):

            params.AddValue("variable_name", self.settings["variable_name"])

            counter = 0
            for i in self.value:
                params["value"][counter].SetDouble(i)
                counter+=1
                
            self.AssignValueProcess = KratosSolid.AssignVectorToConditionsProcess(self.model_part, params)

        else:

            #function values are assigned to a vector variable :: transformation is needed
            if(type(self.var) == KratosMultiphysics.Array1DVariable3):
                variable_name = self.settings["variable_name"].GetString() + "_VECTOR"
                print(" variable name modified:", variable_name)
                params.AddEmptyValue("variable_name")
                params["variable_name"].SetString(variable_name)
            else:
                params.AddValue("variable_name", self.settings["variable_name"])
                  
            counter = 0
            for i in self.value:
                params["value"][counter].SetDouble(i)
                counter+=1
                
            self.AssignValueProcess = KratosSolid.AssignVectorFieldToConditionsProcess(self.model_part, self.compiled_function, "function",  self.value_is_spatial_function, params)
                

        if( self.IsInsideInterval() and self.interval_string == "initial" ):
            self.AssignValueProcess.Execute()            
    def _create_mechanical_solver(self):
        eigen_scheme = self._get_solution_scheme() # The scheme defines the matrices of the eigenvalue problem.
        builder_and_solver = self._get_builder_and_solver() # The eigensolver is created here.

        options = KratosMultiphysics.Flags()
        options.Set(KratosSolid.SolverLocalFlags.REFORM_DOFS, self.settings["solving_strategy_settings"]["reform_dofs_at_each_step"].GetBool())

        return KratosSolid.EigensolverStrategy(self.model_part, eigen_scheme, builder_and_solver, options, self.compute_modal_contribution)
예제 #4
0
    def ExecuteInitialize(self):
        self.model_part = self.model[self.settings["model_part_name"].GetString()]

        #create skin for the beam string
        self.beam_skin_process = KratosSolid.BuildStringSkinProcess(self.model_part, self.sides, self.radius)

        self.beam_skin_process.ExecuteInitialize()
        print("::[Skin_Created]:: (sides:"+str(self.sides),"radius:"+str(self.radius)+")")
예제 #5
0
    def __init__(self, Model, custom_settings ):

        assign_vector_components_to_nodes_process.AssignVectorComponentsToNodesProcess.__init__(self, Model, custom_settings)

        entity_type = "Nodes"
        assign_flags = [KratosMultiphysics.INLET]
        self.model_inlet =  KratosSolid.AssignFlagsToEntitiesProcess(self.model_part,entity_type,assign_flags)
        self.model_inlet.Execute()
예제 #6
0
    def _build_composite_solving_parts(self):

        print(self._class_prefix()+" Composite Solving Parts")
        solving_parts = self.settings["composite_solving_parts"]
        for i in range(0,solving_parts.size()):
            print(self._class_prefix()+" Build Part: "+solving_parts[i]["model_part_name"].GetString())
            solving_part_transfer = KratosSolid.TransferSolvingModelPartProcess(self.main_model_part,solving_parts[i])
            self.transfer_solving_parts.append(solving_part_transfer)
 def _create_explicit_strategy(self):
     mechanical_scheme = self._get_solution_scheme()
     linear_solver = self._get_linear_solver()
     return KratosSolid.ExplicitStrategy(
         self.model_part, mechanical_scheme, linear_solver,
         self.solving_strategy_settings["compute_reactions"].GetBool(),
         self.solving_strategy_settings["reform_dofs_at_each_step"].GetBool(
         ), self.solving_strategy_settings["move_mesh_flag"].GetBool())
    def _create_mechanical_solver(self):
        strategies = []
        for solver in self.solvers:
            strategies.append(solver._get_mechanical_solver())

        options = KratosMultiphysics.Flags()
        return KratosSolid.SegregatedStrategy(self.model_part, options,
                                              strategies)
    def _create_mechanical_solver(self):
        eigen_scheme = self._get_solution_scheme() # The scheme defines the matrices of the eigenvalue problem.
        builder_and_solver = self._get_builder_and_solver() # The eigensolver is created here.

        return KratosSolid.EigensolverStrategy(self.model_part,
                                               eigen_scheme,
                                               builder_and_solver,
                                               self.compute_modal_contribution)
예제 #10
0
    def AddDofs(self):

        AddDofsProcess = KratosSolid.AddDofsProcess(self.main_model_part,
                                                    self.dof_variables,
                                                    self.dof_reactions)
        AddDofsProcess.Execute()

        print("::[Mechanical Solver]:: DOF's ADDED")
예제 #11
0
    def _create_linear_strategy(self):
        mechanical_scheme = self._get_solution_scheme()
        builder_and_solver = self._get_builder_and_solver()

        options = KratosMultiphysics.Flags()
        options.Set(KratosSolid.SolverLocalFlags.COMPUTE_REACTIONS, self.solving_strategy_settings["compute_reactions"].GetBool())
        options.Set(KratosSolid.SolverLocalFlags.REFORM_DOFS, self.solving_strategy_settings["reform_dofs_at_each_step"].GetBool())

        return KratosSolid.LinearStrategy(self.model_part, mechanical_scheme, builder_and_solver, options)
    def CreateAssignmentProcess(self, params):
        if( self.value_is_numeric ):
            params.AddValue("variable_name", self.settings["variable_name"])
            params.AddValue("value", self.settings["value"])
            params.AddEmptyValue("entity_type").SetString("ELEMENTS")
            self.AssignValueProcess = KratosSolid.AssignScalarToEntitiesProcess(self.model_part, params)
        else:
            #function values are assigned to a vector variable :: transformation is needed
            if( isinstance(self.var,KratosMultiphysics.DoubleVariable) ):
                variable_name = self.settings["variable_name"].GetString() + "_VECTOR"
                #print("::[--Assign_Variable--]:: "+variable_name)
                params.AddEmptyValue("variable_name")
                params["variable_name"].SetString(variable_name)
            else:
                params.AddValue("variable_name", self.settings["variable_name"])

            params.AddEmptyValue("entity_type").SetString("ELEMENTS")
            self.AssignValueProcess = KratosSolid.AssignScalarFieldToEntitiesProcess(self.model_part, self.compiled_function, "function", self.value_is_spatial_function, params)
예제 #13
0
    def _create_explicit_strategy(self):
        solution_scheme = self._get_solution_scheme()
        #linear_solver = self._get_linear_solver()

        options = KratosMultiphysics.Flags()
        options.Set(KratosSolid.SolverLocalFlags.COMPUTE_REACTIONS, self.settings["solving_strategy_settings"]["compute_reactions"].GetBool())
        options.Set(KratosSolid.SolverLocalFlags.REFORM_DOFS, self.settings["solving_strategy_settings"]["reform_dofs_at_each_step"].GetBool())

        return KratosSolid.ExplicitStrategy(self.model_part, solution_scheme, options)
    def _CreateMechanicalSolver(self, mechanical_scheme, compute_reactions,
                                reform_step_dofs, move_mesh_flag):

        self.mechanical_solver = KratosSolid.ExplicitStrategy(
            self.computing_model_part, mechanical_scheme, self.linear_solver,
            compute_reactions, reform_step_dofs, move_mesh_flag)

        self.mechanical_solver.SetRebuildLevel(
            0)  # 1 to recompute the mass matrix in each explicit step
 def _add_dofs(self):
     dof_variables, dof_reactions = self._get_dofs()
     AddDofsProcess = KratosSolid.AddDofsProcess(self.main_model_part,
                                                 dof_variables,
                                                 dof_reactions)
     AddDofsProcess.Execute()
     if (self.echo_level > 1):
         print(dof_variables + dof_reactions)
         print(self._class_prefix() + " DOF's ADDED")
예제 #16
0
 def _add_dofs(self):
     dof_variables, dof_reactions = self._get_dofs()
     AddDofsProcess = KratosSolid.AddDofsProcess(self.main_model_part,
                                                 dof_variables,
                                                 dof_reactions)
     AddDofsProcess.Execute()
     if (self.echo_level > 1):
         print(dof_variables + dof_reactions)
         print("::[-------Solver------]:: DOF's ADDED")
예제 #17
0
    def _CreateMechanicalSolver(self, mechanical_scheme,
                                mechanical_convergence_criterion,
                                builder_and_solver, max_iters,
                                compute_reactions, reform_step_dofs,
                                move_mesh_flag, component_wise, line_search,
                                implex):

        if (component_wise):
            self.mechanical_solver = KratosSolid.ComponentWiseNewtonRaphsonStrategy(
                self.computing_model_part, mechanical_scheme,
                self.linear_solver, mechanical_convergence_criterion,
                builder_and_solver, max_iters, compute_reactions,
                reform_step_dofs, move_mesh_flag)
        else:
            if (line_search):
                if (implex):
                    self.mechanical_solver = KratosSolid.ResidualBasedNewtonRaphsonLineSearchImplexStrategy(
                        self.computing_model_part, mechanical_scheme,
                        self.linear_solver, mechanical_convergence_criterion,
                        builder_and_solver, max_iters, compute_reactions,
                        reform_step_dofs, move_mesh_flag)

                else:
                    self.mechanical_solver = KratosSolid.ResidualBasedNewtonRaphsonLineSearchStrategy(
                        self.computing_model_part, mechanical_scheme,
                        self.linear_solver, mechanical_convergence_criterion,
                        builder_and_solver, max_iters, compute_reactions,
                        reform_step_dofs, move_mesh_flag)

            else:
                if self.settings["analysis_type"].GetString() == "Linear":
                    self.mechanical_solver = KratosMultiphysics.ResidualBasedLinearStrategy(
                        self.computing_model_part, mechanical_scheme,
                        self.linear_solver, builder_and_solver,
                        compute_reactions, reform_step_dofs, False,
                        move_mesh_flag)

                else:
                    self.mechanical_solver = KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy(
                        self.computing_model_part, mechanical_scheme,
                        self.linear_solver, mechanical_convergence_criterion,
                        builder_and_solver, max_iters, compute_reactions,
                        reform_step_dofs, move_mesh_flag)
예제 #18
0
 def _create_mechanical_solver(self):
     strategies = []
     for solver in self.solvers:
         strategies.append(solver._get_mechanical_solver())
     options = KratosMultiphysics.Flags()
     mechanical_solver = KratosSolid.SegregatedStrategy(
         self.model_part, options, strategies)
     mechanical_solver.Set(KratosSolid.SolverLocalFlags.ADAPTIVE_SOLUTION,
                           self._check_adaptive_solution())
     return mechanical_solver
    def _get_criterion(self):

        # Note that all the convergence settings are introduced via a Kratos parameters object.
        V_RT = self.settings["variable_relative_tolerance"].GetDouble()
        V_AT = self.settings["variable_absolute_tolerance"].GetDouble()
        R_RT = self.settings["residual_relative_tolerance"].GetDouble()
        R_AT = self.settings["residual_absolute_tolerance"].GetDouble()

        echo_level = self.settings["echo_level"].GetInt()

        if (echo_level >= 1):
            print(
                "::[-----Criterion-----]::",
                self.settings["convergence_criterion"].GetString(),
            )

        convergence_criterion = None
        if (self.settings["convergence_criterion"].GetString() ==
                "Variable_criterion"):
            convergence_criterion = KratosSolid.DofsCriterion(V_RT, V_AT)
            convergence_criterion.SetEchoLevel(echo_level)
            convergence_criterion.Set(
                KratosSolid.CriterionLocalFlags.INCREMENTAL)
        elif (self.settings["convergence_criterion"].GetString() ==
              "Residual_criterion"):
            convergence_criterion = KratosSolid.ResidualCriterion(R_RT, R_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (self.settings["convergence_criterion"].GetString() ==
              "And_criterion"):
            Variable = KratosSolid.DofsCriterion(V_RT, V_AT)
            Variable.SetEchoLevel(echo_level)
            Variable.Set(KratosSolid.CriterionLocalFlags.INCREMENTAL)
            Residual = KratosSolid.ResidualCriterion(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosSolid.CompositeCriterion(
                Residual, Variable)
            convergence_criterion.Set(KratosSolid.CriterionLocalFlags.AND)
        elif (self.settings["convergence_criterion"].GetString() ==
              "Or_criterion"):
            Variable = KratosSolid.DofsCriterion(V_RT, V_AT)
            Variable.SetEchoLevel(echo_level)
            Variable.Set(KratosSolid.CriterionLocalFlags.INCREMENTAL)
            Residual = KratosSolid.ResidualCriterion(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosSolid.CompositeCriterion(
                Residual, Variable)
            convergence_criterion.Set(KratosSolid.CriterionLocalFlags.OR)
        else:
            raise Exception("Unsupported \"convergence_criterion\" : " +
                            self.settings["convergence_criterion"].GetString())

        return convergence_criterion
예제 #20
0
    def _add_dofs(self):

        if not hasattr(self, '_dof_variables'):
            self._set_variables_and_dofs()

        AddDofsProcess = KratosSolid.AddDofsProcess(self.main_model_part, self.dof_variables, self.dof_reactions)
        AddDofsProcess.Execute()

        if( self.echo_level > 1 ):
            print(self.dof_variables + self.dof_reactions)
            print("::[Solver]:: DOF's ADDED")
    def _create_solution_scheme(self):
        """Create the scheme for the eigenvalue problem.

        The scheme determines the left- and right-hand side matrices in the
        generalized eigenvalue problem.
        """
        if self.settings["time_integration_settings"]["solution_type"].GetString() == "Dynamic":
            solution_scheme = KratosSolid.EigensolverScheme()
        else:
            raise Exception("Unsupported solution_type: " + self.settings["time_integration_settings"]["solution_type"])
        return solution_scheme
    def _set_time_integration_methods(self):

        scalar_integration_methods, component_integration_methods = self._get_time_integration_methods();

        # second: for the same method the parameters (already calculated)
        scalar_integration_methods_container = KratosSolid.ScalarTimeIntegrationMethods()
        for dof, method in scalar_integration_methods.items():
            method.SetParameters(self.process_info) #set same parameters to all methods from process_info values
            scalar_integration_methods_container.Set(dof,method)


        component_integration_methods_container = KratosSolid.ComponentTimeIntegrationMethods()
        for dof, method in component_integration_methods.items():
            method.SetParameters(self.process_info) #set same parameters to all methods from process_info values
            component_integration_methods_container.Set(dof,method)

        # set time integration methods (for scalars and components) to process_info for processes access
        if( len(scalar_integration_methods) ):
            scalar_integration_methods_container.AddToProcessInfo(KratosSolid.SCALAR_TIME_INTEGRATION_METHODS, scalar_integration_methods_container, self.process_info)

        component_integration_methods_container.AddToProcessInfo(KratosSolid.COMPONENT_TIME_INTEGRATION_METHODS, component_integration_methods_container, self.process_info)
예제 #23
0
 def _create_builder_and_solver(self):
     linear_solver = self._get_linear_solver()
     if(self.settings["component_wise"].GetBool() == True):
         builder_and_solver = KratosSolid.ComponentWiseBuilderAndSolver(linear_solver)
     else:
         if(self.settings["block_builder"].GetBool() == True):
             # To keep matrix blocks in builder
             builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(linear_solver)
         else:
             builder_and_solver = KratosMultiphysics.ResidualBasedEliminationBuilderAndSolver(linear_solver)
             
     return builder_and_solver
 def _create_line_search_implex_strategy(self):
     mechanical_scheme = self._get_solution_scheme()
     linear_solver = self._get_linear_solver()
     mechanical_convergence_criterion = self._get_convergence_criterion()
     builder_and_solver = self._get_builder_and_solver()
     return KratosSolid.ResidualBasedNewtonRaphsonLineSearchImplexStrategy(
         self.model_part, mechanical_scheme, linear_solver,
         mechanical_convergence_criterion, builder_and_solver,
         self.solving_strategy_settings["max_iteration"].GetInt(),
         self.solving_strategy_settings["compute_reactions"].GetBool(),
         self.solving_strategy_settings["reform_dofs_at_each_step"].GetBool(
         ), self.solving_strategy_settings["move_mesh_flag"].GetBool())
예제 #25
0
    def CreateAssignmentProcess(self, params):

        params["variable_name"].SetString(
            self.settings["variable_name"].GetString())
        if (self.value_is_numeric):
            params.AddEmptyValue("value").SetDouble(self.value)
            params.AddEmptyValue("entity_type").SetString("NODES")
            self.AssignValueProcess = KratosSolid.AssignScalarToEntitiesProcess(
                self.model_part, params)
        else:
            if (self.value_is_current_value):
                self.AssignValueProcess = KratosMultiphysics.Process(
                )  #void process
            else:
                params.AddEmptyValue("entity_type").SetString("NODES")
                self.AssignValueProcess = KratosSolid.AssignScalarFieldToEntitiesProcess(
                    self.model_part, self.compiled_function, "function",
                    self.value_is_spatial_function, params)

        # in case of going to previous time step for time step reduction
        self.CreateUnAssignmentProcess(params)
    def CreateAssignmentProcess(self, params):

        if( self.fix_derivated_variable == False ):
            self.variable_name = "ROTATION"
        else:
            for dynamic_variable in self.LinearDynamicVariables:
                counter = 0
                if dynamic_variable == self.variable_name:
                    self.variable_name = self.AngularDynamicVariables[counter]
                    break
                counter = counter + 1
                                        
        params["variable_name"].SetString(self.variable_name)
        
        params.AddValue("direction", self.custom_settings["direction"])
        params.AddValue("center", self.custom_settings["center"])
        if( self.value_is_numeric ):
            params.AddEmptyValue("modulus").SetDouble(self.value)
            self.AssignValueProcess = KratosSolid.ApplyRigidBodyRotationToNodesProcess(self.model_part, params)
        else:
            self.AssignValueProcess = KratosSolid.ApplyRigidBodyRotationFieldToNodesProcess(self.model_part, self.compiled_function, "function",  self.value_is_spatial_function, params)
    def ExecuteInitialize(self):

        # set model part
        self.model_part = self.model[
            self.settings["model_part_name"].GetString()]

        if (self.model_part.ProcessInfo[KratosMultiphysics.IS_RESTARTED] ==
                False):
            self.model_part.ProcessInfo.SetValue(
                KratosMultiphysics.INTERVAL_END_TIME, self.interval[1])

        # set processes
        params = KratosMultiphysics.Parameters("{}")
        params.AddValue("model_part_name", self.settings["model_part_name"])

        if (self.value_is_numeric):
            params.AddValue("variable_name", self.settings["variable_name"])
            params.AddValue("value", self.settings["value"])
            params.AddEmptyValue("entity_type").SetString("CONDITIONS")
            self.AssignValueProcess = KratosSolid.AssignScalarToEntitiesProcess(
                self.model_part, params)
        else:
            #function values are assigned to a vector variable :: transformation is needed
            if (isinstance(self.var, KratosMultiphysics.DoubleVariable)):
                variable_name = self.settings["variable_name"].GetString(
                ) + "_VECTOR"
                print(" variable name modified:", variable_name)
                params.AddEmptyValue("variable_name")
                params["variable_name"].SetString(variable_name)
            else:
                params.AddValue("variable_name",
                                self.settings["variable_name"])

            params.AddEmptyValue("entity_type").SetString("CONDITIONS")
            self.AssignValueProcess = KratosSolid.AssignScalarFieldToEntitiesProcess(
                self.model_part, self.compiled_function, "function",
                self.value_is_spatial_function, params)

        if (self.IsInsideInterval() and self.interval_string == "initial"):
            self.AssignValueProcess.Execute()
 def _create_component_wise_strategy(self):
     computing_model_part = self.GetComputingModelPart()
     mechanical_scheme = self._get_solution_scheme()
     linear_solver = self._get_linear_solver()
     mechanical_convergence_criterion = self._get_convergence_criterion()
     builder_and_solver = self._get_builder_and_solver()
     return KratosSolid.ComponentWiseNewtonRaphsonStrategy(
         computing_model_part, mechanical_scheme, linear_solver,
         mechanical_convergence_criterion, builder_and_solver,
         self.settings["max_iteration"].GetInt(),
         self.settings["compute_reactions"].GetBool(),
         self.settings["reform_dofs_at_each_step"].GetBool(),
         self.settings["move_mesh_flag"].GetBool())
    def GetSolutionSchemeExplicit(self, explicit_integration_scheme,
                                  max_delta_time, fraction_delta_time,
                                  time_step_prediction_level,
                                  rayleigh_damping):
        # creating the explicit solution scheme:
        if (explicit_integration_scheme == "CentralDifferences"):
            mechanical_scheme = SolidMechanicsApplication.ExplicitCentralDifferencesScheme(
                max_delta_time, fraction_delta_time,
                time_step_prediction_level, rayleigh_damping)
        else:
            raise (explicit_integration_scheme, " not implemented yet.")

        return mechanical_scheme
예제 #30
0
    def _ConstructConvergenceCriterion(self, convergence_criterion):

        D_RT = self.settings["mechanical_solver_settings"][
            "displacement_relative_tolerance"].GetDouble()
        D_AT = self.settings["mechanical_solver_settings"][
            "displacement_absolute_tolerance"].GetDouble()
        R_RT = self.settings["mechanical_solver_settings"][
            "residual_relative_tolerance"].GetDouble()
        R_AT = self.settings["mechanical_solver_settings"][
            "residual_absolute_tolerance"].GetDouble()
        echo_level = self.settings["mechanical_solver_settings"][
            "echo_level"].GetInt()

        if (convergence_criterion == "Displacement_criterion"):
            convergence_criterion = KratosSolid.DisplacementConvergenceCriterion(
                D_RT, D_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion == "Residual_criterion"):
            convergence_criterion = KratosMultiphysics.ResidualCriteria(
                R_RT, R_AT)
            convergence_criterion.SetEchoLevel(echo_level)
        elif (convergence_criterion == "And_criterion"):
            Displacement = KratosSolid.DisplacementConvergenceCriterion(
                D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.AndCriteria(
                Residual, Displacement)
        elif (convergence_criterion == "Or_criterion"):
            Displacement = KratosSolid.DisplacementConvergenceCriterion(
                D_RT, D_AT)
            Displacement.SetEchoLevel(echo_level)
            Residual = KratosMultiphysics.ResidualCriteria(R_RT, R_AT)
            Residual.SetEchoLevel(echo_level)
            convergence_criterion = KratosMultiphysics.OrCriteria(
                Residual, Displacement)

        return convergence_criterion