KratosOptimizationApplication 10.4.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. KratosMultiphysics/.libs/KratosOptimizationApplication.so +0 -0
  2. KratosMultiphysics/.libs/libKratosOptimizationCore.dylib +0 -0
  3. KratosMultiphysics/OptimizationApplication/__init__.py +19 -0
  4. KratosMultiphysics/OptimizationApplication/algorithms/NLOPT_algorithms.py +255 -0
  5. KratosMultiphysics/OptimizationApplication/algorithms/SciPy_algorithms.py +154 -0
  6. KratosMultiphysics/OptimizationApplication/algorithms/__init__.py +0 -0
  7. KratosMultiphysics/OptimizationApplication/algorithms/algorithm.py +78 -0
  8. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_adam.py +68 -0
  9. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_base.py +393 -0
  10. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_gradient_projection.py +355 -0
  11. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_momentum_relaxed_gradient_projection.py +70 -0
  12. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_nesterov_accelarated_gradient.py +60 -0
  13. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_relaxed_gradient_projection.py +263 -0
  14. KratosMultiphysics/OptimizationApplication/algorithms/algorithm_steepest_descent.py +205 -0
  15. KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_constraint.py +194 -0
  16. KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_objective.py +191 -0
  17. KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_constraint.py +123 -0
  18. KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_objective.py +148 -0
  19. KratosMultiphysics/OptimizationApplication/algorithms/standardized_constraint.py +180 -0
  20. KratosMultiphysics/OptimizationApplication/algorithms/standardized_objective.py +133 -0
  21. KratosMultiphysics/OptimizationApplication/algorithms/standardized_rgp_constraint.py +268 -0
  22. KratosMultiphysics/OptimizationApplication/analyses_controller.py +75 -0
  23. KratosMultiphysics/OptimizationApplication/controls/control.py +123 -0
  24. KratosMultiphysics/OptimizationApplication/controls/external_response_function_control.py +149 -0
  25. KratosMultiphysics/OptimizationApplication/controls/master_control.py +198 -0
  26. KratosMultiphysics/OptimizationApplication/controls/material/material_properties_control.py +115 -0
  27. KratosMultiphysics/OptimizationApplication/controls/material/simp_control.py +229 -0
  28. KratosMultiphysics/OptimizationApplication/controls/shape/vertex_morphing_shape_control.py +289 -0
  29. KratosMultiphysics/OptimizationApplication/controls/thickness/shell_thickness_control.py +180 -0
  30. KratosMultiphysics/OptimizationApplication/controls_controller.py +205 -0
  31. KratosMultiphysics/OptimizationApplication/convergence_criteria/avg_abs_improvement_conv_criterion.py +98 -0
  32. KratosMultiphysics/OptimizationApplication/convergence_criteria/combined_conv_criterion.py +87 -0
  33. KratosMultiphysics/OptimizationApplication/convergence_criteria/constraint_conv_criterion.py +68 -0
  34. KratosMultiphysics/OptimizationApplication/convergence_criteria/convergence_criterion.py +26 -0
  35. KratosMultiphysics/OptimizationApplication/convergence_criteria/l2_conv_criterion.py +77 -0
  36. KratosMultiphysics/OptimizationApplication/convergence_criteria/magnitude_reduction_conv_criterion.py +85 -0
  37. KratosMultiphysics/OptimizationApplication/convergence_criteria/max_iter_conv_criterion.py +48 -0
  38. KratosMultiphysics/OptimizationApplication/convergence_criteria/patience_conv_criterion.py +116 -0
  39. KratosMultiphysics/OptimizationApplication/convergence_criteria/target_value_conv_criterion.py +64 -0
  40. KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy.py +46 -0
  41. KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy_decorator.py +67 -0
  42. KratosMultiphysics/OptimizationApplication/execution_policies/independent_analysis_execution_policy.py +78 -0
  43. KratosMultiphysics/OptimizationApplication/execution_policies/kratos_analysis_execution_policy.py +137 -0
  44. KratosMultiphysics/OptimizationApplication/execution_policies/stepping_analysis_execution_policy.py +88 -0
  45. KratosMultiphysics/OptimizationApplication/filtering/explicit_filter.py +124 -0
  46. KratosMultiphysics/OptimizationApplication/filtering/filter.py +188 -0
  47. KratosMultiphysics/OptimizationApplication/filtering/filter_utils.py +55 -0
  48. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_analysis.py +139 -0
  49. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_scalar_solver.py +39 -0
  50. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_shape_solver.py +67 -0
  51. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_solver_base.py +275 -0
  52. KratosMultiphysics/OptimizationApplication/filtering/helmholtz_vector_solver.py +39 -0
  53. KratosMultiphysics/OptimizationApplication/filtering/implicit_filter.py +192 -0
  54. KratosMultiphysics/OptimizationApplication/filtering/python_solvers_wrapper_implicit_filters.py +56 -0
  55. KratosMultiphysics/OptimizationApplication/model_part_controllers/connectivity_preserving_model_part_controller.py +72 -0
  56. KratosMultiphysics/OptimizationApplication/model_part_controllers/external_response_function_model_part_controller.py +110 -0
  57. KratosMultiphysics/OptimizationApplication/model_part_controllers/mdpa_model_part_controller.py +44 -0
  58. KratosMultiphysics/OptimizationApplication/model_part_controllers/model_part_controller.py +19 -0
  59. KratosMultiphysics/OptimizationApplication/model_parts_controller.py +92 -0
  60. KratosMultiphysics/OptimizationApplication/optimization_analysis.py +146 -0
  61. KratosMultiphysics/OptimizationApplication/optimizations_controller.py +223 -0
  62. KratosMultiphysics/OptimizationApplication/optimizer.py +61 -0
  63. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_ascii_output_process.py +212 -0
  64. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_field_output_process.py +122 -0
  65. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_graph_output_process.py +184 -0
  66. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_hdf5_output_process.py +84 -0
  67. KratosMultiphysics/OptimizationApplication/processes/optimization_problem_vtu_output_process.py +94 -0
  68. KratosMultiphysics/OptimizationApplication/processes/spatial_statistics_computation_process.py +81 -0
  69. KratosMultiphysics/OptimizationApplication/responses/__init__.py +0 -0
  70. KratosMultiphysics/OptimizationApplication/responses/additive_manufacturing_responses.py +410 -0
  71. KratosMultiphysics/OptimizationApplication/responses/analysis_based_response_function_factory.py +14 -0
  72. KratosMultiphysics/OptimizationApplication/responses/analysis_free_response_function_factory.py +14 -0
  73. KratosMultiphysics/OptimizationApplication/responses/base_response.py +66 -0
  74. KratosMultiphysics/OptimizationApplication/responses/binary_operator_response_function.py +103 -0
  75. KratosMultiphysics/OptimizationApplication/responses/combined_response_function.py +127 -0
  76. KratosMultiphysics/OptimizationApplication/responses/discrete_value_residual_response_function.py +131 -0
  77. KratosMultiphysics/OptimizationApplication/responses/evaluation_response_function.py +68 -0
  78. KratosMultiphysics/OptimizationApplication/responses/external_response_function.py +87 -0
  79. KratosMultiphysics/OptimizationApplication/responses/geometric_centroid_deviation_response_function.py +97 -0
  80. KratosMultiphysics/OptimizationApplication/responses/linear_strain_energy_response_function.py +72 -0
  81. KratosMultiphysics/OptimizationApplication/responses/literal_value_response_function.py +33 -0
  82. KratosMultiphysics/OptimizationApplication/responses/log_response_function.py +47 -0
  83. KratosMultiphysics/OptimizationApplication/responses/mass_response_function.py +71 -0
  84. KratosMultiphysics/OptimizationApplication/responses/response_function.py +126 -0
  85. KratosMultiphysics/OptimizationApplication/responses/response_routine.py +158 -0
  86. KratosMultiphysics/OptimizationApplication/responses/structural_responses.py +335 -0
  87. KratosMultiphysics/OptimizationApplication/responses_controller.py +390 -0
  88. KratosMultiphysics/OptimizationApplication/utilities/buffered_dict.py +399 -0
  89. KratosMultiphysics/OptimizationApplication/utilities/component_data_view.py +74 -0
  90. KratosMultiphysics/OptimizationApplication/utilities/helper_utilities.py +40 -0
  91. KratosMultiphysics/OptimizationApplication/utilities/logger_utilities.py +222 -0
  92. KratosMultiphysics/OptimizationApplication/utilities/model_part_utilities.py +117 -0
  93. KratosMultiphysics/OptimizationApplication/utilities/opt_line_search.py +173 -0
  94. KratosMultiphysics/OptimizationApplication/utilities/opt_projection.py +191 -0
  95. KratosMultiphysics/OptimizationApplication/utilities/optimization_problem.py +237 -0
  96. KratosMultiphysics/OptimizationApplication/utilities/optimization_problem_utilities.py +237 -0
  97. KratosMultiphysics/OptimizationApplication/utilities/response_utilities.py +249 -0
  98. KratosMultiphysics/OptimizationApplication/utilities/timer.py +45 -0
  99. KratosMultiphysics/OptimizationApplication/utilities/union_utilities.py +6 -0
  100. kratosoptimizationapplication-10.4.4.dist-info/METADATA +25 -0
  101. kratosoptimizationapplication-10.4.4.dist-info/RECORD +106 -0
  102. kratosoptimizationapplication-10.4.4.dist-info/WHEEL +6 -0
  103. kratosoptimizationapplication.dylibs/libKratosCore.dylib +4 -0
  104. kratosoptimizationapplication.dylibs/libgcc_s.1.1.dylib +0 -0
  105. kratosoptimizationapplication.dylibs/libgomp.1.dylib +0 -0
  106. kratosoptimizationapplication.dylibs/libstdc++.6.dylib +0 -0
