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