Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -137,16 +137,20 @@ def _CreateLinearSolver(self):
def _CreateBuilderAndSolver(self):
if self.contact_settings["mortar_type"].GetString() != "":
linear_solver = self._GetLinearSolver()
if self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool():
builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()

if builder_and_solver_type == "block":
builder_and_solver = CSMA.ContactResidualBasedBlockBuilderAndSolver(linear_solver)
else:
elif builder_and_solver_type == "elimination":
# We use the elimination builder and solver
if self.settings["multi_point_constraints_used"].GetBool():
if (self.GetComputingModelPart().NumberOfMasterSlaveConstraints() > 0):
self.GetComputingModelPart().Set(KM.TO_SPLIT) # We set the flag for some operations
builder_and_solver = CSMA.ContactResidualBasedEliminationBuilderAndSolverWithConstraints(linear_solver)
else:
builder_and_solver = CSMA.ContactResidualBasedEliminationBuilderAndSolver(linear_solver)
else:
raise ValueError(f"Unsupported builder and solver type: {builder_and_solver_type}")
else:
builder_and_solver = super()._CreateBuilderAndSolver()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ def _CreateLinearSolver(self):
def _CreateBuilderAndSolver(self):
if self.contact_settings["mortar_type"].GetString() != "":
linear_solver = self._GetLinearSolver()
if self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool():
builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()

if builder_and_solver_type == "block":
builder_and_solver = CSMA.ContactResidualBasedBlockBuilderAndSolver(linear_solver)
else:
# We use the elimination builder and solver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"time_step" : 1.1
},
"builder_and_solver_settings" : {
"use_block_builder" : false
"type" : "elimination"
},
"clear_storage" : true,
"compute_reactions" : false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"time_step" : 1.1
},
"builder_and_solver_settings" : {
"use_block_builder" : false
"type" : "elimination"
},
"clear_storage" : true,
"compute_reactions" : false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ def _CreateLinearSolver(self):
return KratosMultiphysics.LinearSolver()

def _CreateSolutionStrategy(self):
if self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool():
builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()
if builder_and_solver_type == "block" or builder_and_solver_type == "block_lagrange":
warn_msg = "In case an eigenvalue problem is computed an elimantion builder shall be used to ensure boundary conditions are applied correctly!"
KratosMultiphysics.Logger.PrintWarning("CustomScipyBaseSolver", warn_msg)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,39 +43,7 @@ class MechanicalSolver(PythonSolver):
settings -- Kratos parameters containing solver settings.
"""
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")

settings_have_line_search = custom_settings.Has("line_search")
if settings_have_line_search:
kratos_utilities.IssueDeprecationWarning('MechanicalSolver', 'Using "line_search", please move it to "solving_strategy_settings" as "type"')
if custom_settings["line_search"].GetBool():
if not custom_settings.Has("solving_strategy_settings"):
custom_settings.AddEmptyValue("solving_strategy_settings")

custom_settings["solving_strategy_settings"].AddEmptyValue("type")
custom_settings["solving_strategy_settings"]["type"].SetString("line_search")
custom_settings.RemoveValue("line_search")

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

Expand Down Expand Up @@ -140,8 +108,7 @@ def GetDefaultParameters(cls):
"advanced_settings" : { }
},
"builder_and_solver_settings" : {
"use_block_builder" : true,
"use_lagrange_BS" : false,
"type" : "block",
"advanced_settings" : { }
},
"clear_storage": false,
Expand Down Expand Up @@ -379,19 +346,21 @@ def _GetLinearSolver(self):
return self._linear_solver

def _GetBuilderAndSolver(self):
builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()
if not hasattr(self, '_builder_and_solver'):
self._builder_and_solver = self._CreateBuilderAndSolver()
elif not self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool(): # Block builder and solver are unified with MPC and without. In the case of the elimination this could be a problem
elif builder_and_solver_type == "elimination": # Block builder and solver are unified with MPC and without. In the case of the elimination this could be a problem
if self.GetComputingModelPart().NumberOfMasterSlaveConstraints() > 0 and not self.mpc_block_builder_initialized:
self.settings["multi_point_constraints_used"].SetBool(True)
self._builder_and_solver = self._CreateBuilderAndSolver()
self.mpc_block_builder_initialized = True
return self._builder_and_solver

def _GetSolutionStrategy(self):
builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()
if not hasattr(self, '_mechanical_solution_strategy'):
self._mechanical_solution_strategy = self._CreateSolutionStrategy()
elif not self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool(): # Block builder and solver are unified with MPC and without. In the case of the elimination this could be a problem
elif builder_and_solver_type == "elimination": # Block builder and solver are unified with MPC and without. In the case of the elimination this could be a problem
if self.GetComputingModelPart().NumberOfMasterSlaveConstraints() > 0 and not self.mpc_block_builder_initialized:
self._mechanical_solution_strategy = self._CreateSolutionStrategy()
return self._mechanical_solution_strategy
Expand Down Expand Up @@ -487,20 +456,29 @@ def _CreateLinearSolver(self):
KratosMultiphysics.Logger.PrintInfo('::[MechanicalSolver]:: No linear solver was specified, using fastest available solver')
return linear_solver_factory.CreateFastestAvailableDirectLinearSolver()

def _CreateBuilderAndSolver(self):
linear_solver = self._GetLinearSolver()
if self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool():
def _CreateBuilderAndSolver(self) -> KratosMultiphysics.BuilderAndSolver:
if not self.settings["builder_and_solver_settings"].Has("type"):
return self.__DeprecatedBuilderAndSolverFactory()

linear_solver: KratosMultiphysics.LinearSolver = self._GetLinearSolver()
builder_and_solver_name: str = self.settings["builder_and_solver_settings"]["type"].GetString()

if builder_and_solver_name == "block":
bs_params = self.settings["builder_and_solver_settings"]["advanced_settings"]
if not self.settings["builder_and_solver_settings"]["use_lagrange_BS"].GetBool():
builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(linear_solver, bs_params)
else:
builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolverWithLagrangeMultiplier(linear_solver, bs_params)
else:
return KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(linear_solver, bs_params)
elif builder_and_solver_name == "block_lagrange":
return KratosMultiphysics.ResidualBasedBlockBuilderAndSolverWithLagrangeMultiplier(linear_solver, bs_params)
elif builder_and_solver_name == "elimination":
if self.settings["multi_point_constraints_used"].GetBool():
builder_and_solver = KratosMultiphysics.ResidualBasedEliminationBuilderAndSolverWithConstraints(linear_solver)
return KratosMultiphysics.ResidualBasedEliminationBuilderAndSolverWithConstraints(linear_solver)
else:
builder_and_solver = KratosMultiphysics.ResidualBasedEliminationBuilderAndSolver(linear_solver)
return builder_and_solver
return KratosMultiphysics.ResidualBasedEliminationBuilderAndSolver(linear_solver)
else:
message: str = f"Invalid type for builder and solver '{builder_and_solver_name}'. Options are:\n"
message += "'block'\n"
message += "'block_lagrange'\n"
message += "'elimination'"
raise ValueError(message)

def _CreateScheme(self):
"""Create the solution scheme for the structural problem.
Expand Down Expand Up @@ -584,3 +562,59 @@ def _create_arc_length_strategy(self):
self._GetBuilderAndSolver(),
settings)
return solving_strategy

