Skip to content

Commit

Permalink
[GeoMechanicsAnalysis] Clean up Python class GeoMechanicsAnalysis (#…
Browse files Browse the repository at this point in the history
…13097)

- Merged base class `GeoMechanicsAnalysisBase` into derived class `GeoMechanicsAnalysis`. It was unclear why this subdivision was there in the first place. Consequently, it was unclear which methods should reside in the base class and which ones should reside in the derived class. Now there is a single class (`GeoMechanicsAnalysis`) that directly derives from `AnalysisStage`.
- Simplified the implementation of a few methods.
- Put the methods in a more logical order. Also, the "public" methods now precede the "private" ones (i.e. those whose names start with `_`).
  • Loading branch information
avdg81 authored Feb 6, 2025
1 parent dfa35c5 commit f84dab6
Showing 1 changed file with 56 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,55 +11,39 @@
from KratosMultiphysics.analysis_stage import AnalysisStage
from KratosMultiphysics.GeoMechanicsApplication import geomechanics_solvers_wrapper

class GeoMechanicsAnalysisBase(AnalysisStage):
'''Main script for geomechanics simulations.'''

def __init__(self,model,parameters):
class GeoMechanicsAnalysis(AnalysisStage):
def __init__(self, model, project_parameters):
# Time monitoring
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(),timer.ctime())
self.initial_time = timer.perf_counter()

# Set number of OMP threads
parallel=Kratos.OpenMPUtils()
problem_data_settings = parameters["problem_data"]
if problem_data_settings.Has("number_of_threads"):
parallel.SetNumThreads(parameters["problem_data"]["number_of_threads"].GetInt())
else:
parallel.SetNumThreads(1)
problem_data_settings = project_parameters["problem_data"]
number_of_threads = problem_data_settings["number_of_threads"].GetInt() if problem_data_settings.Has("number_of_threads") else 1
Kratos.ParallelUtilities.SetNumThreads(number_of_threads)

## Import parallel modules if needed
if parameters["problem_data"]["parallel_type"].GetString() == "MPI":
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(),"MPI parallel configuration. OMP_NUM_THREADS =",parallel.GetNumThreads())
else:
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(),"OpenMP parallel configuration. OMP_NUM_THREADS =",parallel.GetNumThreads())
parallel_configuration = problem_data_settings["parallel_type"].GetString()
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), f"{parallel_configuration} parallel configuration | number of threads = {Kratos.ParallelUtilities.GetNumThreads()}")

# Creating solver and model part and adding variables
super().__init__(model,parameters)

def _CreateSolver(self):
solver = geomechanics_solvers_wrapper.CreateSolver(self.model, self.project_parameters)
return solver

def _GetOrderOfProcessesInitialization(self):
return ["constraints_process_list",
"loads_process_list",
"auxiliar_process_list"]

def _GetSimulationName(self):
return "GeoMechanics Analysis"

def _CalculateTotalDisplacement(self,node, old_total_displacement):
stage_displacement = node.GetSolutionStepValue(KratosMultiphysics.DISPLACEMENT)
total_displacement = old_total_displacement + stage_displacement
node.SetSolutionStepValue(KratosGeo.TOTAL_DISPLACEMENT, total_displacement)
super().__init__(model, project_parameters)

def ResetIfHasNodalSolutionStepVariable(self, variable):
if self._GetSolver().main_model_part.HasNodalSolutionStepVariable(variable):
zero_vector = Kratos.Array3([0.0, 0.0, 0.0])
KratosGeo.NodeUtilities.AssignUpdatedVectorVariableToNonFixedComponentsOfNodes(
self._GetSolver().GetComputingModelPart().Nodes, variable, zero_vector, 0)
KratosGeo.NodeUtilities.AssignUpdatedVectorVariableToNonFixedComponentsOfNodes(
self._GetSolver().GetComputingModelPart().Nodes, variable, zero_vector, 1)
# time step related stuff
self.start_time = problem_data_settings["start_time"].GetDouble()
self.end_time = problem_data_settings["end_time"].GetDouble()

solver_settings = project_parameters["solver_settings"]
self.delta_time = min(solver_settings["time_stepping"]["time_step"].GetDouble(), self.end_time - self.start_time)
self.reduction_factor = solver_settings["reduction_factor"].GetDouble()
self.increase_factor = solver_settings["increase_factor"].GetDouble()
self.min_iterations = solver_settings["min_iterations"].GetInt()
self.max_delta_time_factor = solver_settings["time_stepping"]["max_delta_time_factor"].GetDouble() if solver_settings["time_stepping"].Has("max_delta_time_factor") else 1000.0
self.max_delta_time = self.delta_time * self.max_delta_time_factor
self.number_cycles = solver_settings["number_cycles"].GetInt()
self.max_iterations = solver_settings["max_iterations"].GetInt()
self.solution_type = solver_settings["solution_type"].GetString()
self.reset_displacements = solver_settings["reset_displacements"].GetBool()
self.rebuild_level = solver_settings["rebuild_level"].GetInt()

