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,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
|
+
|