@@ -0,0 +1,137 @@
1
+ from importlib import import_module
2
+ from typing import Any
3
+
4
+ import KratosMultiphysics as Kratos
5
+ import KratosMultiphysics.OptimizationApplication as KratosOA
6
+ from KratosMultiphysics.analysis_stage import AnalysisStage
7
+ from KratosMultiphysics.OptimizationApplication.execution_policies.execution_policy import ExecutionPolicy
8
+ from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import GetClassModuleFromKratos
9
+ from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem import OptimizationProblem
10
+ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView
11
+
12
+ def Factory(model: Kratos.Model, parameters: Kratos.Parameters, optimization_problem: OptimizationProblem) -> ExecutionPolicy:
13
+ if not parameters.Has("name"):
14
+ raise RuntimeError(f"KratosAnalysisExecutionPolicy instantiation requires a \"name\" in parameters [ parameters = {parameters}].")
15
+ if not parameters.Has("settings"):
16
+ raise RuntimeError(f"KratosAnalysisExecutionPolicy instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
17
+
18
+ return KratosAnalysisExecutionPolicy(parameters["name"].GetString(), model, parameters["settings"], optimization_problem)
19
+
20
+ class KratosAnalysisExecutionPolicy(ExecutionPolicy):
21
+ def __init__(self, name: str, model: Kratos.Model, parameters: Kratos.Parameters, optimization_problem: OptimizationProblem):
22
+ super().__init__(name)
23
+
24
+ default_settings = Kratos.Parameters("""{
25
+ "model_part_names" : [],
26
+ "analysis_module" : "KratosMultiphysics",
27
+ "analysis_type" : "",
28
+ "analysis_settings": {},
29
+ "analysis_output_settings": {
30
+ "nodal_solution_step_data_variables" : [],
31
+ "nodal_data_value_variables" : [],
32
+ "element_data_value_variables" : [],
33
+ "element_properties_value_variables" : [],
34
+ "element_integration_point_value_variables" : [],
35
+ "condition_data_value_variables" : [],
36
+ "condition_properties_value_variables" : [],
37
+ "condition_integration_point_value_variables": []
38
+ }
39
+ }""")
40
+ self.model = model
41
+ self.parameters = parameters
42
+ self.optimization_problem = optimization_problem
43
+ self.parameters.ValidateAndAssignDefaults(default_settings)
44
+ self.parameters["analysis_output_settings"].ValidateAndAssignDefaults(default_settings["analysis_output_settings"])
45
+
46
+ analysis_module = parameters["analysis_module"].GetString()
47
+ analysis_type = parameters["analysis_type"].GetString()
48
+ analysis_settings = parameters["analysis_settings"]
49
+
50
+ if analysis_module == "KratosMultiphysics":
51
+ analysis_full_module, analysis_type = GetClassModuleFromKratos(analysis_type)
52
+ else:
53
+ analysis_full_module = f"{analysis_module}.{Kratos.StringUtilities.ConvertCamelCaseToSnakeCase(analysis_type)}"
54
+
55
+ self.model_parts: 'list[Kratos.ModelPart]' = []
56
+ self.analysis: AnalysisStage = getattr(import_module(analysis_full_module), analysis_type)(self.model, analysis_settings.Clone())
57
+
58
+ analysis_output_settings = self.parameters["analysis_output_settings"]
59
+ analysis_output_settings.ValidateAndAssignDefaults(default_settings["analysis_output_settings"])
60
+ self.nodal_solution_step_data_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["nodal_solution_step_data_variables"].GetStringArray())
61
+ self.nodal_data_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["nodal_data_value_variables"].GetStringArray())
62
+ self.element_data_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["element_data_value_variables"].GetStringArray())
63
+ self.element_properties_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["element_properties_value_variables"].GetStringArray())
64
+ self.element_integration_point_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["element_integration_point_value_variables"].GetStringArray())
65
+ self.condition_data_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["condition_data_value_variables"].GetStringArray())
66
+ self.condition_properties_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["condition_properties_value_variables"].GetStringArray())
67
+ self.condition_integration_point_value_variables = KratosAnalysisExecutionPolicy.__GetVariablesList(analysis_output_settings["condition_integration_point_value_variables"].GetStringArray())
68
+
69
+ def GetAnalysisModelPart(self):
70
+ return self.analysis._GetSolver().GetComputingModelPart()
71
+
72
+ def Initialize(self):
73
+ self.analysis.Initialize()
74
+
75
+ # initialize model parts
76
+ self.model_parts = [self.model[model_part_name] for model_part_name in self.parameters["model_part_names"].GetStringArray()]
77
+
78
+ def Check(self) -> None:
79
+ pass
80
+
81
+ def Finalize(self) -> None:
82
+ self.analysis.Finalize()
83
+
84
+ def Execute(self):
85
+ self.analysis.time = self.analysis.project_parameters["problem_data"]["start_time"].GetDouble()
86
+ for model_part in self.model_parts:
87
+ model_part.ProcessInfo.SetValue(Kratos.STEP, 0)
88
+ model_part.ProcessInfo.SetValue(Kratos.TIME, 0)
89
+ model_part.ProcessInfo.SetValue(Kratos.DELTA_TIME, 0)
90
+ self.analysis.RunSolutionLoop()
91
+
92
+ self._OutputAnalysisData()
93
+
94
+ def _OutputAnalysisData(self):
95
+ unbuffered_data = ComponentDataView(self, self.optimization_problem).GetUnBufferedData()
96
+ for model_part in self.model_parts:
97
+ for variable in self.nodal_solution_step_data_variables:
98
+ nodal_field = Kratos.TensorAdaptors.HistoricalVariableTensorAdaptor(model_part.Nodes, variable)
99
+ nodal_field.CollectData()
100
+ unbuffered_data.SetValue(variable.Name(), nodal_field, overwrite=True)
101
+ for variable in self.nodal_data_value_variables:
102
+ nodal_field = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Nodes, variable)
103
+ nodal_field.CollectData()
104
+ unbuffered_data.SetValue(variable.Name(), nodal_field, overwrite=True)
105
+
106
+ for variable in self.element_data_value_variables:
107
+ elem_field = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Elements, variable)
108
+ elem_field.CollectData()
109
+ unbuffered_data.SetValue(variable.Name(), elem_field, overwrite=True)
110
+ for variable in self.element_properties_value_variables:
111
+ elem_field = KratosOA.TensorAdaptors.PropertiesVariableTensorAdaptor(model_part.Elements, variable)
112
+ elem_field.CollectData()
113
+ unbuffered_data.SetValue(variable.Name(), elem_field, overwrite=True)
114
+ for variable in self.element_integration_point_value_variables:
115
+ elem_field = Kratos.TensorAdaptors.GaussPointVariableTensorAdaptor(model_part.Elements, variable, model_part.ProcessInfo)
116
+ elem_field.CollectData()
117
+ unbuffered_data.SetValue(variable.Name(), elem_field, overwrite=True)
118
+
119
+ for variable in self.condition_data_value_variables:
120
+ cond_field = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Conditions, variable)
121
+ cond_field.CollectData()
122
+ unbuffered_data.SetValue(variable.Name(), cond_field, overwrite=True)
123
+ for variable in self.condition_properties_value_variables:
124
+ cond_field = KratosOA.TensorAdaptors.PropertiesVariableTensorAdaptor(model_part.Conditions, variable)
125
+ cond_field.CollectData()
126
+ unbuffered_data.SetValue(variable.Name(), cond_field, overwrite=True)
127
+ for variable in self.condition_integration_point_value_variables:
128
+ cond_field = Kratos.TensorAdaptors.GaussPointVariableTensorAdaptor(model_part.Conditions, variable, model_part.ProcessInfo)
129
+ cond_field.CollectData()
130
+ unbuffered_data.SetValue(variable.Name(), cond_field, overwrite=True)
131
+
132
+ @staticmethod
133
+ def __GetVariablesList(variable_names_list: 'list[str]') -> 'list[Any]':
134
+ return [Kratos.KratosGlobals.GetVariable(variable_name) for variable_name in variable_names_list]
135
+
136
+
137
+
@@ -0,0 +1,88 @@
1
+ from importlib import import_module
2
+
3
+ import KratosMultiphysics as Kratos
4
+ from KratosMultiphysics.analysis_stage import AnalysisStage
5
+ from KratosMultiphysics.OptimizationApplication.execution_policies.execution_policy import ExecutionPolicy
6
+ from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import GetClassModuleFromKratos
7
+
8
+ def Factory(model: Kratos.Model, parameters: Kratos.Parameters, _) -> ExecutionPolicy:
9
+ if not parameters.Has("name"):
10
+ raise RuntimeError(f"SteppingAnalysisExecutionPolicy instantiation requires a \"name\" in parameters [ parameters = {parameters}].")
11
+ if not parameters.Has("settings"):
12
+ raise RuntimeError(f"SteppingAnalysisExecutionPolicy instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
13
+
14
+ return SteppingAnalysisExecutionPolicy(parameters["name"].GetString(), model, parameters["settings"])
15
+
16
+ class SteppingAnalysisExecutionPolicy(ExecutionPolicy):
17
+ def __init__(self, name: str, model: Kratos.Model, parameters: Kratos.Parameters):
18
+ super().__init__(name)
19
+
20
+ default_settings = Kratos.Parameters("""{
21
+ "model_part_names" : [],
22
+ "analysis_module" : "KratosMultiphysics",
23
+ "analysis_type" : "",
24
+ "analysis_settings": {}
25
+ }""")
26
+ self.model = model
27
+ self.parameters = parameters
28
+ self.parameters.ValidateAndAssignDefaults(default_settings)
29
+
30
+ analysis_module = parameters["analysis_module"].GetString()
31
+ analysis_type = parameters["analysis_type"].GetString()
32
+ analysis_settings = parameters["analysis_settings"]
33
+
34
+ if analysis_module == "KratosMultiphysics":
35
+ analysis_full_module, analysis_type = GetClassModuleFromKratos(analysis_type)
36
+ else:
37
+ analysis_full_module = f"{analysis_module}.{Kratos.StringUtilities.ConvertCamelCaseToSnakeCase(analysis_type)}"
38
+
39
+ self.model_parts = []
40
+ self.analysis: AnalysisStage = getattr(import_module(analysis_full_module), analysis_type)(self.model, analysis_settings.Clone())
41
+
42
+ def GetAnalysisModelPart(self):
43
+ return self.analysis._GetSolver().GetComputingModelPart()
44
+
45
+ def Initialize(self):
46
+ self.analysis.Initialize()
47
+
48
+ # initialize model parts
49
+ self.model_parts = [self.model[model_part_name] for model_part_name in self.parameters["model_part_names"].GetStringArray()]
50
+
51
+ def Check(self) -> None:
52
+ pass
53
+
54
+ def Finalize(self) -> None:
55
+ pass
56
+
57
+ def Execute(self):
58
+ time_before_analysis = []
59
+ step_before_analysis = []
60
+ delta_time_before_analysis = []
61
+
62
+ for model_part in self.model_parts:
63
+ time_before_analysis.append(model_part.ProcessInfo[Kratos.TIME])
64
+ step_before_analysis.append(model_part.ProcessInfo[Kratos.STEP])
65
+ delta_time_before_analysis.append(model_part.ProcessInfo[Kratos.DELTA_TIME])
66
+
67
+ # Reset step/time iterators such that they match the optimization iteration after calling CalculateValue (which internally calls CloneTimeStep)
68
+ for index, model_part in enumerate(self.model_parts):
69
+ model_part.ProcessInfo.SetValue(Kratos.STEP, step_before_analysis[index] - 1)
70
+ model_part.ProcessInfo.SetValue(Kratos.TIME, time_before_analysis[index] - 1)
71
+ model_part.ProcessInfo.SetValue(Kratos.DELTA_TIME, 0)
72
+
73
+ self.analysis.time = self.analysis._GetSolver().AdvanceInTime(self.analysis.time)
74
+ self.analysis.InitializeSolutionStep()
75
+ self.analysis._GetSolver().Predict()
76
+ self.analysis._GetSolver().SolveSolutionStep()
77
+
78
+ self.analysis.FinalizeSolutionStep()
79
+ self.analysis.OutputSolutionStep()
80
+
81
+ # Clear results or modifications on model parts
82
+ for index, model_part in enumerate(self.model_parts):
83
+ model_part.ProcessInfo.SetValue(Kratos.STEP, step_before_analysis[index])
84
+ model_part.ProcessInfo.SetValue(Kratos.TIME, time_before_analysis[index])
85
+ model_part.ProcessInfo.SetValue(Kratos.DELTA_TIME, delta_time_before_analysis[index])
86
+
87
+
88
+
@@ -0,0 +1,124 @@
1
+ import operator
2
+ from itertools import accumulate
3
+
4
+ import KratosMultiphysics as Kratos
5
+ import KratosMultiphysics.OptimizationApplication as KratosOA
6
+ from KratosMultiphysics.OptimizationApplication.filtering.filter import Filter
7
+ from KratosMultiphysics.OptimizationApplication.filtering.filter_utils import FilterRadiusFactory
8
+ from KratosMultiphysics.OptimizationApplication.filtering.filter_utils import ExplicitFilterDampingFactory
9
+ from KratosMultiphysics.OptimizationApplication.utilities.union_utilities import SupportedSensitivityFieldVariableTypes
10
+
11
+ def Factory(model: Kratos.Model, filtering_model_part_name: str, filtering_variable: SupportedSensitivityFieldVariableTypes, data_location: Kratos.Globals.DataLocation, parameters: Kratos.Parameters) -> Filter:
12
+ return ExplicitFilter(model, filtering_model_part_name, filtering_variable, data_location, parameters)
13
+
14
+ class ExplicitFilter(Filter):
15
+ @classmethod
16
+ def GetDefaultParameters(cls) -> Kratos.Parameters:
17
+ return Kratos.Parameters("""{
18
+ "filter_type" : "explicit_filter",
19
+ "node_cloud_mesh" : false,
20
+ "filter_function_type" : "linear",
21
+ "max_items_in_bucket" : 10,
22
+ "echo_level" : 0,
23
+ "store_filter_matrix" : false,
24
+ "filter_radius_settings":{
25
+ "filter_radius_type": "constant",
26
+ "filter_radius" : 0.2
27
+ },
28
+ "filtering_boundary_conditions": {
29
+ "damping_type" : "nearest_entity",
30
+ "damping_function_type" : "cosine",
31
+ "damped_model_part_settings": {}
32
+ }
33
+ }""")
34
+
35
+ def __init__(self, model: Kratos.Model, filtering_model_part_name: str, filtering_variable: SupportedSensitivityFieldVariableTypes, data_location: Kratos.Globals.DataLocation, parameters: Kratos.Parameters) -> None:
36
+ super().__init__()
37
+
38
+ self.model = model
39
+ self.filtering_model_part_name = filtering_model_part_name
40
+ self.filtering_variable = filtering_variable
41
+ self.data_location = data_location
42
+
43
+ self.parameters = parameters
44
+ self.parameters.ValidateAndAssignDefaults(self.GetDefaultParameters())
45
+
46
+ supported_data_locations = [
47
+ Kratos.Globals.DataLocation.NodeHistorical,
48
+ Kratos.Globals.DataLocation.NodeNonHistorical,
49
+ Kratos.Globals.DataLocation.Condition,
50
+ Kratos.Globals.DataLocation.Element
51
+ ]
52
+ if data_location not in supported_data_locations:
53
+ raise RuntimeError(f"Unsupported data location = \"{data_location.name}\" requested. Followings are supported:\n\t" + "\n\t".join([v.name for v in supported_data_locations]))
54
+
55
+ if isinstance(filtering_variable, Kratos.DoubleVariable):
56
+ self.filter_variable_shape = []
57
+ elif isinstance(filtering_variable, Kratos.Array1DVariable3):
58
+ self.filter_variable_shape = [3]
59
+ else:
60
+ raise RuntimeError(f"Unsupported variable = \"{filtering_variable.Name()}\". Only supports DoubleVariable and Array1DVariable3.")
61
+
62
+ def Initialize(self) -> None:
63
+ # get the model part
64
+ self.model_part = self.model.GetModelPart(self.filtering_model_part_name)
65
+
66
+ # we create the filter in the initialize to support filter to work
67
+ # on sub model parts.
68
+ filter_function_type = self.parameters["filter_function_type"].GetString()
69
+ max_items_in_bucket = self.parameters["max_items_in_bucket"].GetInt()
70
+ echo_level = self.parameters["echo_level"].GetInt()
71
+ node_cloud_mesh = self.parameters["node_cloud_mesh"].GetBool()
72
+ store_filter_matrix = self.parameters["store_filter_matrix"].GetBool()
73
+ if self.data_location in [Kratos.Globals.DataLocation.NodeHistorical, Kratos.Globals.DataLocation.NodeNonHistorical]:
74
+ self.filter_utils = KratosOA.NodeExplicitFilterUtils(self.model_part, filter_function_type, max_items_in_bucket, echo_level, node_cloud_mesh, store_filter_matrix)
75
+ elif self.data_location == Kratos.Globals.DataLocation.Condition:
76
+ if node_cloud_mesh:
77
+ raise RuntimeError("\"node_cloud_mesh\" flag can be only used for filtering meshes with nodes.")
78
+ self.filter_utils = KratosOA.ConditionExplicitFilterUtils(self.model_part, filter_function_type, max_items_in_bucket, echo_level, store_filter_matrix=store_filter_matrix)
79
+ elif self.data_location == Kratos.Globals.DataLocation.Element:
80
+ if node_cloud_mesh:
81
+ raise RuntimeError("\"node_cloud_mesh\" flag can be only used for filtering meshes with nodes.")
82
+ self.filter_utils = KratosOA.ElementExplicitFilterUtils(self.model_part, filter_function_type, max_items_in_bucket, echo_level, store_filter_matrix=store_filter_matrix)
83
+
84
+ self.Update()
85
+
86
+ def Update(self) -> None:
87
+ # now set the filter radius. Can be changed in future to support adaptive radius methods.
88
+ filter_radius = FilterRadiusFactory(self.model_part, self.data_location, self.parameters["filter_radius_settings"])
89
+ self.filter_utils.SetRadius(filter_radius)
90
+ self.GetComponentDataView().GetUnBufferedData().SetValue("filter_radius", filter_radius, overwrite=True)
91
+
92
+ # now set the damping
93
+ stride = max(enumerate(accumulate(self.filter_variable_shape, operator.mul, initial=1)))[1]
94
+ self.damping = ExplicitFilterDampingFactory(self.model, self.data_location, stride, self.parameters["filtering_boundary_conditions"])
95
+ self.damping.SetRadius(filter_radius)
96
+ self.filter_utils.SetDamping(self.damping)
97
+
98
+ # initialize the filter
99
+ self.damping.Update()
100
+ self.filter_utils.Update()
101
+
102
+ def Check(self) -> None:
103
+ pass
104
+
105
+ def Finalize(self) -> None:
106
+ pass
107
+
108
+ def ForwardFilterField(self, control_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
109
+ return self.filter_utils.ForwardFilterField(control_field)
110
+
111
+ def BackwardFilterField(self, physical_mesh_independent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
112
+ return self.filter_utils.BackwardFilterField(physical_mesh_independent_gradient_field)
113
+
114
+ def BackwardFilterIntegratedField(self, physical_mesh_dependent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
115
+ return self.filter_utils.BackwardFilterIntegratedField(physical_mesh_dependent_gradient_field)
116
+
117
+ def UnfilterField(self, filtered_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
118
+ # WARNING: In general explicit VM doesn't need unfiltered field because it works with changes. Hence, it returns zeros and optimization runs correctly.
119
+ result = Kratos.TensorAdaptors.DoubleTensorAdaptor(filtered_field)
120
+ result.data[:] = 0.0
121
+ return result
122
+
123
+ def GetBoundaryConditions(self) -> 'list[list[Kratos.ModelPart]]':
124
+ return self.damping.GetDampedModelParts()
@@ -0,0 +1,188 @@
1
+ import typing
2
+ import abc
3
+ from importlib import import_module
4
+
5
+ import KratosMultiphysics as Kratos
6
+ from KratosMultiphysics.OptimizationApplication.utilities.union_utilities import SupportedSensitivityFieldVariableTypes
7
+ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView
8
+
9
+ class Filter(abc.ABC):
10
+ """Base filter class
11
+
12
+ This class unifies the filters used in the optimization application.
13
+ """
14
+ def __init__(self) -> None:
15
+ self.__component_data_view: 'typing.Optional[ComponentDataView]' = None
16
+
17
+ def SetComponentDataView(self, component_data_view: ComponentDataView) -> None:
18
+ """Set the component data view of the control in which this filter is being used.
19
+
20
+ This sets and allows the filter to add data/fields to space which belongs to control
21
+ within the optimization problem.
22
+
23
+ This component data view is not passed at the construction time because, filters are created
24
+ when the controls are created, hence the control data space in the optimization problem does
25
+ not exist until the control construction is finished.
26
+
27
+ Args:
28
+ component_data_view (ComponentDataView): Component data view of the control.
29
+ """
30
+ self.__component_data_view = component_data_view
31
+
32
+ def GetComponentDataView(self) -> ComponentDataView:
33
+ """Retrieve the component data view.
34
+
35
+ This method retrieves the component data view of the control, which can be used
36
+ to store data and fields.
37
+
38
+ Raises:
39
+ RuntimeError: If SetComponentDataView is not called first before calling this.
40
+
41
+ Returns:
42
+ ComponentDataView: Component data view of the control.
43
+ """
44
+ if self.__component_data_view is None:
45
+ raise RuntimeError("Please use SetComponentDataView first.")
46
+ return self.__component_data_view
47
+
48
+ @abc.abstractmethod
49
+ def Initialize(self) -> None:
50
+ """Initializes the filter.
51
+
52
+ This method initializes the filter. This is only called once in the whole optimization process.
53
+
54
+ """
55
+ pass
56
+
57
+ @abc.abstractmethod
58
+ def Check(self) -> None:
59
+ """Checks the filter.
60
+
61
+ This method checks the filter. This is only called once in the whole optimization process after calling the initialize.
62
+
63
+ """
64
+ pass
65
+
66
+ @abc.abstractmethod
67
+ def Finalize(self) -> None:
68
+ """Finalizes the filter.
69
+
70
+ This method checks the filter. This is only called once in the whole optimization process at the end.
71
+
72
+ """
73
+ pass
74
+
75
+ @abc.abstractmethod
76
+ def ForwardFilterField(self, control_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
77
+ """Return the physical field by filtering/smoothing control field
78
+
79
+ This method filters the passed input field. control_field field is assumed to be a
80
+ mesh-independent field.
81
+
82
+ Args:
83
+ control_field (Kratos.TensorAdaptors.DoubleTensorAdaptor): Input control field
84
+
85
+ Returns:
86
+ Kratos.TensorAdaptors.DoubleTensorAdaptor: Physical field.
87
+ """
88
+ pass
89
+
90
+ @abc.abstractmethod
91
+ def BackwardFilterField(self, physical_mesh_independent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
92
+ """Returns mesh-independent control space gradient from mesh-independent physical space gradient.
93
+
94
+ This method filters the passed mesh-independent input field. This is not the inverse
95
+ operator, it uses the transpose of the ForwardFilterField matrix.
96
+
97
+ Args:
98
+ physical_mesh_independent_gradient_field (Kratos.TensorAdaptors.DoubleTensorAdaptor): Mesh independent gradient field in physical space.
99
+
100
+ Returns:
101
+ Kratos.TensorAdaptors.DoubleTensorAdaptor: Mesh-independent gradient in the control space.
102
+ """
103
+ pass
104
+
105
+ @abc.abstractmethod
106
+ def BackwardFilterIntegratedField(self, physical_mesh_dependent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
107
+ """Returns mesh-independent control space gradient from mesh-dependent physical space gradient.
108
+
109
+ This method filters the passed mesh-dependent input field. This is not the inverse
110
+ operator, it uses the transpose of the ForwardFilterField matrix.
111
+
112
+ Args:
113
+ physical_mesh_dependent_gradient_field (Kratos.TensorAdaptors.DoubleTensorAdaptor): Mesh dependent gradient field in physical space.
114
+
115
+ Returns:
116
+ Kratos.TensorAdaptors.DoubleTensorAdaptor: Mesh-independent gradient in the control space.
117
+ """
118
+ pass
119
+
120
+ @abc.abstractmethod
121
+ def UnfilterField(self, physical_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
122
+ """Returns control space field from the physical space field using the inverse operator.
123
+
124
+ This method needs to compute the inverse of the matrix used in ForwardFilterField
125
+ to compute the UnfilteredField of the physical field.
126
+
127
+ Args:
128
+ physical_field (Kratos.TensorAdaptors.DoubleTensorAdaptor): Physical field.
129
+
130
+ Returns:
131
+ Kratos.TensorAdaptors.DoubleTensorAdaptor: Control field.
132
+ """
133
+ pass
134
+
135
+ @abc.abstractmethod
136
+ def Update(self) -> None:
137
+ """Updates the filter.
138
+
139
+ This method is used to update the filter state. This will be called by the control, when control changes
140
+ the optimization domain.
141
+
142
+ """
143
+ pass
144
+
145
+ @abc.abstractmethod
146
+ def GetBoundaryConditions(self) -> 'list[list[Kratos.ModelPart]]':
147
+ """Returns boundary conditions.
148
+
149
+ This returns a list of model parts where the filter is having fixed
150
+ boundary conditions for each component for the variable this filter
151
+ is being used.
152
+
153
+ Returns:
154
+ list[list[Kratos.ModelPart]]: list of fixed boundary condition model parts for each component.
155
+ """
156
+ pass
157
+
158
+ def Factory(model: Kratos.Model, filtering_model_part_name: str, variable: SupportedSensitivityFieldVariableTypes, data_location: Kratos.Globals.DataLocation, settings: Kratos.Parameters) -> Filter:
159
+ """Factory method used to create filters.
160
+
161
+ This factory allows to use different types of filters in different controls. Since the filtering should
162
+ support sub-model parts as well, the filtering_model_part_name is passed as a string because, at the time of
163
+ filter construction from this factory, model part may only have root model parts.
164
+
165
+ Args:
166
+ model (Kratos.Model): Model of the problem
167
+ filtering_model_part_name (str): Model part on which the filtering is applied (Can be a sub-model part as well.)
168
+ variable (SupportedSensitivityFieldVariableTypes): Variable to be filtered by this filter.
169
+ data_location (Kratos.Globals.DataLocation): Location to be used with this filter.
170
+ settings (Kratos.Parameters): Filter specific settings.
171
+
172
+ Raises:
173
+ RuntimeError: If "filter_type" is not specified in the settings
174
+ RuntimeError: If the requested "filter_type" does not have the Factory method implemented.
175
+
176
+ Returns:
177
+ Filter: Filter specified by the "filter_type"
178
+ """
179
+ if not settings.Has("filter_type"):
180
+ raise RuntimeError(f"\"filter_type\" not provided in the following filter settings:\n{settings}")
181
+
182
+ filter_type = settings["filter_type"].GetString()
183
+ filter_module_name = f"KratosMultiphysics.OptimizationApplication.filtering.{filter_type}"
184
+
185
+ module = import_module(filter_module_name)
186
+ if not hasattr(module, "Factory"):
187
+ raise RuntimeError(f"Python module {filter_module_name} does not have a Factory method.")
188
+ return getattr(module, "Factory")(model, filtering_model_part_name, variable, data_location, settings)
@@ -0,0 +1,55 @@
1
+ import typing
2
+
3
+ import KratosMultiphysics as Kratos
4
+ import KratosMultiphysics.OptimizationApplication as KratosOA
5
+
6
+ def FilterRadiusFactory(model_part: Kratos.ModelPart, container_type: Kratos.Globals.DataLocation, filter_radius_settings: Kratos.Parameters) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
7
+ if not filter_radius_settings.Has("filter_radius_type"):
8
+ raise RuntimeError(f"\"filter_radius_type\" not specified in the following settings:\n{filter_radius_settings}")
9
+
10
+ filter_radius_type = filter_radius_settings["filter_radius_type"].GetString()
11
+ if filter_radius_type == "constant":
12
+ defaults = Kratos.Parameters("""{
13
+ "filter_radius_type": "constant",
14
+ "filter_radius" : 0.2
15
+ }""")
16
+ filter_radius_settings.ValidateAndAssignDefaults(defaults)
17
+
18
+ if container_type == Kratos.Globals.DataLocation.NodeHistorical or container_type == Kratos.Globals.DataLocation.NodeNonHistorical:
19
+ return Kratos.TensorAdaptors.DoubleTensorAdaptor(model_part.Nodes, Kratos.DoubleNDData([model_part.NumberOfNodes()], filter_radius_settings["filter_radius"].GetDouble()), copy=False)
20
+ elif container_type == Kratos.Globals.DataLocation.Condition:
21
+ return Kratos.TensorAdaptors.DoubleTensorAdaptor(model_part.Conditions, Kratos.DoubleNDData([model_part.NumberOfConditions()], filter_radius_settings["filter_radius"].GetDouble()), copy=False)
22
+ elif container_type == Kratos.Globals.DataLocation.Element:
23
+ return Kratos.TensorAdaptors.DoubleTensorAdaptor(model_part.Elements, Kratos.DoubleNDData([model_part.NumberOfElements()], filter_radius_settings["filter_radius"].GetDouble()), copy=False)
24
+ else:
25
+ raise RuntimeError(f"Unsupported container_type.")
26
+ else:
27
+ raise RuntimeError(f"Unsupported filter_radius_type = \"{filter_radius_type}\".")
28
+
29
+ def ExplicitFilterDampingFactory(model: Kratos.Model, data_location: Kratos.Globals.DataLocation, stride: int, parameters: Kratos.Parameters) -> 'typing.Union[KratosOA.NodeExplicitDamping, KratosOA.ConditionExplicitDamping, KratosOA.ElementExplicitDamping]':
30
+ if not parameters.Has("damping_type"):
31
+ raise RuntimeError(f"\"damping_type\" not specified in the following settings:\n{parameters}")
32
+
33
+ damping_types_dict: 'dict[Kratos.Globals.DataLocation, dict[str, typing.Type[typing.Union[KratosOA.NodeExplicitDamping, KratosOA.ConditionExplicitDamping, KratosOA.ElementExplicitDamping]]]]' = {
34
+ Kratos.Globals.DataLocation.NodeHistorical: {
35
+ "nearest_entity": KratosOA.NearestNodeExplicitDamping,
36
+ "integrated_nearest_entity": KratosOA.IntegratedNearestNodeExplicitDamping
37
+ },
38
+ Kratos.Globals.DataLocation.NodeNonHistorical: {
39
+ "nearest_entity": KratosOA.NearestNodeExplicitDamping,
40
+ "integrated_nearest_entity": KratosOA.IntegratedNearestNodeExplicitDamping
41
+ },
42
+ Kratos.Globals.DataLocation.Condition: {
43
+ "nearest_entity": KratosOA.NearestConditionExplicitDamping,
44
+ "integrated_nearest_entity": KratosOA.IntegratedNearestConditionExplicitDamping
45
+ },
46
+ Kratos.Globals.DataLocation.Element: {
47
+ "nearest_entity": KratosOA.NearestElementExplicitDamping,
48
+ "integrated_nearest_entity": KratosOA.IntegratedNearestElementExplicitDamping
49
+ }
50
+ }
51
+
52
+ damping_type = parameters["damping_type"].GetString()
53
+ if damping_type not in damping_types_dict[data_location].keys():
54
+ raise RuntimeError(f"Unsupported damping_type = \"{damping_type}\". Followings are supported:\n\t" + "\n\t".join(damping_types_dict[data_location].keys()))
55
+ return damping_types_dict[data_location][damping_type](model, parameters, stride)