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.
- KratosMultiphysics/.libs/KratosOptimizationApplication.so +0 -0
- KratosMultiphysics/.libs/libKratosOptimizationCore.dylib +0 -0
- KratosMultiphysics/OptimizationApplication/__init__.py +19 -0
- KratosMultiphysics/OptimizationApplication/algorithms/NLOPT_algorithms.py +255 -0
- KratosMultiphysics/OptimizationApplication/algorithms/SciPy_algorithms.py +154 -0
- KratosMultiphysics/OptimizationApplication/algorithms/__init__.py +0 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm.py +78 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_adam.py +68 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_base.py +393 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_gradient_projection.py +355 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_momentum_relaxed_gradient_projection.py +70 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_nesterov_accelarated_gradient.py +60 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_relaxed_gradient_projection.py +263 -0
- KratosMultiphysics/OptimizationApplication/algorithms/algorithm_steepest_descent.py +205 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_constraint.py +194 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_NLOPT_objective.py +191 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_constraint.py +123 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_SciPy_objective.py +148 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_constraint.py +180 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_objective.py +133 -0
- KratosMultiphysics/OptimizationApplication/algorithms/standardized_rgp_constraint.py +268 -0
- KratosMultiphysics/OptimizationApplication/analyses_controller.py +75 -0
- KratosMultiphysics/OptimizationApplication/controls/control.py +123 -0
- KratosMultiphysics/OptimizationApplication/controls/external_response_function_control.py +149 -0
- KratosMultiphysics/OptimizationApplication/controls/master_control.py +198 -0
- KratosMultiphysics/OptimizationApplication/controls/material/material_properties_control.py +115 -0
- KratosMultiphysics/OptimizationApplication/controls/material/simp_control.py +229 -0
- KratosMultiphysics/OptimizationApplication/controls/shape/vertex_morphing_shape_control.py +289 -0
- KratosMultiphysics/OptimizationApplication/controls/thickness/shell_thickness_control.py +180 -0
- KratosMultiphysics/OptimizationApplication/controls_controller.py +205 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/avg_abs_improvement_conv_criterion.py +98 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/combined_conv_criterion.py +87 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/constraint_conv_criterion.py +68 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/convergence_criterion.py +26 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/l2_conv_criterion.py +77 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/magnitude_reduction_conv_criterion.py +85 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/max_iter_conv_criterion.py +48 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/patience_conv_criterion.py +116 -0
- KratosMultiphysics/OptimizationApplication/convergence_criteria/target_value_conv_criterion.py +64 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy.py +46 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/execution_policy_decorator.py +67 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/independent_analysis_execution_policy.py +78 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/kratos_analysis_execution_policy.py +137 -0
- KratosMultiphysics/OptimizationApplication/execution_policies/stepping_analysis_execution_policy.py +88 -0
- KratosMultiphysics/OptimizationApplication/filtering/explicit_filter.py +124 -0
- KratosMultiphysics/OptimizationApplication/filtering/filter.py +188 -0
- KratosMultiphysics/OptimizationApplication/filtering/filter_utils.py +55 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_analysis.py +139 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_scalar_solver.py +39 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_shape_solver.py +67 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_solver_base.py +275 -0
- KratosMultiphysics/OptimizationApplication/filtering/helmholtz_vector_solver.py +39 -0
- KratosMultiphysics/OptimizationApplication/filtering/implicit_filter.py +192 -0
- KratosMultiphysics/OptimizationApplication/filtering/python_solvers_wrapper_implicit_filters.py +56 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/connectivity_preserving_model_part_controller.py +72 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/external_response_function_model_part_controller.py +110 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/mdpa_model_part_controller.py +44 -0
- KratosMultiphysics/OptimizationApplication/model_part_controllers/model_part_controller.py +19 -0
- KratosMultiphysics/OptimizationApplication/model_parts_controller.py +92 -0
- KratosMultiphysics/OptimizationApplication/optimization_analysis.py +146 -0
- KratosMultiphysics/OptimizationApplication/optimizations_controller.py +223 -0
- KratosMultiphysics/OptimizationApplication/optimizer.py +61 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_ascii_output_process.py +212 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_field_output_process.py +122 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_graph_output_process.py +184 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_hdf5_output_process.py +84 -0
- KratosMultiphysics/OptimizationApplication/processes/optimization_problem_vtu_output_process.py +94 -0
- KratosMultiphysics/OptimizationApplication/processes/spatial_statistics_computation_process.py +81 -0
- KratosMultiphysics/OptimizationApplication/responses/__init__.py +0 -0
- KratosMultiphysics/OptimizationApplication/responses/additive_manufacturing_responses.py +410 -0
- KratosMultiphysics/OptimizationApplication/responses/analysis_based_response_function_factory.py +14 -0
- KratosMultiphysics/OptimizationApplication/responses/analysis_free_response_function_factory.py +14 -0
- KratosMultiphysics/OptimizationApplication/responses/base_response.py +66 -0
- KratosMultiphysics/OptimizationApplication/responses/binary_operator_response_function.py +103 -0
- KratosMultiphysics/OptimizationApplication/responses/combined_response_function.py +127 -0
- KratosMultiphysics/OptimizationApplication/responses/discrete_value_residual_response_function.py +131 -0
- KratosMultiphysics/OptimizationApplication/responses/evaluation_response_function.py +68 -0
- KratosMultiphysics/OptimizationApplication/responses/external_response_function.py +87 -0
- KratosMultiphysics/OptimizationApplication/responses/geometric_centroid_deviation_response_function.py +97 -0
- KratosMultiphysics/OptimizationApplication/responses/linear_strain_energy_response_function.py +72 -0
- KratosMultiphysics/OptimizationApplication/responses/literal_value_response_function.py +33 -0
- KratosMultiphysics/OptimizationApplication/responses/log_response_function.py +47 -0
- KratosMultiphysics/OptimizationApplication/responses/mass_response_function.py +71 -0
- KratosMultiphysics/OptimizationApplication/responses/response_function.py +126 -0
- KratosMultiphysics/OptimizationApplication/responses/response_routine.py +158 -0
- KratosMultiphysics/OptimizationApplication/responses/structural_responses.py +335 -0
- KratosMultiphysics/OptimizationApplication/responses_controller.py +390 -0
- KratosMultiphysics/OptimizationApplication/utilities/buffered_dict.py +399 -0
- KratosMultiphysics/OptimizationApplication/utilities/component_data_view.py +74 -0
- KratosMultiphysics/OptimizationApplication/utilities/helper_utilities.py +40 -0
- KratosMultiphysics/OptimizationApplication/utilities/logger_utilities.py +222 -0
- KratosMultiphysics/OptimizationApplication/utilities/model_part_utilities.py +117 -0
- KratosMultiphysics/OptimizationApplication/utilities/opt_line_search.py +173 -0
- KratosMultiphysics/OptimizationApplication/utilities/opt_projection.py +191 -0
- KratosMultiphysics/OptimizationApplication/utilities/optimization_problem.py +237 -0
- KratosMultiphysics/OptimizationApplication/utilities/optimization_problem_utilities.py +237 -0
- KratosMultiphysics/OptimizationApplication/utilities/response_utilities.py +249 -0
- KratosMultiphysics/OptimizationApplication/utilities/timer.py +45 -0
- KratosMultiphysics/OptimizationApplication/utilities/union_utilities.py +6 -0
- kratosoptimizationapplication-10.4.4.dist-info/METADATA +25 -0
- kratosoptimizationapplication-10.4.4.dist-info/RECORD +106 -0
- kratosoptimizationapplication-10.4.4.dist-info/WHEEL +6 -0
- kratosoptimizationapplication.dylibs/libKratosCore.dylib +4 -0
- kratosoptimizationapplication.dylibs/libgcc_s.1.1.dylib +0 -0
- kratosoptimizationapplication.dylibs/libgomp.1.dylib +0 -0
- kratosoptimizationapplication.dylibs/libstdc++.6.dylib +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
import KratosMultiphysics as Kratos
|
|
4
|
+
import KratosMultiphysics.OptimizationApplication as KratosOA
|
|
5
|
+
from KratosMultiphysics.OptimizationApplication.filtering.filter import Filter
|
|
6
|
+
from KratosMultiphysics.OptimizationApplication.utilities.union_utilities import SupportedSensitivityFieldVariableTypes
|
|
7
|
+
from KratosMultiphysics.OptimizationApplication.filtering.helmholtz_analysis import HelmholtzAnalysis
|
|
8
|
+
|
|
9
|
+
def Factory(model: Kratos.Model, filtering_model_part_name: str, filtering_variable: SupportedSensitivityFieldVariableTypes, data_location: Kratos.Globals.DataLocation, parameters: Kratos.Parameters) -> Filter:
|
|
10
|
+
return ImplicitFilter(model, filtering_model_part_name, filtering_variable, data_location, parameters)
|
|
11
|
+
|
|
12
|
+
class ImplicitFilter(Filter):
|
|
13
|
+
@classmethod
|
|
14
|
+
def GetDefaultParameters(cls) -> Kratos.Parameters:
|
|
15
|
+
return Kratos.Parameters("""{
|
|
16
|
+
"filter_type" : "implicit_filter",
|
|
17
|
+
"filter_radius" : 0.2,
|
|
18
|
+
"filter_variable_type" : "auto",
|
|
19
|
+
"linear_solver_settings" : {},
|
|
20
|
+
"echo_level" : 0,
|
|
21
|
+
"filtering_boundary_conditions": {}
|
|
22
|
+
}""")
|
|
23
|
+
|
|
24
|
+
def __init__(self, model: Kratos.Model, filtering_model_part_name: str, filtering_variable: SupportedSensitivityFieldVariableTypes, data_location: Kratos.Globals.DataLocation, parameters: Kratos.Parameters) -> None:
|
|
25
|
+
super().__init__()
|
|
26
|
+
|
|
27
|
+
self.model = model
|
|
28
|
+
self.filtering_model_part_name = filtering_model_part_name
|
|
29
|
+
self.filtering_variable = filtering_variable
|
|
30
|
+
self.data_location = data_location
|
|
31
|
+
|
|
32
|
+
self.parameters = parameters
|
|
33
|
+
self.parameters.ValidateAndAssignDefaults(self.GetDefaultParameters())
|
|
34
|
+
|
|
35
|
+
supported_data_locations = [
|
|
36
|
+
Kratos.Globals.DataLocation.NodeHistorical,
|
|
37
|
+
Kratos.Globals.DataLocation.NodeNonHistorical,
|
|
38
|
+
Kratos.Globals.DataLocation.Condition,
|
|
39
|
+
Kratos.Globals.DataLocation.Element
|
|
40
|
+
]
|
|
41
|
+
if data_location not in supported_data_locations:
|
|
42
|
+
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]))
|
|
43
|
+
|
|
44
|
+
allowed_filter_variable_types = ["auto", "general_scalar", "general_vector", "shape"]
|
|
45
|
+
filter_variable_type = self.parameters["filter_variable_type"].GetString()
|
|
46
|
+
if not filter_variable_type in allowed_filter_variable_types:
|
|
47
|
+
raise RuntimeError(f"Unsupported filter_variable_type = \"{filter_variable_type}\". Followings are supported:\n\t" + "\n\t".join(allowed_filter_variable_types))
|
|
48
|
+
|
|
49
|
+
if filter_variable_type == "auto":
|
|
50
|
+
if isinstance(filtering_variable, Kratos.DoubleVariable):
|
|
51
|
+
self.filter_type = "general_scalar"
|
|
52
|
+
elif isinstance(filtering_variable, Kratos.Array1DVariable3):
|
|
53
|
+
if filtering_variable == KratosOA.SHAPE:
|
|
54
|
+
self.filter_type = "shape"
|
|
55
|
+
else:
|
|
56
|
+
self.filter_type = "general_vector"
|
|
57
|
+
else:
|
|
58
|
+
raise RuntimeError(f"Unsupported variable type [ variable name = {filtering_variable.Name()}]")
|
|
59
|
+
else:
|
|
60
|
+
self.filter_type = filter_variable_type
|
|
61
|
+
|
|
62
|
+
if self.filter_type == "general_scalar" and not isinstance(filtering_variable, Kratos.DoubleVariable):
|
|
63
|
+
raise RuntimeError(f"\"general_scalar\" only supports scalar variables [ variable name = {filtering_variable.Name()} ].")
|
|
64
|
+
if self.filter_type == "general_vector" and not isinstance(filtering_variable, Kratos.Array1DVariable3):
|
|
65
|
+
raise RuntimeError(f"\"general_vector\" only supports array3 variables [ variable name = {filtering_variable.Name()} ].")
|
|
66
|
+
if self.filter_type == "shape" and filtering_variable != KratosOA.SHAPE:
|
|
67
|
+
raise RuntimeError(f"\"shape\" only supports SHAPE variable [ variable name = {filtering_variable.Name()} ].")
|
|
68
|
+
|
|
69
|
+
helmholtz_settings = self.__GetImplicitFilterParameters(filtering_model_part_name, self.parameters)
|
|
70
|
+
|
|
71
|
+
self.filter_analysis = HelmholtzAnalysis(self.model, helmholtz_settings)
|
|
72
|
+
|
|
73
|
+
solving_var = self.filter_analysis._GetSolver().GetSolvingVariable()
|
|
74
|
+
if isinstance(solving_var, Kratos.DoubleVariable):
|
|
75
|
+
self.filter_variables = [solving_var]
|
|
76
|
+
elif isinstance(solving_var, Kratos.Array1DVariable3):
|
|
77
|
+
self.filter_variables = list(map(lambda x: Kratos.KratosGlobals.GetVariable(x), [f"{solving_var.Name()}_{suffix}" for suffix in ["X", "Y", "Z"]]))
|
|
78
|
+
else:
|
|
79
|
+
raise RuntimeError(f"Unsupported solving variable [ solving variable name = {solving_var.Name()} ].")
|
|
80
|
+
|
|
81
|
+
self.damped_model_parts: 'typing.Optional[list[list[Kratos.ModelPart]]]' = None
|
|
82
|
+
|
|
83
|
+
def Initialize(self) -> None:
|
|
84
|
+
self.filter_analysis.Initialize()
|
|
85
|
+
self.__ApplyBoundaryConditions()
|
|
86
|
+
|
|
87
|
+
def Update(self) -> None:
|
|
88
|
+
pass
|
|
89
|
+
|
|
90
|
+
def Check(self) -> None:
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
def Finalize(self) -> None:
|
|
94
|
+
self.filter_analysis.Finalize()
|
|
95
|
+
|
|
96
|
+
def ForwardFilterField(self, control_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
97
|
+
if self.filter_analysis._GetSolver().GetOriginModelPart()[KratosOA.NUMBER_OF_SOLVERS_USING_NODES] > 1:
|
|
98
|
+
self.__ReInitializeFilteringModelPart()
|
|
99
|
+
return self.filter_analysis.FilterField(control_field)
|
|
100
|
+
|
|
101
|
+
def BackwardFilterField(self, physical_mesh_independent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
102
|
+
if self.filter_analysis._GetSolver().GetOriginModelPart()[KratosOA.NUMBER_OF_SOLVERS_USING_NODES] > 1:
|
|
103
|
+
self.__ReInitializeFilteringModelPart()
|
|
104
|
+
return self.filter_analysis.FilterField(physical_mesh_independent_gradient_field)
|
|
105
|
+
|
|
106
|
+
def BackwardFilterIntegratedField(self, physical_mesh_dependent_gradient_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
107
|
+
if self.filter_analysis._GetSolver().GetOriginModelPart()[KratosOA.NUMBER_OF_SOLVERS_USING_NODES] > 1:
|
|
108
|
+
self.__ReInitializeFilteringModelPart()
|
|
109
|
+
return self.filter_analysis.FilterIntegratedField(physical_mesh_dependent_gradient_field)
|
|
110
|
+
|
|
111
|
+
def UnfilterField(self, physical_field: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
112
|
+
if self.filter_analysis._GetSolver().GetOriginModelPart()[KratosOA.NUMBER_OF_SOLVERS_USING_NODES] > 1:
|
|
113
|
+
self.__ReInitializeFilteringModelPart()
|
|
114
|
+
# now we get the current values
|
|
115
|
+
current_values_ta = Kratos.TensorAdaptors.HistoricalVariableTensorAdaptor(self.filter_analysis._GetComputingModelPart().Nodes, self.filter_analysis._GetSolver().GetSolvingVariable())
|
|
116
|
+
current_values_ta.CollectData()
|
|
117
|
+
|
|
118
|
+
# now apply the physical field
|
|
119
|
+
self.filter_analysis.AssignTensorDataToNodalSolution(physical_field)
|
|
120
|
+
unfiltered_field = self.filter_analysis.UnFilterField(physical_field)
|
|
121
|
+
|
|
122
|
+
# now apply back the original BCs
|
|
123
|
+
current_values_ta.StoreData()
|
|
124
|
+
return unfiltered_field
|
|
125
|
+
|
|
126
|
+
def GetBoundaryConditions(self) -> 'list[list[Kratos.ModelPart]]':
|
|
127
|
+
return self.damped_model_parts
|
|
128
|
+
|
|
129
|
+
def __GetImplicitFilterParameters(self, filter_variable_typel_part_name: str, parameters: Kratos.Parameters):
|
|
130
|
+
implicit_vector_filter_parameters = Kratos.Parameters("""
|
|
131
|
+
{
|
|
132
|
+
"solver_settings" : {
|
|
133
|
+
"domain_size" : 3,
|
|
134
|
+
"echo_level" : 0,
|
|
135
|
+
"filter_type" : "general_vector",
|
|
136
|
+
"model_part_name" : "",
|
|
137
|
+
"filter_radius" : 0.0,
|
|
138
|
+
"model_import_settings": {
|
|
139
|
+
"input_type" : "use_input_model_part"
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"problem_data": {
|
|
143
|
+
"echo_level" : 0,
|
|
144
|
+
"start_time" : 0.0,
|
|
145
|
+
"end_time" : 1.0,
|
|
146
|
+
"parallel_type" : "OpenMP"
|
|
147
|
+
}
|
|
148
|
+
}""")
|
|
149
|
+
|
|
150
|
+
implicit_vector_filter_parameters["solver_settings"]["echo_level"].SetInt(parameters["echo_level"].GetInt())
|
|
151
|
+
implicit_vector_filter_parameters["solver_settings"]["filter_radius"].SetDouble(parameters["filter_radius"].GetDouble())
|
|
152
|
+
implicit_vector_filter_parameters["solver_settings"]["filter_type"].SetString(self.filter_type)
|
|
153
|
+
implicit_vector_filter_parameters["solver_settings"]["model_part_name"].SetString(filter_variable_typel_part_name)
|
|
154
|
+
|
|
155
|
+
linear_solver_settings = parameters["linear_solver_settings"]
|
|
156
|
+
if linear_solver_settings.Has("solver_type"):
|
|
157
|
+
implicit_vector_filter_parameters["solver_settings"].AddValue("linear_solver_settings", linear_solver_settings)
|
|
158
|
+
|
|
159
|
+
return implicit_vector_filter_parameters
|
|
160
|
+
|
|
161
|
+
def __ReInitializeFilteringModelPart(self) -> None:
|
|
162
|
+
self.filter_analysis.InitializeFilterModelPart()
|
|
163
|
+
self.__ApplyBoundaryConditions()
|
|
164
|
+
|
|
165
|
+
def __ApplyBoundaryConditions(self) -> None:
|
|
166
|
+
# first free the domain, because if the same type of filter used, that means same nodes
|
|
167
|
+
# were used before with different boundary conditions. Hence it is important to free all dofs
|
|
168
|
+
# and apply the boundary conditions again when ever filter is used.
|
|
169
|
+
# This is because, every implicit filter shares the same nodes
|
|
170
|
+
list(map(lambda filter_var: Kratos.VariableUtils().ApplyFixity(filter_var, False, self.filter_analysis._GetSolver().GetComputingModelPart().Nodes), self.filter_variables))
|
|
171
|
+
|
|
172
|
+
# now re-apply the boundary conditions
|
|
173
|
+
self.damped_model_parts = KratosOA.OptimizationUtils.GetComponentWiseModelParts(self.model, self.parameters["filtering_boundary_conditions"])
|
|
174
|
+
if len(self.filter_variables) != len(self.damped_model_parts) and len(self.damped_model_parts) != 0:
|
|
175
|
+
raise RuntimeError("Number of components mismatch.")
|
|
176
|
+
list_of_boundary_model_parts: 'list[Kratos.ModelPart]' = []
|
|
177
|
+
|
|
178
|
+
for component_index, boundary_model_parts in enumerate(self.damped_model_parts):
|
|
179
|
+
for model_part in boundary_model_parts:
|
|
180
|
+
list_of_boundary_model_parts.append(model_part)
|
|
181
|
+
Kratos.VariableUtils().ApplyFixity(self.filter_variables[component_index], True, model_part.Nodes)
|
|
182
|
+
|
|
183
|
+
# make all the boundaries to zero
|
|
184
|
+
for model_part in list_of_boundary_model_parts:
|
|
185
|
+
for filter_variable in self.filter_variables:
|
|
186
|
+
zero_field = Kratos.TensorAdaptors.HistoricalVariableTensorAdaptor(model_part.Nodes, filter_variable)
|
|
187
|
+
zero_field.data[:] = 0.0
|
|
188
|
+
zero_field.StoreData()
|
|
189
|
+
|
|
190
|
+
Kratos.Logger.PrintInfo(self.__class__.__name__, f"Applied filter boundary conditions used in \"{self.GetComponentDataView().GetComponentName()}\".")
|
|
191
|
+
|
|
192
|
+
|
KratosMultiphysics/OptimizationApplication/filtering/python_solvers_wrapper_implicit_filters.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import KratosMultiphysics
|
|
2
|
+
from importlib import import_module
|
|
3
|
+
from KratosMultiphysics.OptimizationApplication.filtering.helmholtz_solver_base import HelmholtzSolverBase
|
|
4
|
+
|
|
5
|
+
def CreateSolverByParameters(model: KratosMultiphysics.Model, solver_settings: KratosMultiphysics.Parameters, parallelism: str) -> HelmholtzSolverBase:
|
|
6
|
+
|
|
7
|
+
filter_type = solver_settings["filter_type"].GetString()
|
|
8
|
+
|
|
9
|
+
# Solvers for OpenMP parallelism
|
|
10
|
+
if parallelism == "OpenMP":
|
|
11
|
+
|
|
12
|
+
if filter_type == "general_scalar":
|
|
13
|
+
solver_module_name = "helmholtz_scalar_solver"
|
|
14
|
+
elif filter_type == "general_vector":
|
|
15
|
+
solver_module_name = "helmholtz_vector_solver"
|
|
16
|
+
elif (filter_type == "bulk_surface_shape" or filter_type == "shape"):
|
|
17
|
+
solver_module_name = "helmholtz_shape_solver"
|
|
18
|
+
else:
|
|
19
|
+
err_msg = 'The requested solver type "' + filter_type + '" is not in the python solvers wrapper\n'
|
|
20
|
+
err_msg += 'Available options are: "general_scalar", "general_vector", "shape"'
|
|
21
|
+
raise Exception(err_msg)
|
|
22
|
+
|
|
23
|
+
# Solvers for MPI parallelism
|
|
24
|
+
elif parallelism == "MPI":
|
|
25
|
+
if filter_type == "general_scalar":
|
|
26
|
+
solver_module_name = "trilinos_helmholtz_general_scalar_solver"
|
|
27
|
+
elif filter_type == "general_vector":
|
|
28
|
+
solver_module_name = "trilinos_helmholtz_general_vector_solver"
|
|
29
|
+
elif (filter_type == "bulk_surface_shape" or filter_type == "shape"):
|
|
30
|
+
solver_module_name = "trilinos_helmholtz_shape_solver"
|
|
31
|
+
else:
|
|
32
|
+
err_msg = 'The requested solver type "' + filter_type + '" is not in the python solvers wrapper\n'
|
|
33
|
+
err_msg += 'Available options are: "general_scalar", "general_vector", "bulk_surface_shape", "shape"'
|
|
34
|
+
raise Exception(err_msg)
|
|
35
|
+
else:
|
|
36
|
+
err_msg = 'The requested parallel type "' + parallelism + '" is not available!\n'
|
|
37
|
+
err_msg += 'Available options are: "OpenMP", "MPI"'
|
|
38
|
+
raise Exception(err_msg)
|
|
39
|
+
|
|
40
|
+
module_full = 'KratosMultiphysics.OptimizationApplication.filtering.' + solver_module_name
|
|
41
|
+
solver = import_module(module_full).CreateSolver(model, solver_settings)
|
|
42
|
+
|
|
43
|
+
return solver
|
|
44
|
+
|
|
45
|
+
def CreateSolver(model: KratosMultiphysics.Model, custom_settings: KratosMultiphysics.Parameters) -> HelmholtzSolverBase:
|
|
46
|
+
|
|
47
|
+
if not isinstance(model, KratosMultiphysics.Model):
|
|
48
|
+
raise Exception("input is expected to be provided as a Kratos Model object")#
|
|
49
|
+
|
|
50
|
+
if not isinstance(custom_settings, KratosMultiphysics.Parameters):
|
|
51
|
+
raise Exception("input is expected to be provided as a Kratos Parameters object")
|
|
52
|
+
|
|
53
|
+
solver_settings = custom_settings["solver_settings"]
|
|
54
|
+
parallelism = custom_settings["problem_data"]["parallel_type"].GetString()
|
|
55
|
+
|
|
56
|
+
return CreateSolverByParameters(model, solver_settings, parallelism)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import KratosMultiphysics as Kratos
|
|
2
|
+
import KratosMultiphysics.OptimizationApplication as KratosOA
|
|
3
|
+
from KratosMultiphysics.OptimizationApplication.model_part_controllers.model_part_controller import ModelPartController
|
|
4
|
+
|
|
5
|
+
def Factory(model: Kratos.Model, parameters: Kratos.Parameters, _) -> ModelPartController:
|
|
6
|
+
if not parameters.Has("settings"):
|
|
7
|
+
raise RuntimeError(f"ConnectivityPreservingModelPartController instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
|
|
8
|
+
return ConnectivityPreservingModelPartController(model, parameters["settings"])
|
|
9
|
+
|
|
10
|
+
class ConnectivityPreservingModelPartController(ModelPartController):
|
|
11
|
+
def __init__(self, model: Kratos.Model, parameters: Kratos.Parameters):
|
|
12
|
+
default_settings = Kratos.Parameters("""{
|
|
13
|
+
"transformation_settings": [
|
|
14
|
+
{
|
|
15
|
+
"source_model_part_name" : "",
|
|
16
|
+
"destination_model_part_name": "",
|
|
17
|
+
"destination_element_name" : "",
|
|
18
|
+
"destination_condition_name" : ""
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}""")
|
|
22
|
+
|
|
23
|
+
self.model = model
|
|
24
|
+
self.parameters = parameters
|
|
25
|
+
self.parameters.ValidateAndAssignDefaults(default_settings)
|
|
26
|
+
|
|
27
|
+
for sub_model_part_settings in self.parameters["transformation_settings"].values():
|
|
28
|
+
sub_model_part_settings.ValidateAndAssignDefaults(default_settings["transformation_settings"].values()[0])
|
|
29
|
+
|
|
30
|
+
def ImportModelPart(self) -> None:
|
|
31
|
+
connectivity_preserve_modeller = Kratos.ConnectivityPreserveModeler()
|
|
32
|
+
for transformation_settings in self.parameters["transformation_settings"].values():
|
|
33
|
+
# get source and destination model parts
|
|
34
|
+
source_model_part = self.model[transformation_settings["source_model_part_name"].GetString()]
|
|
35
|
+
destination_model_part_name: str = transformation_settings["destination_model_part_name"].GetString()
|
|
36
|
+
if not self.model.HasModelPart(destination_model_part_name):
|
|
37
|
+
# if the destination model part is not there, then check whether the destination root model part is existing
|
|
38
|
+
destination_root_model_part_name = destination_model_part_name.split(".")[0]
|
|
39
|
+
if not self.model.HasModelPart(destination_root_model_part_name):
|
|
40
|
+
# destination root model part is also not there. so we can safely assign the source model part solution variables list
|
|
41
|
+
destination_root_model_part = self.model.CreateModelPart(destination_root_model_part_name)
|
|
42
|
+
else:
|
|
43
|
+
# if it is existing, then check whether it has a subset of the variables list.
|
|
44
|
+
destination_root_model_part = self.model[destination_root_model_part_name]
|
|
45
|
+
print(source_model_part)
|
|
46
|
+
print(destination_root_model_part)
|
|
47
|
+
if not KratosOA.OptimizationUtils.IsSolutionStepVariablesListASubSet(source_model_part, destination_root_model_part):
|
|
48
|
+
msg = f"The destination root model part solution step variables at {destination_root_model_part.FullName()} is not a sub set of {source_model_part.FullName()}"
|
|
49
|
+
msg += f"\n\t{destination_root_model_part.FullName()} model part variables list:\n\t\t" + "\n\t\t".join(KratosOA.OptimizationUtils.GetSolutionStepVariableNamesList(destination_root_model_part))
|
|
50
|
+
msg += f"\n\t{source_model_part.FullName()} model part variables list:\n\t\t" + "\n\t\t".join(KratosOA.OptimizationUtils.GetSolutionStepVariableNamesList(source_model_part))
|
|
51
|
+
raise RuntimeError(msg)
|
|
52
|
+
KratosOA.OptimizationUtils.SetSolutionStepVariablesList(destination_root_model_part, source_model_part)
|
|
53
|
+
destination_model_part = self.model.CreateModelPart(destination_model_part_name)
|
|
54
|
+
else:
|
|
55
|
+
destination_model_part = self.model[destination_model_part_name]
|
|
56
|
+
|
|
57
|
+
element_name = transformation_settings["destination_element_name"].GetString()
|
|
58
|
+
condition_name = transformation_settings["destination_condition_name"].GetString()
|
|
59
|
+
|
|
60
|
+
if condition_name != "" and element_name != "":
|
|
61
|
+
connectivity_preserve_modeller.GenerateModelPart(source_model_part, destination_model_part, element_name, condition_name)
|
|
62
|
+
elif element_name != "":
|
|
63
|
+
connectivity_preserve_modeller.GenerateModelPart(source_model_part, destination_model_part, element_name)
|
|
64
|
+
elif condition_name != "":
|
|
65
|
+
connectivity_preserve_modeller.GenerateModelPart(source_model_part, destination_model_part, condition_name)
|
|
66
|
+
else:
|
|
67
|
+
raise RuntimeError("The element_name and the condition name cannot be empty.")
|
|
68
|
+
|
|
69
|
+
Kratos.Logger.PrintInfo(self.__class__.__name__, f"Duplicated {source_model_part.FullName()} in to {destination_model_part.FullName()}.")
|
|
70
|
+
|
|
71
|
+
def GetModelPart(self) -> Kratos.ModelPart:
|
|
72
|
+
return None
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import KratosMultiphysics as Kratos
|
|
2
|
+
import KratosMultiphysics.OptimizationApplication as KratosOA
|
|
3
|
+
from KratosMultiphysics.OptimizationApplication.model_part_controllers.model_part_controller import ModelPartController
|
|
4
|
+
|
|
5
|
+
def Factory(model: Kratos.Model, parameters: Kratos.Parameters, _) -> ModelPartController:
|
|
6
|
+
if not parameters.Has("settings"):
|
|
7
|
+
raise RuntimeError(f"ExternalResponseFunctionModelPartController instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
|
|
8
|
+
return ExternalResponseFunctionModelPartController(model, parameters["settings"])
|
|
9
|
+
|
|
10
|
+
class LocationAgnosticDesignPoints:
|
|
11
|
+
def __init__(self, model_part: Kratos.ModelPart, parameters: Kratos.Parameters):
|
|
12
|
+
default_settings = Kratos.Parameters("""{
|
|
13
|
+
"type" : "location_agnostic_design_points",
|
|
14
|
+
"number_of_design_points" : 1
|
|
15
|
+
}""")
|
|
16
|
+
parameters.ValidateAndAssignDefaults(default_settings)
|
|
17
|
+
self.model_part = model_part
|
|
18
|
+
|
|
19
|
+
self.number_of_nodes = parameters["number_of_design_points"].GetInt()
|
|
20
|
+
|
|
21
|
+
def Execute(self):
|
|
22
|
+
for i in range(self.number_of_nodes):
|
|
23
|
+
node: Kratos.Node = self.model_part.CreateNewNode(i + 1, i + 1, 0, 0)
|
|
24
|
+
node.SetValue(KratosOA.CUSTOM_DESIGN_VARIABLE, 0.0)
|
|
25
|
+
|
|
26
|
+
class CSVBasedDesignPoints:
|
|
27
|
+
def __init__(self, model_part: Kratos.ModelPart, parameters: Kratos.Parameters):
|
|
28
|
+
default_settings = Kratos.Parameters("""{
|
|
29
|
+
"type" : "csv_based_design_points",
|
|
30
|
+
"csv_file_name" : "",
|
|
31
|
+
"initialize_values_with_csv_data" : false,
|
|
32
|
+
"value_column_header" : "",
|
|
33
|
+
"location_column_headers" : [""]
|
|
34
|
+
}""")
|
|
35
|
+
parameters.ValidateAndAssignDefaults(default_settings)
|
|
36
|
+
self.model_part = model_part
|
|
37
|
+
|
|
38
|
+
self.csv_file_name = parameters["csv_file_name"].GetString()
|
|
39
|
+
self.location_column_headers = parameters["location_column_headers"].GetStringArray()
|
|
40
|
+
|
|
41
|
+
self.initialize_values_with_csv_data = parameters["initialize_values_with_csv_data"].GetBool()
|
|
42
|
+
self.value_column_header = parameters["value_column_header"].GetString()
|
|
43
|
+
|
|
44
|
+
if len(self.location_column_headers) > 3:
|
|
45
|
+
raise RuntimeError("Number of location column headers cannot exceed 3.")
|
|
46
|
+
|
|
47
|
+
def Execute(self):
|
|
48
|
+
with open(self.csv_file_name, "r") as file_input:
|
|
49
|
+
lines = file_input.readlines()
|
|
50
|
+
|
|
51
|
+
if len(lines) == 0:
|
|
52
|
+
raise RuntimeError(f"The provided csv file = \"{self.csv_file_name}\" is empty.")
|
|
53
|
+
|
|
54
|
+
headers = lines[0].split(",")
|
|
55
|
+
location_column_indices = [-1, -1, -1, -1]
|
|
56
|
+
|
|
57
|
+
for j, location_header in enumerate(self.location_column_headers):
|
|
58
|
+
for i, header in enumerate(headers):
|
|
59
|
+
if header.strip() == location_header:
|
|
60
|
+
location_column_indices[j] = i
|
|
61
|
+
break
|
|
62
|
+
|
|
63
|
+
if self.initialize_values_with_csv_data:
|
|
64
|
+
for i, header in enumerate(headers):
|
|
65
|
+
if header.strip() == self.value_column_header:
|
|
66
|
+
location_column_indices[3] = i
|
|
67
|
+
break
|
|
68
|
+
|
|
69
|
+
for i, line in enumerate(lines[1:]):
|
|
70
|
+
data = [float(v.strip()) for v in line[:-1].split(',')]
|
|
71
|
+
location = [
|
|
72
|
+
data[location_column_indices[0]] if location_column_indices[0] != -1 else 0.0,
|
|
73
|
+
data[location_column_indices[1]] if location_column_indices[1] != -1 else 0.0,
|
|
74
|
+
data[location_column_indices[2]] if location_column_indices[2] != -1 else 0.0
|
|
75
|
+
]
|
|
76
|
+
node: Kratos.Node = self.model_part.CreateNewNode(i + 1, location[0], location[1], location[2])
|
|
77
|
+
node.SetValue(KratosOA.CUSTOM_DESIGN_VARIABLE, data[location_column_indices[3]] if location_column_indices[3] != -1 else 0.0)
|
|
78
|
+
|
|
79
|
+
class ExternalResponseFunctionModelPartController(ModelPartController):
|
|
80
|
+
def __init__(self, model: Kratos.Model, parameters: Kratos.Parameters):
|
|
81
|
+
default_settings = Kratos.Parameters("""{
|
|
82
|
+
"model_part_name" : "",
|
|
83
|
+
"design_point_settings" : {}
|
|
84
|
+
}""")
|
|
85
|
+
|
|
86
|
+
parameters.ValidateAndAssignDefaults(default_settings)
|
|
87
|
+
|
|
88
|
+
model_part_name = parameters["model_part_name"].GetString()
|
|
89
|
+
if model_part_name == "":
|
|
90
|
+
raise RuntimeError("Empty \"model_part_name\" is not allowed which is given with following parameters:\n" + str(parameters))
|
|
91
|
+
|
|
92
|
+
self.model_part = model.CreateModelPart(model_part_name)
|
|
93
|
+
|
|
94
|
+
design_point_settings = parameters["design_point_settings"]
|
|
95
|
+
if not design_point_settings.Has("type"):
|
|
96
|
+
raise RuntimeError(f"No design point creation method was specified. \n{design_point_settings}")
|
|
97
|
+
|
|
98
|
+
design_point_type = design_point_settings["type"].GetString()
|
|
99
|
+
if design_point_type == "location_agnostic_design_points":
|
|
100
|
+
self.design_point_creation_method = LocationAgnosticDesignPoints(self.model_part, design_point_settings)
|
|
101
|
+
elif design_point_type == "csv_based_design_points":
|
|
102
|
+
self.design_point_creation_method = CSVBasedDesignPoints(self.model_part, design_point_settings)
|
|
103
|
+
else:
|
|
104
|
+
raise RuntimeError(f"Unsupported design point creation method type = \"{design_point_type}\". Followings are supported:\n\tlocation_agnostic_design_points\n\tcsv_based_design_points")
|
|
105
|
+
|
|
106
|
+
def ImportModelPart(self) -> None:
|
|
107
|
+
self.design_point_creation_method.Execute()
|
|
108
|
+
|
|
109
|
+
def GetModelPart(self) -> Kratos.ModelPart:
|
|
110
|
+
return self.model_part
|
KratosMultiphysics/OptimizationApplication/model_part_controllers/mdpa_model_part_controller.py
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import KratosMultiphysics as Kratos
|
|
2
|
+
from KratosMultiphysics.OptimizationApplication.model_part_controllers.model_part_controller import ModelPartController
|
|
3
|
+
|
|
4
|
+
def Factory(model: Kratos.Model, parameters: Kratos.Parameters, _) -> ModelPartController:
|
|
5
|
+
if not parameters.Has("settings"):
|
|
6
|
+
raise RuntimeError(f"MdpaModelPartController instantiation requires a \"settings\" in parameters [ parameters = {parameters}].")
|
|
7
|
+
return MdpaModelPartController(model, parameters["settings"])
|
|
8
|
+
|
|
9
|
+
class MdpaModelPartController(ModelPartController):
|
|
10
|
+
def __init__(self, model: Kratos.Model, parameters: Kratos.Parameters):
|
|
11
|
+
default_settings = Kratos.Parameters("""{
|
|
12
|
+
"model_part_name": "",
|
|
13
|
+
"input_filename" : "",
|
|
14
|
+
"domain_size" : -1,
|
|
15
|
+
"read_data" : false
|
|
16
|
+
}""")
|
|
17
|
+
|
|
18
|
+
parameters.ValidateAndAssignDefaults(default_settings)
|
|
19
|
+
|
|
20
|
+
model_part_name = parameters["model_part_name"].GetString()
|
|
21
|
+
if model_part_name == "":
|
|
22
|
+
raise RuntimeError("Empty \"model_part_name\" is not allowed which is given with following parameters:\n" + str(parameters))
|
|
23
|
+
|
|
24
|
+
self.input_filename = parameters["input_filename"].GetString()
|
|
25
|
+
if self.input_filename == "":
|
|
26
|
+
raise RuntimeError("Empty \"input_filename\" is not allowed which is given with following parameters:\n" + str(parameters))
|
|
27
|
+
|
|
28
|
+
self.domain_size = parameters["domain_size"].GetInt()
|
|
29
|
+
if self.domain_size not in [1, 2, 3]:
|
|
30
|
+
raise RuntimeError("\"domain_size\" should be either 1, 2 or 3." + str(parameters))
|
|
31
|
+
|
|
32
|
+
self.model_part = model.CreateModelPart(model_part_name)
|
|
33
|
+
self.read_data = parameters["read_data"].GetBool()
|
|
34
|
+
|
|
35
|
+
def ImportModelPart(self) -> None:
|
|
36
|
+
if self.read_data:
|
|
37
|
+
Kratos.ModelPartIO(self.input_filename, Kratos.ModelPartIO.READ).ReadModelPart(self.model_part)
|
|
38
|
+
else:
|
|
39
|
+
Kratos.ModelPartIO(self.input_filename, Kratos.ModelPartIO.READ | Kratos.ModelPartIO.MESH_ONLY).ReadModelPart(self.model_part)
|
|
40
|
+
|
|
41
|
+
self.model_part.ProcessInfo[Kratos.DOMAIN_SIZE] = self.domain_size
|
|
42
|
+
|
|
43
|
+
def GetModelPart(self) -> Kratos.ModelPart:
|
|
44
|
+
return self.model_part
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
import KratosMultiphysics as Kratos
|
|
3
|
+
|
|
4
|
+
class ModelPartController(ABC):
|
|
5
|
+
def Initialize(self) -> None:
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
def Finalize(self) -> None:
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
@abstractmethod
|
|
12
|
+
def ImportModelPart(self) -> None:
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
@abstractmethod
|
|
16
|
+
def GetModelPart(self) -> Kratos.ModelPart:
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# KratosOptimizationApplication
|
|
3
|
+
#
|
|
4
|
+
# License: BSD License
|
|
5
|
+
# license: OptimizationApplication/license.txt
|
|
6
|
+
#
|
|
7
|
+
# Main authors: Reza Najian Asl, https://github.com/RezaNajian
|
|
8
|
+
#
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
|
|
11
|
+
# importing the Kratos Library
|
|
12
|
+
import KratosMultiphysics as KM
|
|
13
|
+
from KratosMultiphysics.OptimizationApplication.model_part_controllers.mdpa_model_part_controller import MdpaModelPartController
|
|
14
|
+
|
|
15
|
+
# ==============================================================================
|
|
16
|
+
def CreateController(model_parts_settings: KM.Parameters, model: KM.Model):
|
|
17
|
+
return ModelPartsController(model_parts_settings, model)
|
|
18
|
+
|
|
19
|
+
# ==============================================================================
|
|
20
|
+
class ModelPartsController:
|
|
21
|
+
# --------------------------------------------------------------------------
|
|
22
|
+
def __init__(self, model_parts_settings: KM.Parameters, model: KM.Model):
|
|
23
|
+
|
|
24
|
+
self.model_parts_settings = model_parts_settings
|
|
25
|
+
self.model = model
|
|
26
|
+
|
|
27
|
+
self.mdpa_model_part_controllers: 'list[MdpaModelPartController]' = []
|
|
28
|
+
for params in self.model_parts_settings:
|
|
29
|
+
params["settings"].AddString("model_part_name", params["name"].GetString())
|
|
30
|
+
self.mdpa_model_part_controllers.append(MdpaModelPartController(model, params["settings"]))
|
|
31
|
+
|
|
32
|
+
# --------------------------------------------------------------------------
|
|
33
|
+
def Initialize(self) -> None:
|
|
34
|
+
for mdpa_model_part_controller in self.mdpa_model_part_controllers:
|
|
35
|
+
mdpa_model_part_controller.ImportModelPart()
|
|
36
|
+
|
|
37
|
+
# --------------------------------------------------------------------------
|
|
38
|
+
def CheckIfRootModelPartsExist(self, root_model_parts_name: 'list[str]', raise_error = True) -> bool:
|
|
39
|
+
if not isinstance(root_model_parts_name, list):
|
|
40
|
+
raise RuntimeError("ModelPartsController: CheckIfRootModelPartsExist requires list of model parts")
|
|
41
|
+
|
|
42
|
+
if_exist = True
|
|
43
|
+
for root_model_part_name in root_model_parts_name:
|
|
44
|
+
extracted_root_model_part_name = root_model_part_name.split(".")[0]
|
|
45
|
+
if not self.model.HasModelPart(extracted_root_model_part_name):
|
|
46
|
+
if raise_error:
|
|
47
|
+
raise RuntimeError("ModelPartsController: CheckIfRootModelPartsExist: Root model part {} does not exist!".format(extracted_root_model_part_name))
|
|
48
|
+
else:
|
|
49
|
+
if_exist = False
|
|
50
|
+
break
|
|
51
|
+
|
|
52
|
+
return if_exist
|
|
53
|
+
# --------------------------------------------------------------------------
|
|
54
|
+
def GetModelPart(self, model_part_name: str) -> KM.ModelPart:
|
|
55
|
+
if not model_part_name in self.model.GetModelPartNames():
|
|
56
|
+
raise RuntimeError("ModelPartsController: Try to get model part {} which does not exist.".format(model_part_name))
|
|
57
|
+
else:
|
|
58
|
+
return self.model.GetModelPart(model_part_name)
|
|
59
|
+
# --------------------------------------------------------------------------
|
|
60
|
+
def GetRootModelPart(self, root_model_part_name: str) -> KM.ModelPart:
|
|
61
|
+
extracted_root_model_part_name = root_model_part_name.split(".")[0]
|
|
62
|
+
if not self.model.HasModelPart(extracted_root_model_part_name):
|
|
63
|
+
raise RuntimeError("ModelPartsController: Try to get root model part {} which does not exist.".format(root_model_part_name))
|
|
64
|
+
else:
|
|
65
|
+
return self.model[extracted_root_model_part_name]
|
|
66
|
+
# --------------------------------------------------------------------------
|
|
67
|
+
def GetRootModelParts(self, root_model_parts_name: 'list[str]') -> 'list[KM.ModelPart]':
|
|
68
|
+
if not isinstance(root_model_parts_name, list):
|
|
69
|
+
raise RuntimeError("ModelPartsController: GetRootModelParts requires list of model parts name")
|
|
70
|
+
|
|
71
|
+
list_root_model_parts = []
|
|
72
|
+
for root_model_part_name in root_model_parts_name:
|
|
73
|
+
extracted_root_model_part_name = root_model_part_name.split(".")[0]
|
|
74
|
+
if not self.model.HasModelPart(extracted_root_model_part_name):
|
|
75
|
+
raise RuntimeError("ModelPartsController: GetRootModelParts: Root model part {} does not exist!".format(extracted_root_model_part_name))
|
|
76
|
+
else:
|
|
77
|
+
list_root_model_parts.append(self.model[extracted_root_model_part_name])
|
|
78
|
+
|
|
79
|
+
return list_root_model_parts
|
|
80
|
+
|
|
81
|
+
# --------------------------------------------------------------------------
|
|
82
|
+
def UpdateTimeStep(self, step: int) -> None:
|
|
83
|
+
for mdpa_odel_part_controller in self.mdpa_model_part_controllers:
|
|
84
|
+
mdpa_odel_part_controller.GetModelPart().CloneTimeStep(step)
|
|
85
|
+
mdpa_odel_part_controller.GetModelPart().ProcessInfo.SetValue(KM.STEP, step)
|
|
86
|
+
# --------------------------------------------------------------------------
|
|
87
|
+
def SetMinimalBufferSize(self, buffer_size: int) -> None:
|
|
88
|
+
for mdpa_odel_part_controller in self.mdpa_model_part_controllers:
|
|
89
|
+
if mdpa_odel_part_controller.GetModelPart().GetBufferSize() < buffer_size:
|
|
90
|
+
mdpa_odel_part_controller.GetModelPart().SetBufferSize(buffer_size)
|
|
91
|
+
|
|
92
|
+
# ==============================================================================
|