Beispiel #1
0
    def _create_solution_scheme(self):

        integration_method = self.time_integration_settings[
            "integration_method"].GetString()

        if (self.implicit_solver_settings["rayleigh_damping"].GetBool() == True
            ):
            self.process_info[
                KratosSolid.RAYLEIGH_ALPHA] = self.implicit_solver_settings[
                    "rayleigh_alpha"].GetDouble()
            self.process_info[
                KratosSolid.RAYLEIGH_BETA] = self.implicit_solver_settings[
                    "rayleigh_beta"].GetDouble()
        else:
            self.process_info[KratosSolid.RAYLEIGH_ALPHA] = 0.0
            self.process_info[KratosSolid.RAYLEIGH_BETA] = 0.0

        # compute mass lumped matrix
        if (self.implicit_solver_settings["lumped_mass_matrix"].GetBool() ==
                True):
            self.process_info[
                KratosMultiphysics.COMPUTE_LUMPED_MASS_MATRIX] = True
        else:
            # compute consistent dynamic tangent/mass matrix
            if (self.implicit_solver_settings["consistent_mass_matrix"].
                    GetBool() == True):
                self.process_info[
                    KratosMultiphysics.COMPUTE_DYNAMIC_TANGENT] = True

        # set bossak factor
        bossak_factor = self.implicit_solver_settings[
            "bossak_factor"].GetDouble()
        self.process_info[KratosMultiphysics.BOSSAK_ALPHA] = bossak_factor

        # set solution scheme and integration method dictionary
        self.integration_methods = {}
        if (integration_method == "Newmark"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.NewmarkMethod(),
                'ROTATION':
                KratosSolid.NewmarkMethod()
            })  #shells
            mechanical_scheme = KratosSolid.DisplacementNewmarkScheme()
        elif (integration_method == "Bossak"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.BossakMethod(),
                'ROTATION':
                KratosSolid.BossakMethod()
            })  #shells
            mechanical_scheme = KratosSolid.DisplacementBossakScheme()
        elif (integration_method == "Simo"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.SimoMethod(),
                'ROTATION':
                KratosSolid.SimoMethod()
            })  #shells
            mechanical_scheme = KratosSolid.DisplacementSimoScheme()
        elif (integration_method == "RotationNewmark"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.NewmarkStepMethod(),
                'ROTATION':
                KratosSolid.NewmarkStepRotationMethod()
            })  #beams
            mechanical_scheme = KratosSolid.DisplacementRotationNewmarkScheme()
        elif (integration_method == "RotationBossak"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.BossakStepMethod(),
                'ROTATION':
                KratosSolid.BossakStepRotationMethod()
            })  #beams
            mechanical_scheme = KratosSolid.DisplacementRotationBossakScheme()
        elif (integration_method == "RotationSimo"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.SimoStepMethod(),
                'ROTATION':
                KratosSolid.SimoStepRotationMethod()
            })  #beams
            mechanical_scheme = KratosSolid.DisplacementRotationSimoScheme()
        elif (integration_method == "RotationEMC"):
            self.integration_methods.update({
                'DISPLACEMENT':
                KratosSolid.EmcStepMethod(),
                'ROTATION':
                KratosSolid.EmcStepRotationMethod()
            })  #shells
            mechanical_scheme = KratosSolid.DisplacementRotationEmcScheme()
        else:
            raise Exception("Unsupported integration_method: " +
                            integration_method)

        # set integration parameters
        self._set_time_integration_methods()

        return mechanical_scheme
    def _create_solution_scheme(self):

        integration_method = self.time_integration_settings[
            "integration_method"].GetString()

        if (self.implicit_solver_settings["rayleigh_damping"].GetBool() == True
            ):
            self.process_info[
                KratosSolid.RAYLEIGH_ALPHA] = self.implicit_solver_settings[
                    "rayleigh_alpha"].GetDouble()
            self.process_info[
                KratosSolid.RAYLEIGH_BETA] = self.implicit_solver_settings[
                    "rayleigh_beta"].GetDouble()
        else:
            self.process_info[KratosSolid.RAYLEIGH_ALPHA] = 0.0
            self.process_info[KratosSolid.RAYLEIGH_BETA] = 0.0

        # compute mass lumped matrix
        if (self.implicit_solver_settings["lumped_mass_matrix"].GetBool() ==
                True):
            self.process_info[
                KratosMultiphysics.COMPUTE_LUMPED_MASS_MATRIX] = True
        else:
            # compute consistent dynamic tangent/mass matrix
            if (self.implicit_solver_settings["consistent_mass_matrix"].
                    GetBool() == True):
                self.process_info[
                    KratosMultiphysics.COMPUTE_DYNAMIC_TANGENT] = True

        if (self.solving_strategy_settings["builder_type"].GetString() ==
                "component_wise"):
            dynamic_factor = self.implicit_solver_settings[
                "dynamic_factor"].GetDouble()
            damp_factor_m = self.implicit_solver_settings[
                "bossak_factor"].GetDouble()
            mechanical_scheme = KratosSolid.ComponentWiseBossakScheme(
                damp_factor_m, dynamic_factor)
        elif (integration_method == "Newmark"):
            #damp_factor_m = 0.0
            #mechanical_scheme = KratosMultiphysics.ResidualBasedBossakDisplacementScheme(damp_factor_m)
            time_integration_method = KratosSolid.NewmarkMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.BossakMethod(
            )  #shells
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementNewmarkScheme(
            )
        elif (integration_method == "Bossak"):
            bossak_factor = self.implicit_solver_settings[
                "bossak_factor"].GetDouble()
            self.process_info[KratosMultiphysics.BOSSAK_ALPHA] = bossak_factor
            #mechanical_scheme = KratosMultiphysics.ResidualBasedBossakDisplacementScheme(bossak_factor)
            time_integration_method = KratosSolid.BossakMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.BossakMethod(
            )  #shells
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementBossakScheme(
            )
        elif (integration_method == "Simo"):
            bossak_factor = self.implicit_solver_settings[
                "bossak_factor"].GetDouble()
            self.process_info[KratosMultiphysics.BOSSAK_ALPHA] = bossak_factor
            #mechanical_scheme = KratosMultiphysics.ResidualBasedBossakDisplacementScheme(bossak_factor)
            time_integration_method = KratosSolid.SimoMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.SimoMethod()  #shells
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementSimoScheme(
            )
        elif (integration_method == "RotationNewmark"):
            #dynamic_factor = self.implicit_solver_settings["dynamic_factor"].GetDouble() # 0,1
            #damp_factor_m = self.implicit_solver_settings["bossak_factor"].GetDouble()
            #mechanical_scheme = KratosSolid.ResidualBasedRotationNewmarkScheme(dynamic_factor, damp_factor_m)
            time_integration_method = KratosSolid.NewmarkStepMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.NewmarkStepRotationMethod(
            )
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementRotationNewmarkScheme(
            )
        elif (integration_method == "RotationBossak"):
            bossak_factor = self.implicit_solver_settings[
                "bossak_factor"].GetDouble()
            self.process_info[KratosMultiphysics.BOSSAK_ALPHA] = bossak_factor
            #dynamic_factor = self.implicit_solver_settings["dynamic_factor"].GetDouble() # 0,1
            #mechanical_scheme = KratosSolid.ResidualBasedRotationNewmarkScheme(dynamic_factor, bossak_factor)
            time_integration_method = KratosSolid.BossakStepMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.BossakStepRotationMethod(
            )
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementRotationBossakScheme(
            )
        elif (integration_method == "RotationSimo"):
            bossak_factor = self.implicit_solver_settings[
                "bossak_factor"].GetDouble()
            self.process_info[KratosMultiphysics.BOSSAK_ALPHA] = bossak_factor
            #dynamic_factor = self.implicit_solver_settings["dynamic_factor"].GetDouble() # 0,1
            #mechanical_scheme = KratosSolid.ResidualBasedRotationSimoScheme(dynamic_factor, bossak_factor)
            time_integration_method = KratosSolid.SimoStepMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.SimoStepRotationMethod(
            )
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementRotationSimoScheme(
            )
        elif (integration_method == "RotationEMC"):
            #dynamic_factor = self.implicit_solver_settings["dynamic_factor"].GetDouble() # 0,1
            #mechanical_scheme = KratosSolid.ResidualBasedRotationEMCScheme(dynamic_factor)
            time_integration_method = KratosSolid.EmcStepMethod()
            time_integration_method.AddToProcessInfo(
                KratosSolid.TIME_INTEGRATION_METHOD, time_integration_method,
                self.process_info)
            time_integration_method.SetParameters(self.process_info)
            angular_time_integration_method = KratosSolid.EmcStepRotationMethod(
            )
            angular_time_integration_method.AddToProcessInfo(
                KratosSolid.ANGULAR_TIME_INTEGRATION_METHOD,
                angular_time_integration_method, self.process_info)
            angular_time_integration_method.SetParameters(self.process_info)
            mechanical_scheme = KratosSolid.ResidualBasedDisplacementRotationEmcScheme(
            )
        else:
            raise Exception("Unsupported integration_method: " +
                            integration_method)

        return mechanical_scheme