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,335 @@
1
+ # importing the Kratos Library
2
+ from numpy import gradient
3
+ from . import base_response
4
+ import KratosMultiphysics as KM
5
+ from KratosMultiphysics import Parameters, Logger
6
+ import KratosMultiphysics.OptimizationApplication as KOA
7
+ from KratosMultiphysics.OptimizationApplication.responses.base_response import BaseResponseFunction
8
+ import KratosMultiphysics.StructuralMechanicsApplication as KSM
9
+
10
+ import time as timer
11
+ import numpy as np
12
+
13
+ # ==============================================================================
14
+ class StressResponseFunction(BaseResponseFunction):
15
+ """Stress response function. It triggers the primal analysis and
16
+ uses the primal analysis results to calculate response value and gradient.
17
+
18
+ Attributes
19
+ ----------
20
+
21
+ """
22
+
23
+ def __init__(self,response_name, response_settings,response_analysis,model):
24
+
25
+ self.type = "stress"
26
+ self.variable = "STRESS"
27
+ super().__init__(response_name, response_settings, model, response_analysis)
28
+
29
+ if not self.response_settings.Has("gradient_settings"):
30
+ self.gradient_settings = KM.Parameters()
31
+ self.gradient_settings.AddString("gradient_mode","semi_analytic")
32
+ self.gradient_settings.AddDouble("step_size",1e-6)
33
+ else:
34
+ self.gradient_settings = self.response_settings["gradient_settings"]
35
+
36
+ self.supported_control_types = ["shape","material"]
37
+ self.gradients_variables = {"shape":"D_STRESS_D_X","material":"D_STRESS_D_FD"}
38
+
39
+ if len(self.evaluated_model_parts) != 1:
40
+ raise RuntimeError("StressResponseFunction: 'evaluated_objects' of response '{}' must have only one entry !".format(self.name))
41
+
42
+ for control_type in self.control_types:
43
+ if not control_type in self.supported_control_types:
44
+ raise RuntimeError("StressResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
45
+
46
+ # add vars
47
+ for control_type in self.control_types:
48
+ self.analysis_model_part.AddNodalSolutionStepVariable(KSM.ADJOINT_DISPLACEMENT)
49
+ self.analysis_model_part.AddNodalSolutionStepVariable(KOA.ADJOINT_RHS)
50
+ if control_type == "shape":
51
+ self.response_settings["gradient_settings"].AddString("shape_gradient_field_name",self.gradients_variables[control_type])
52
+ self.analysis_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
53
+ if control_type == "material":
54
+ self.response_settings["gradient_settings"].AddString("material_gradient_field_name",self.gradients_variables[control_type])
55
+ self.analysis_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
56
+
57
+ ## Construct the linear solver
58
+ import KratosMultiphysics.python_linear_solver_factory as python_linear_solver_factory
59
+ self.adj_solver_settings = KM.Parameters("""{
60
+ "solver_type" : "amgcl",
61
+ "smoother_type":"ilu0",
62
+ "krylov_type": "gmres",
63
+ "coarsening_type": "aggregation",
64
+ "max_iteration": 200,
65
+ "provide_coordinates": false,
66
+ "gmres_krylov_space_dimension": 100,
67
+ "verbosity" : 0,
68
+ "tolerance": 1e-7,
69
+ "scaling": false,
70
+ "block_size": 1,
71
+ "use_block_matrices_if_possible" : true,
72
+ "coarse_enough" : 5000
73
+ }""")
74
+ self.linear_solvers = []
75
+ root_model_parts = []
76
+ for model_part_name in self.evaluated_model_parts:
77
+ extracted_root_model_part_name = model_part_name.split(".")[0]
78
+ if not extracted_root_model_part_name in root_model_parts:
79
+ root_model_parts.append(extracted_root_model_part_name)
80
+ self.linear_solvers.append(python_linear_solver_factory.ConstructSolver(self.adj_solver_settings))
81
+
82
+ # create response
83
+ self.response_function = KOA.StressOptResponse(response_name,model,self.response_settings,self.linear_solvers)
84
+
85
+ def GetVariableName(self):
86
+ return self.variable
87
+
88
+ def GetGradientsVariablesName(self):
89
+ return self.gradients_variables
90
+
91
+ def GetGradientVariableNameForType(self,control_type, raise_error=True):
92
+ if raise_error:
93
+ if not control_type in self.supported_control_types:
94
+ raise RuntimeError("StressResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
95
+
96
+ return self.gradients_variables[control_type]
97
+
98
+ def Initialize(self):
99
+ super().Initialize()
100
+ self.response_function.Initialize()
101
+
102
+ def CalculateValue(self):
103
+ Logger.PrintInfo("StressResponseFunction:CalculateValue: Starting value calculation for response ", self.name)
104
+ startTime = timer.time()
105
+ self.value = self.response_function.CalculateValue()
106
+ Logger.PrintInfo("StressResponseFunction:CalculateValue: Time needed for calculating value ",round(timer.time() - startTime,2),"s")
107
+ return self.value
108
+
109
+ def GetValue(self):
110
+ self.value = self.response_function.CalculateValue()
111
+ return self.value
112
+
113
+ def CalculateGradients(self):
114
+ Logger.PrintInfo("StressResponseFunction", "Starting gradient calculation for response ", self.name)
115
+ startTime = timer.time()
116
+ self.response_function.CalculateGradient()
117
+ Logger.PrintInfo("StressResponseFunction", "Time needed for calculating gradients ",round(timer.time() - startTime,2),"s")
118
+
119
+ def CalculateGradientsForTypesAndObjects(self,control_types,controlled_objects,raise_error=True):
120
+
121
+ if raise_error:
122
+ for itr in range(len(controlled_objects)):
123
+ controlled_object = controlled_objects[itr]
124
+ control_type = control_types[itr]
125
+ found = False
126
+ for itr_2 in range(len(self.controlled_model_parts)):
127
+ controlled_model_part = self.controlled_model_parts[itr_2]
128
+ controlled_type = self.control_types[itr_2]
129
+ if controlled_type==control_type and controlled_model_part==controlled_object:
130
+ found = True
131
+ break
132
+ if not found:
133
+ raise RuntimeError("StressResponseFunction:CalculateGradientsForTypesAndObjects: control type {} of control object {} is not in the control_types of response {}".format(control_types[itr],controlled_object,self.name))
134
+
135
+ Logger.PrintInfo("StressResponseFunction", "Starting ", control_types," gradients calculation of response ", self.name," for ",controlled_objects)
136
+ startTime = timer.time()
137
+ self.response_function.CalculateGradient()
138
+ Logger.PrintInfo("StressResponseFunction", "Time needed for calculating gradients ",round(timer.time() - startTime,2),"s")
139
+
140
+ # ==============================================================================
141
+ class StrainEnergyResponseFunction(BaseResponseFunction):
142
+ """Linear strain energy response function. It triggers the primal analysis and
143
+ uses the primal analysis results to calculate response value and gradient.
144
+
145
+ Attributes
146
+ ----------
147
+ primal_model_part : Model part of the primal analysis object
148
+ primal_analysis : Primal analysis object of the response function
149
+ response_function: Cpp utilities object doing the actual computation of response value and gradient.
150
+ """
151
+
152
+ def __init__(self,response_name, response_settings,response_analysis,model):
153
+
154
+ self.type = "strain_energy"
155
+ super().__init__(response_name, response_settings, model, response_analysis)
156
+
157
+ if not self.response_settings.Has("gradient_settings"):
158
+ self.gradient_settings = KM.Parameters()
159
+ self.gradient_settings.AddString("gradient_mode","semi_analytic")
160
+ self.gradient_settings.AddDouble("step_size",1e-6)
161
+ else:
162
+ self.gradient_settings = self.response_settings["gradient_settings"]
163
+
164
+ if not self.analysis_model_part.HasNodalSolutionStepVariable(KM.KratosGlobals.GetVariable("D_STRAIN_ENERGY_1_D_X")):
165
+ self.variable = "STRAIN_ENERGY_1"
166
+ elif not self.analysis_model_part.HasNodalSolutionStepVariable(KM.KratosGlobals.GetVariable("D_STRAIN_ENERGY_2_D_X")):
167
+ self.variable = "STRAIN_ENERGY_2"
168
+ elif not self.analysis_model_part.HasNodalSolutionStepVariable(KM.KratosGlobals.GetVariable("D_STRAIN_ENERGY_3_D_X")):
169
+ self.variable = "STRAIN_ENERGY_3"
170
+
171
+ self.supported_control_types = ["shape","thickness","material"]
172
+ self.gradients_variables = {"shape":"D_"+self.variable+"_D_X","thickness":"D_"+self.variable+"_D_FT","material":"D_"+self.variable+"_D_FD"}
173
+
174
+ if len(self.evaluated_model_parts) != 1:
175
+ raise RuntimeError("StrainEnergyResponseFunction: 'evaluated_objects' of response '{}' must have only one entry !".format(self.name))
176
+
177
+ for control_type in self.control_types:
178
+ if not control_type in self.supported_control_types:
179
+ raise RuntimeError("StrainEnergyResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
180
+
181
+ # add vars
182
+ for control_type in self.control_types:
183
+ if control_type == "shape":
184
+ self.response_settings["gradient_settings"].AddString("shape_gradient_field_name",self.gradients_variables[control_type])
185
+ self.analysis_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
186
+ if control_type == "thickness":
187
+ self.response_settings["gradient_settings"].AddString("thickness_gradient_field_name",self.gradients_variables[control_type])
188
+ self.analysis_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
189
+ if control_type == "material":
190
+ self.response_settings["gradient_settings"].AddString("material_gradient_field_name",self.gradients_variables[control_type])
191
+ self.analysis_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
192
+
193
+ # create response
194
+ self.response_function = KOA.LinearStrainEnergyOptResponse(response_name,model,self.response_settings)
195
+
196
+ def GetVariableName(self):
197
+ return self.variable
198
+
199
+ def GetGradientsVariablesName(self):
200
+ return self.gradients_variables
201
+
202
+ def GetGradientVariableNameForType(self,control_type, raise_error=True):
203
+ if raise_error:
204
+ if not control_type in self.supported_control_types:
205
+ raise RuntimeError("StrainEnergyResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
206
+
207
+ return self.gradients_variables[control_type]
208
+
209
+ def Initialize(self):
210
+ super().Initialize()
211
+ self.response_function.Initialize()
212
+
213
+ def CalculateValue(self):
214
+ Logger.PrintInfo("StrainEnergyResponse:CalculateValue: Starting value calculation for response ", self.name)
215
+ startTime = timer.time()
216
+ self.value = self.response_function.CalculateValue()
217
+ Logger.PrintInfo("StrainEnergyResponse:CalculateValue: Time needed for calculating value ",round(timer.time() - startTime,2),"s")
218
+ return self.value
219
+
220
+ def GetValue(self):
221
+ self.value = self.response_function.CalculateValue()
222
+ return self.value
223
+
224
+ def CalculateGradients(self):
225
+ Logger.PrintInfo("StrainEnergyResponse", "Starting gradient calculation for response ", self.name)
226
+ startTime = timer.time()
227
+ self.response_function.CalculateGradient()
228
+ Logger.PrintInfo("StrainEnergyResponse", "Time needed for calculating gradients ",round(timer.time() - startTime,2),"s")
229
+
230
+ def CalculateGradientsForTypesAndObjects(self,control_types,controlled_objects,raise_error=True):
231
+
232
+ if raise_error:
233
+ for itr in range(len(controlled_objects)):
234
+ controlled_object = controlled_objects[itr]
235
+ control_type = control_types[itr]
236
+ found = False
237
+ for itr_2 in range(len(self.controlled_model_parts)):
238
+ controlled_model_part = self.controlled_model_parts[itr_2]
239
+ controlled_type = self.control_types[itr_2]
240
+ if controlled_type==control_type and controlled_model_part==controlled_object:
241
+ found = True
242
+ break
243
+ if not found:
244
+ raise RuntimeError("StrainEnergyResponseFunction:CalculateGradientsForTypesAndObjects: control type {} of control object {} is not in the control_types of response {}".format(control_types[itr],controlled_object,self.name))
245
+
246
+ Logger.PrintInfo("StrainEnergyResponse", "Starting ", control_types," gradients calculation of response ", self.name," for ",controlled_objects)
247
+ startTime = timer.time()
248
+ self.response_function.CalculateGradient()
249
+ Logger.PrintInfo("StrainEnergyResponse", "Time needed for calculating gradients ",round(timer.time() - startTime,2),"s")
250
+
251
+
252
+ class MassResponseFunction(BaseResponseFunction):
253
+
254
+ def __init__(self,response_name, response_settings,model):
255
+
256
+ self.type = "mass"
257
+ self.variable = "MASS"
258
+ super().__init__(response_name, response_settings, model)
259
+
260
+ if not self.response_settings.Has("gradient_settings"):
261
+ self.gradient_settings = KM.Parameters()
262
+ self.gradient_settings.AddString("gradient_mode","semi_analytic")
263
+ self.gradient_settings.AddDouble("step_size",1e-6)
264
+ else:
265
+ self.gradient_settings = self.response_settings["gradient_settings"]
266
+
267
+ self.supported_control_types = ["shape","thickness","material"]
268
+ self.gradients_variables = {"shape":"D_MASS_D_X","thickness":"D_MASS_D_FT","material":"D_MASS_D_FD"}
269
+
270
+ if len(self.evaluated_model_parts) != 1:
271
+ raise RuntimeError("MassResponseFunction: 'evaluated_objects' of response '{}' must have only one entry !".format(self.name))
272
+
273
+ for control_type in self.control_types:
274
+ if not control_type in self.supported_control_types:
275
+ raise RuntimeError("MassResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
276
+
277
+
278
+ root_model_part_name = self.evaluated_model_parts[0].split(".")[0]
279
+ for evaluated_model_part in self.evaluated_model_parts:
280
+ if evaluated_model_part.split(".")[0] != root_model_part_name:
281
+ raise RuntimeError("MassResponseFunction: evaluated_model_parts of mass response must have the same root model part !")
282
+
283
+ self.root_model_part = self.model.GetModelPart(root_model_part_name)
284
+
285
+ # add vars and response
286
+ self.response_function = KOA.MassOptResponse(response_name,model,self.response_settings)
287
+ for control_type in self.control_types:
288
+ self.root_model_part.AddNodalSolutionStepVariable(KM.KratosGlobals.GetVariable(self.gradients_variables[control_type]))
289
+
290
+
291
+ def GetVariableName(self):
292
+ return self.variable
293
+
294
+ def GetGradientsVariablesName(self):
295
+ return self.gradients_variables
296
+
297
+ def GetGradientVariableNameForType(self,control_type, raise_error=True):
298
+ if raise_error:
299
+ if not control_type in self.supported_control_types:
300
+ raise RuntimeError("MassResponseFunction: type {} in 'control_types' of response '{}' is not supported, supported types are {} !".format(control_type,self.name,self.supported_control_types))
301
+
302
+ return self.gradients_variables[control_type]
303
+
304
+ def Initialize(self):
305
+ super().Initialize()
306
+ self.response_function.Initialize()
307
+
308
+ def CalculateValue(self):
309
+ Logger.PrintInfo("MassResponseFunction:CalculateValue: Starting value calculation for response ", self.name)
310
+ startTime = timer.time()
311
+ self.value = self.response_function.CalculateValue()
312
+ Logger.PrintInfo("MassResponseFunction:CalculateValue: Time needed for calculating value ",round(timer.time() - startTime,2),"s")
313
+ return self.value
314
+
315
+ def CalculateGradientsForTypesAndObjects(self,control_types,controlled_objects,raise_error=True):
316
+
317
+ if raise_error:
318
+ for itr in range(len(controlled_objects)):
319
+ controlled_object = controlled_objects[itr]
320
+ control_type = control_types[itr]
321
+ found = False
322
+ for itr_2 in range(len(self.controlled_model_parts)):
323
+ controlled_model_part = self.controlled_model_parts[itr_2]
324
+ controlled_type = self.control_types[itr_2]
325
+ if controlled_type==control_type and controlled_model_part==controlled_object:
326
+ found = True
327
+ break
328
+ if not found:
329
+ raise RuntimeError("MassResponseFunction:CalculateGradientsForTypesAndObjects: control type {} of control object {} is not in the control_types of response {}".format(control_types[itr],controlled_object,self.name))
330
+
331
+ Logger.PrintInfo("MassResponseFunction", "Starting ", control_types," gradients calculation of response ", self.name," for ",controlled_objects)
332
+ startTime = timer.time()
333
+ self.response_function.CalculateGradient()
334
+ Logger.PrintInfo("MassResponseFunction", "Time needed for calculating gradients ",round(timer.time() - startTime,2),"s")
335
+