def Initialize(self):
super().Initialize()
Expand All @@ -82,40 +66,6 @@ def Finalize(self):
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(),"Analysis Completed. Elapsed Time = %.3f" % (timer.perf_counter() - self.initial_time)," seconds.")
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(),timer.ctime())

def KeepAdvancingSolutionLoop(self):
return self._GetSolver().KeepAdvancingSolutionLoop(self.end_time)

def PrintAnalysisStageProgressInformation(self):
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "STEP : ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.STEP])
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "DELTA_TIME: ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.DELTA_TIME])
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "TIME : ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.TIME])

class GeoMechanicsAnalysis(GeoMechanicsAnalysisBase):

def __init__(self, model, project_parameters):
super().__init__(model, project_parameters)

# time step related stuff
self.start_time = project_parameters["problem_data"]["start_time"].GetDouble()
self.end_time = project_parameters["problem_data"]["end_time"].GetDouble()

self.delta_time = project_parameters["solver_settings"]["time_stepping"]["time_step"].GetDouble()
self.delta_time = min(self.delta_time, self.end_time - self.start_time)

self.reduction_factor = project_parameters["solver_settings"]["reduction_factor"].GetDouble()
self.increase_factor = project_parameters["solver_settings"]["increase_factor"].GetDouble()
self.min_iterations = project_parameters["solver_settings"]["min_iterations"].GetInt()
self.max_delta_time_factor = 1000.0
if project_parameters["solver_settings"]["time_stepping"].Has("max_delta_time_factor"):
self.max_delta_time_factor = project_parameters["solver_settings"]["time_stepping"]["max_delta_time_factor"].GetDouble()
self.max_delta_time = self.delta_time * self.max_delta_time_factor
self.number_cycles = project_parameters["solver_settings"]["number_cycles"].GetInt()

self.max_iterations = project_parameters["solver_settings"]["max_iterations"].GetInt()
self.solution_type = project_parameters["solver_settings"]["solution_type"].GetString()
self.reset_displacements = project_parameters["solver_settings"]["reset_displacements"].GetBool()
self.rebuild_level = project_parameters["solver_settings"]["rebuild_level"].GetInt()

def FinalizeSolutionStep(self):
super().FinalizeSolutionStep()

Expand Down Expand Up @@ -218,6 +168,38 @@ def RunSolutionLoop(self):
self.FinalizeSolutionStep()
self.OutputSolutionStep()

def KeepAdvancingSolutionLoop(self):
return self._GetSolver().KeepAdvancingSolutionLoop(self.end_time)

def ResetIfHasNodalSolutionStepVariable(self, variable):
if self._GetSolver().main_model_part.HasNodalSolutionStepVariable(variable):
zero_vector = Kratos.Array3([0.0, 0.0, 0.0])
KratosGeo.NodeUtilities.AssignUpdatedVectorVariableToNonFixedComponentsOfNodes(
self._GetSolver().GetComputingModelPart().Nodes, variable, zero_vector, 0)
KratosGeo.NodeUtilities.AssignUpdatedVectorVariableToNonFixedComponentsOfNodes(
self._GetSolver().GetComputingModelPart().Nodes, variable, zero_vector, 1)

def PrintAnalysisStageProgressInformation(self):
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "STEP : ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.STEP])
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "DELTA_TIME: ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.DELTA_TIME])
KratosMultiphysics.Logger.PrintInfo(self._GetSimulationName(), "TIME : ", self._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.TIME])

def _CreateSolver(self):
return geomechanics_solvers_wrapper.CreateSolver(self.model, self.project_parameters)

def _CalculateTotalDisplacement(self, node, old_total_displacement):
stage_displacement = node.GetSolutionStepValue(KratosMultiphysics.DISPLACEMENT)
total_displacement = old_total_displacement + stage_displacement
node.SetSolutionStepValue(KratosGeo.TOTAL_DISPLACEMENT, total_displacement)

def _GetOrderOfProcessesInitialization(self):
return ["constraints_process_list",
"loads_process_list",
"auxiliar_process_list"]

def _GetSimulationName(self):
return "GeoMechanics Analysis"

if __name__ == '__main__':
from sys import argv

Expand Down

0 comments on commit f84dab6

Please sign in to comment.