def __ConvertDeprecatedSettings(self, settings: KratosMultiphysics.Parameters) -> None:
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 settings.Has(old_setting):
KratosMultiphysics.Logger.PrintWarning("::[MechanicalSolver]:: ", 'Settings contain no longer used setting, please remove it: "{}"'.format(old_setting))
settings.RemoveValue(old_setting)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think its time to issue an error. This has been deprecated for years


settings_have_use_block_builder = 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 settings.Has("builder_and_solver_settings"):
settings.AddEmptyValue("builder_and_solver_settings")

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

settings_have_line_search = settings.Has("line_search")
if settings_have_line_search:
kratos_utilities.IssueDeprecationWarning('MechanicalSolver', 'Using "line_search", please move it to "solving_strategy_settings" as "type"')
if settings["line_search"].GetBool():
if not settings.Has("solving_strategy_settings"):
settings.AddEmptyValue("solving_strategy_settings")

settings["solving_strategy_settings"].AddEmptyValue("type")
settings["solving_strategy_settings"]["type"].SetString("line_search")
settings.RemoveValue("line_search")

if settings.Has("builder_and_solver_settings") and not settings["builder_and_solver_settings"].Has("type"):
kratos_utilities.IssueDeprecationWarning(
"MechanicalSolver",
"Using deprecated builder and solver settings. Provide 'type' and 'advanced_settings' in the new system.")
bs_settings = settings["builder_and_solver_settings"]
updated_bs_settings = KratosMultiphysics.Parameters("""{}""")
if bs_settings.Has("use_block_builder"):
if bs_settings["use_block_builder"].GetBool():
if bs_settings.Has("use_lagrange_BS") and bs_settings["use_lagrange_BS"].GetBool():
updated_bs_settings.AddString("type", "block_lagrange")
else:
updated_bs_settings.AddString("type", "block")
else:
updated_bs_settings.AddString("type", "elimination")
else:
updated_bs_settings.AddString("type", "block")

if bs_settings.Has("advanced_settings"):
updated_bs_settings.AddValue("advanced_settings", bs_settings["advanced_settings"])

settings.RemoveValue("builder_and_solver_settings")
settings.AddValue("builder_and_solver_settings", updated_bs_settings)
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,19 @@ def _CreateBuilderAndSolver(self):
guess_row_size = 15
else:
guess_row_size = 45
if self.settings["builder_and_solver_settings"]["use_block_builder"].GetBool():

builder_and_solver_type: str = self.settings["builder_and_solver_settings"]["type"].GetString()
if builder_and_solver_type == "block":
builder_and_solver = TrilinosApplication.TrilinosBlockBuilderAndSolver(epetra_communicator,
guess_row_size,
linear_solver)
else:
elif builder_and_solver_type == "elimination":
builder_and_solver = TrilinosApplication.TrilinosEliminationBuilderAndSolver(epetra_communicator,
guess_row_size,
linear_solver)
else:
raise ValueError(f"Unsupported builder and solver type '{builder_and_solver_type}'. Options are 'block', 'elimination'.")

return builder_and_solver

def _create_linear_strategy(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
"time_stepping" : {
"time_step" : 1.1
},
"block_builder" : false,
"builder_and_solver_settings" : {
"type" : "elimination"
},
"line_search" : false,
"convergence_criterion" : "residual_criterion",
"displacement_relative_tolerance" : 0.0001,
Expand Down
Loading