KratosSystemIdentificationApplication 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/KratosSystemIdentificationApplication.so +0 -0
- KratosMultiphysics/.libs/libKratosSystemIdentificationCore.dylib +0 -0
- KratosMultiphysics/SystemIdentificationApplication/__init__.py +13 -0
- KratosMultiphysics/SystemIdentificationApplication/controls/data_values_control.py +210 -0
- KratosMultiphysics/SystemIdentificationApplication/controls/material_properties_control.py +212 -0
- KratosMultiphysics/SystemIdentificationApplication/convergence_criteria/sensor_error.py +93 -0
- KratosMultiphysics/SystemIdentificationApplication/processes/sensor_output_process.py +83 -0
- KratosMultiphysics/SystemIdentificationApplication/python_registry_lists.py +9 -0
- KratosMultiphysics/SystemIdentificationApplication/responses/damage_detection_response.py +190 -0
- KratosMultiphysics/SystemIdentificationApplication/responses/pressure_detection_response.py +20 -0
- KratosMultiphysics/SystemIdentificationApplication/responses/temperature_detection_response.py +20 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_generator_analysis.py +130 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_io/sensor_model_part_controller.py +58 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/response_sensitivity_analysis.py +41 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/response_sensitivity_interface.py +34 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/sensor_sensitivity_adjoint_static_solver.py +50 -0
- KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/system_identification_static_analysis.py +52 -0
- KratosMultiphysics/SystemIdentificationApplication/utilities/data_utils.py +67 -0
- KratosMultiphysics/SystemIdentificationApplication/utilities/sensor_utils.py +196 -0
- KratosMultiphysics/SystemIdentificationApplication/utilities/tensor_adaptor_utils.py +63 -0
- kratossystemidentificationapplication-10.4.4.dist-info/METADATA +11 -0
- kratossystemidentificationapplication-10.4.4.dist-info/RECORD +27 -0
- kratossystemidentificationapplication-10.4.4.dist-info/WHEEL +6 -0
- kratossystemidentificationapplication.dylibs/libKratosCore.dylib +4 -0
- kratossystemidentificationapplication.dylibs/libgcc_s.1.1.dylib +0 -0
- kratossystemidentificationapplication.dylibs/libgomp.1.dylib +0 -0
- kratossystemidentificationapplication.dylibs/libstdc++.6.dylib +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
import KratosMultiphysics as Kratos
|
|
4
|
+
import KratosMultiphysics.SystemIdentificationApplication as KratosSI
|
|
5
|
+
|
|
6
|
+
SupportedVariableUnionType = typing.Union[
|
|
7
|
+
Kratos.BoolVariable,
|
|
8
|
+
Kratos.IntegerVariable,
|
|
9
|
+
Kratos.DoubleVariable,
|
|
10
|
+
Kratos.StringVariable,
|
|
11
|
+
Kratos.Array1DVariable3,
|
|
12
|
+
Kratos.Array1DVariable4,
|
|
13
|
+
Kratos.Array1DVariable6,
|
|
14
|
+
Kratos.Array1DVariable9,
|
|
15
|
+
Kratos.VectorVariable
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
SupportedValueUnionType = typing.Union[
|
|
19
|
+
bool,
|
|
20
|
+
int,
|
|
21
|
+
float,
|
|
22
|
+
str,
|
|
23
|
+
Kratos.Array3,
|
|
24
|
+
Kratos.Array4,
|
|
25
|
+
Kratos.Array6,
|
|
26
|
+
Kratos.Array9,
|
|
27
|
+
Kratos.Vector
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def GetNameToCSVString(name: str, kratos_value: SupportedValueUnionType) -> str:
|
|
32
|
+
if type(kratos_value) in [bool, int, float, str]:
|
|
33
|
+
return name
|
|
34
|
+
elif type(kratos_value) in [Kratos.Array3, Kratos.Array4, Kratos.Array6, Kratos.Array9, Kratos.Vector]:
|
|
35
|
+
return ",".join([f"{name}_{i}" for i in range(kratos_value.Size())])
|
|
36
|
+
else:
|
|
37
|
+
raise RuntimeError(f"Unsupported kratos_value type = {type(kratos_value)} with name = {name} and kratos_value = {kratos_value}.")
|
|
38
|
+
|
|
39
|
+
def GetKratosValueToPythonValueConverter(kratos_value: SupportedValueUnionType) -> 'typing.Callable[[SupportedValueUnionType], typing.Union[bool, int, float, str, list[float]]]':
|
|
40
|
+
if type(kratos_value) in [bool, int, float, str]:
|
|
41
|
+
return lambda x: x
|
|
42
|
+
elif type(kratos_value) in [Kratos.Array3, Kratos.Array4, Kratos.Array6, Kratos.Array9, Kratos.Vector]:
|
|
43
|
+
return lambda x: [v for v in x]
|
|
44
|
+
else:
|
|
45
|
+
raise RuntimeError(f"Unsupported kratos_value type = {type(kratos_value)} with kratos_value = {kratos_value}.")
|
|
46
|
+
|
|
47
|
+
def GetKratosValueToCSVStringConverter(kratos_value: SupportedValueUnionType) -> 'typing.Callable[[SupportedValueUnionType], str]':
|
|
48
|
+
if type(kratos_value) in [bool, int, float, str]:
|
|
49
|
+
return lambda x: str(x)
|
|
50
|
+
elif type(kratos_value) in [Kratos.Array3, Kratos.Array4, Kratos.Array6, Kratos.Array9, Kratos.Vector]:
|
|
51
|
+
return lambda x: ",".join([str(v) for v in x])
|
|
52
|
+
else:
|
|
53
|
+
raise RuntimeError(f"Unsupported kratos_value type = {type(kratos_value)} with kratos_value = {kratos_value}.")
|
|
54
|
+
|
|
55
|
+
def GetParameterToKratosValuesConverter(params: Kratos.Parameters) -> 'typing.Callable[[Kratos.Parameters], SupportedValueUnionType]':
|
|
56
|
+
if params.IsVector():
|
|
57
|
+
return lambda x: x.GetVector()
|
|
58
|
+
elif params.IsBool():
|
|
59
|
+
return lambda x: x.GetBool()
|
|
60
|
+
elif params.IsInt():
|
|
61
|
+
return lambda x: x.GetInt()
|
|
62
|
+
elif params.IsDouble():
|
|
63
|
+
return lambda x: x.GetDouble()
|
|
64
|
+
elif params.IsString():
|
|
65
|
+
return lambda x: x.GetString()
|
|
66
|
+
else:
|
|
67
|
+
raise RuntimeError(f"Unsupported parameters type = {params}.")
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import math, numpy
|
|
4
|
+
|
|
5
|
+
import KratosMultiphysics as Kratos
|
|
6
|
+
import KratosMultiphysics.OptimizationApplication as KratosOA
|
|
7
|
+
import KratosMultiphysics.SystemIdentificationApplication as KratosSI
|
|
8
|
+
from KratosMultiphysics.SystemIdentificationApplication.utilities.data_utils import SupportedValueUnionType
|
|
9
|
+
from KratosMultiphysics.SystemIdentificationApplication.utilities.data_utils import SupportedVariableUnionType
|
|
10
|
+
from KratosMultiphysics.SystemIdentificationApplication.utilities.data_utils import GetParameterToKratosValuesConverter
|
|
11
|
+
from KratosMultiphysics.SystemIdentificationApplication.utilities.data_utils import GetKratosValueToCSVStringConverter
|
|
12
|
+
from KratosMultiphysics.SystemIdentificationApplication.utilities.data_utils import GetNameToCSVString
|
|
13
|
+
from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView
|
|
14
|
+
|
|
15
|
+
def CreateSensors(sensor_model_part: Kratos.ModelPart, domain_model_part: Kratos.ModelPart, list_of_parameters: 'list[Kratos.Parameters]') -> 'list[KratosSI.Sensors.Sensor]':
|
|
16
|
+
"""Create list of sensors from given parameters.
|
|
17
|
+
|
|
18
|
+
This creates a list of sensors from given list of parameters. Each parameter
|
|
19
|
+
corresponds to one settings set for one sensor.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
sensor_model_part (Kratos.ModelPart): Model part to which the sensors will be stored.
|
|
23
|
+
domain_model_part (Kratos.ModelPart): Model part on which the sensors will be located.
|
|
24
|
+
list_of_parameters (list[Kratos.Parameters]): List of parameters.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
list[KratosSI.Sensors.Sensor]: List of sensors generated.
|
|
28
|
+
"""
|
|
29
|
+
if sensor_model_part.NumberOfNodes() != 0:
|
|
30
|
+
raise RuntimeError(f"The sensor model part \"{sensor_model_part.FullName()}\" is not empty.")
|
|
31
|
+
|
|
32
|
+
dict_of_sensor_types: 'dict[str, typing.Type[KratosSI.Sensors.Sensor]]' = {}
|
|
33
|
+
for sensor_type_name in dir(KratosSI.Sensors):
|
|
34
|
+
sensor_type = getattr(KratosSI.Sensors, sensor_type_name)
|
|
35
|
+
try:
|
|
36
|
+
if issubclass(sensor_type, KratosSI.Sensors.Sensor) and hasattr(sensor_type, "Create"):
|
|
37
|
+
dict_of_sensor_types[Kratos.StringUtilities.ConvertCamelCaseToSnakeCase(sensor_type_name)] = sensor_type
|
|
38
|
+
except:
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
list_of_sensors: 'list[KratosSI.Sensors.Sensor]' = []
|
|
42
|
+
for parameters in list_of_parameters:
|
|
43
|
+
if not parameters.Has("type"):
|
|
44
|
+
raise RuntimeError(f"The sensor parameters does not contain \"type\".")
|
|
45
|
+
sensor_type_name = parameters["type"].GetString()
|
|
46
|
+
|
|
47
|
+
if not sensor_type_name in dict_of_sensor_types.keys():
|
|
48
|
+
raise RuntimeError(f"Unsupported sensor type = \"{sensor_type_name}\" requested. Followings are supported:\n\t" + "\n\t".join(dict_of_sensor_types.keys()))
|
|
49
|
+
|
|
50
|
+
sensor: KratosSI.Sensors.Sensor = dict_of_sensor_types[sensor_type_name].Create(domain_model_part, sensor_model_part, len(list_of_sensors) + 1, parameters)
|
|
51
|
+
list_of_sensors.append(sensor)
|
|
52
|
+
|
|
53
|
+
return list_of_sensors
|
|
54
|
+
|
|
55
|
+
def PrintSensorListToCSV(output_file_name: Path, list_of_sensors: 'list[KratosSI.Sensors.Sensor]', list_of_sensor_properties: 'list[str]') -> None:
|
|
56
|
+
"""Writes data in the list_of_sensors to CSV file.
|
|
57
|
+
|
|
58
|
+
This method writes data from all the list_of_sensors to the CSV file. The columns of the
|
|
59
|
+
CSV is determined by list_of_sensor_properties.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
output_file_name (Path): CSV file name (including the .csv extension).
|
|
63
|
+
list_of_sensors (list[Sensor]): List of sensors.
|
|
64
|
+
list_of_sensor_properties (list[str]): List of columns to write.
|
|
65
|
+
"""
|
|
66
|
+
number_of_sensor_views = len(list_of_sensors)
|
|
67
|
+
|
|
68
|
+
# do nothing if number of clusters is zero
|
|
69
|
+
if number_of_sensor_views == 0:
|
|
70
|
+
return
|
|
71
|
+
|
|
72
|
+
# create output path
|
|
73
|
+
output_file_name.parent.mkdir(exist_ok=True, parents=True)
|
|
74
|
+
|
|
75
|
+
with open(str(output_file_name), "w") as file_output:
|
|
76
|
+
# print the headers
|
|
77
|
+
first_sensor = list_of_sensors[0]
|
|
78
|
+
|
|
79
|
+
# write the csv id
|
|
80
|
+
file_output.write("index")
|
|
81
|
+
|
|
82
|
+
# store converters to CSV in dicts
|
|
83
|
+
params_value_dict: 'dict[str, typing.Callable[[Kratos.Parameters], str]]' = {}
|
|
84
|
+
params_str_dict: 'dict[str, typing.Callable[[SupportedValueUnionType], str]]' = {}
|
|
85
|
+
data_value_dict: 'dict[SupportedVariableUnionType, typing.Callable[[SupportedValueUnionType], str]]' = {}
|
|
86
|
+
|
|
87
|
+
dummy_params = first_sensor.GetSensorParameters()
|
|
88
|
+
list_of_params_keys: 'list[str]' = []
|
|
89
|
+
list_of_data_keys: 'list[SupportedVariableUnionType]' = []
|
|
90
|
+
param_property_headers = ""
|
|
91
|
+
value_property_headers = ""
|
|
92
|
+
for sensor_property in list_of_sensor_properties:
|
|
93
|
+
if dummy_params.Has(sensor_property):
|
|
94
|
+
list_of_params_keys.append(sensor_property)
|
|
95
|
+
value_func = GetParameterToKratosValuesConverter(dummy_params[sensor_property])
|
|
96
|
+
value = value_func(dummy_params[sensor_property])
|
|
97
|
+
params_value_dict[sensor_property] = value_func
|
|
98
|
+
params_str_dict[sensor_property] = GetKratosValueToCSVStringConverter(value)
|
|
99
|
+
param_property_headers += f",{GetNameToCSVString(sensor_property, value)}"
|
|
100
|
+
else:
|
|
101
|
+
var = Kratos.KratosGlobals.GetVariable(sensor_property)
|
|
102
|
+
if first_sensor.Has(var):
|
|
103
|
+
list_of_data_keys.append(var)
|
|
104
|
+
value = first_sensor.GetValue(var)
|
|
105
|
+
data_value_dict[var] = GetKratosValueToCSVStringConverter(value)
|
|
106
|
+
value_property_headers += f",{GetNameToCSVString(sensor_property, value)}"
|
|
107
|
+
else:
|
|
108
|
+
raise RuntimeError(f"Sensor property = \"{sensor_property}\" not found in either sensor parameters nor in data value container. [ Sensor = {first_sensor} ].")
|
|
109
|
+
|
|
110
|
+
file_output.write(f"{param_property_headers}{value_property_headers}\n")
|
|
111
|
+
|
|
112
|
+
for i, sensor in enumerate(list_of_sensors):
|
|
113
|
+
# write the id
|
|
114
|
+
file_output.write(f"{i+1}")
|
|
115
|
+
|
|
116
|
+
# first write the values from sensor params
|
|
117
|
+
sensor_params = sensor.GetSensorParameters()
|
|
118
|
+
for sensor_property in list_of_params_keys:
|
|
119
|
+
file_output.write(f",{params_str_dict[sensor_property](params_value_dict[sensor_property](sensor_params[sensor_property]))}")
|
|
120
|
+
|
|
121
|
+
# now write the data values from sensor
|
|
122
|
+
for var in list_of_data_keys:
|
|
123
|
+
file_output.write(f",{data_value_dict[var](sensor.GetValue(var))}")
|
|
124
|
+
|
|
125
|
+
file_output.write("\n")
|
|
126
|
+
|
|
127
|
+
def AddSensorVariableData(sensor: KratosSI.Sensors.Sensor, variable_data: Kratos.Parameters) -> None:
|
|
128
|
+
"""Adds sensor variable data.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
sensor (KratosSI.Sensors.Sensor): Sensor to add data.
|
|
132
|
+
variable_data (Kratos.Parameters): Parameters containing variable data.
|
|
133
|
+
"""
|
|
134
|
+
for var_name, var_value in variable_data.items():
|
|
135
|
+
var = Kratos.KratosGlobals.GetVariable(var_name)
|
|
136
|
+
value_func = GetParameterToKratosValuesConverter(var_value)
|
|
137
|
+
sensor.GetNode().SetValue(var, value_func(var_value))
|
|
138
|
+
|
|
139
|
+
def SetSensors(sensor_group_data: ComponentDataView, list_of_sensors: 'list[KratosSI.Sensors.Sensor]') -> None:
|
|
140
|
+
for sensor in list_of_sensors:
|
|
141
|
+
sensor_group_data.GetUnBufferedData().SetValue(f"list_of_sensors/{sensor.GetName()}/sensor", sensor)
|
|
142
|
+
|
|
143
|
+
def GetSensors(sensor_group_data: ComponentDataView) -> 'list[KratosSI.Sensors.Sensor]':
|
|
144
|
+
list_of_sensors: 'list[KratosSI.Sensors.Sensor]' = []
|
|
145
|
+
for _, sensor_data in sensor_group_data.GetUnBufferedData().GetValue("list_of_sensors").GetSubItems().items():
|
|
146
|
+
list_of_sensors.append(sensor_data.GetValue("sensor"))
|
|
147
|
+
return list_of_sensors
|
|
148
|
+
|
|
149
|
+
def GetMaskStatusControllers(sensor_group_data: ComponentDataView, sensor_mask_name: str) -> 'list[typing.Any]':
|
|
150
|
+
if sensor_group_data.GetUnBufferedData().HasValue(f"mask_status_controllers/{sensor_mask_name}"):
|
|
151
|
+
return sensor_group_data.GetUnBufferedData().GetValue(f"mask_status_controllers/{sensor_mask_name}")
|
|
152
|
+
else:
|
|
153
|
+
return []
|
|
154
|
+
|
|
155
|
+
def AddMaskStatusController(sensor_group_data: ComponentDataView, sensor_mask_name: str, mask_status_controller: typing.Any) -> None:
|
|
156
|
+
if not hasattr(mask_status_controller, "Update"):
|
|
157
|
+
raise RuntimeError(f"The mask status controller {mask_status_controller} does not have an Update method.")
|
|
158
|
+
|
|
159
|
+
if not sensor_group_data.GetUnBufferedData().HasValue(f"mask_status_controllers/{sensor_mask_name}"):
|
|
160
|
+
sensor_group_data.GetUnBufferedData()[f"mask_status_controllers/{sensor_mask_name}"] = []
|
|
161
|
+
|
|
162
|
+
sensor_group_data.GetUnBufferedData()[f"mask_status_controllers/{sensor_mask_name}"].append(mask_status_controller)
|
|
163
|
+
|
|
164
|
+
def SetSensorNormalizationFactor(list_of_sensors: 'list[KratosSI.Sensors.Sensor]', sensor_normalization_settings: Kratos.Parameters) -> None:
|
|
165
|
+
sensor_normalization_type = sensor_normalization_settings["type"].GetString()
|
|
166
|
+
|
|
167
|
+
measured_values = numpy.array([sensor.GetNode().GetValue(KratosSI.SENSOR_MEASURED_VALUE) for sensor in list_of_sensors], dtype=numpy.float64)
|
|
168
|
+
|
|
169
|
+
def local_maximum_measured_value(x: numpy.ndarray, parameters: Kratos.Parameters) -> numpy.ndarray:
|
|
170
|
+
if not parameters.Has("epsilon"):
|
|
171
|
+
raise RuntimeError(f"""The sensor normalization settings for type \"local_maximum_measured_value\"
|
|
172
|
+
must have an \"epsilon\" value.""")
|
|
173
|
+
if parameters["epsilon"].GetDouble() < 0.0:
|
|
174
|
+
raise RuntimeError(f"""The sensor normalization settings for type \"local_maximum_measured_value\"
|
|
175
|
+
must have a non-negative \"epsilon\" value.""")
|
|
176
|
+
epsilon = parameters["epsilon"].GetDouble()
|
|
177
|
+
max_measured_value = numpy.max(numpy.abs(x))
|
|
178
|
+
return numpy.maximum(numpy.abs(x), epsilon * max_measured_value)
|
|
179
|
+
|
|
180
|
+
normalization_dict = {
|
|
181
|
+
"" : lambda x, _: numpy.ones(x.shape, dtype=numpy.float64),
|
|
182
|
+
"none" : lambda x, _: numpy.ones(x.shape, dtype=numpy.float64),
|
|
183
|
+
"maximum_measured_value" : lambda x, _: numpy.max(numpy.abs(x)) * numpy.ones(x.shape, dtype=numpy.float64),
|
|
184
|
+
"average_measured_value" : lambda x, _: numpy.average(numpy.abs(x)) * numpy.ones(x.shape, dtype=numpy.float64),
|
|
185
|
+
"local_measured_value" : lambda x, _: numpy.abs(x),
|
|
186
|
+
"local_maximum_measured_value": local_maximum_measured_value
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if sensor_normalization_type not in normalization_dict:
|
|
190
|
+
raise RuntimeError(f"Unsupported sensor normalization type \"{sensor_normalization_type}\". Supported types are:\n\t" + "\n\t".join(normalization_dict.keys()))
|
|
191
|
+
|
|
192
|
+
normalization_factors = normalization_dict[sensor_normalization_type](measured_values, sensor_normalization_settings)
|
|
193
|
+
for i, sensor in enumerate(list_of_sensors):
|
|
194
|
+
if math.isclose(normalization_factors[i], 0.0, abs_tol=1e-16):
|
|
195
|
+
raise RuntimeError(f"The normalization factor for sensor \"{sensor.GetName()}\" is approximately zero ({normalization_factors[i]}). Cannot normalize.")
|
|
196
|
+
sensor.GetNode().SetValue(KratosSI.SENSOR_NORMALIZATION_FACTOR, normalization_factors[i])
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from enum import Enum
|
|
3
|
+
import KratosMultiphysics as Kratos
|
|
4
|
+
import KratosMultiphysics.OptimizationApplication as KratosOA
|
|
5
|
+
|
|
6
|
+
class PropertiesDataLocation(Enum):
|
|
7
|
+
ElementProperties = 100
|
|
8
|
+
ConditionProperties = 200
|
|
9
|
+
|
|
10
|
+
class TensorAdaptorDataLocation(Kratos.Globals.DataLocation):
|
|
11
|
+
ElementProperties = PropertiesDataLocation.ElementProperties,
|
|
12
|
+
ConditionProperties = PropertiesDataLocation.ConditionProperties
|
|
13
|
+
|
|
14
|
+
def GetTensorAdaptor(model_part: Kratos.ModelPart, data_location: TensorAdaptorDataLocation, variable: typing.Any) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
15
|
+
if data_location == TensorAdaptorDataLocation.NodeHistorical:
|
|
16
|
+
ta = Kratos.TensorAdaptors.HistoricalVariableTensorAdaptor(model_part.Nodes, variable)
|
|
17
|
+
elif data_location == TensorAdaptorDataLocation.NodeNonHistorical:
|
|
18
|
+
ta = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Nodes, variable)
|
|
19
|
+
elif data_location == TensorAdaptorDataLocation.Condition:
|
|
20
|
+
ta = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Conditions, variable)
|
|
21
|
+
elif data_location == TensorAdaptorDataLocation.Element:
|
|
22
|
+
ta = Kratos.TensorAdaptors.VariableTensorAdaptor(model_part.Elements, variable)
|
|
23
|
+
elif data_location == TensorAdaptorDataLocation.ConditionProperties:
|
|
24
|
+
ta = KratosOA.TensorAdaptors.PropertiesVariableTensorAdaptor(model_part.Conditions, variable)
|
|
25
|
+
elif data_location == TensorAdaptorDataLocation.ElementProperties:
|
|
26
|
+
ta = KratosOA.TensorAdaptors.PropertiesVariableTensorAdaptor(model_part.Elements, variable)
|
|
27
|
+
else:
|
|
28
|
+
raise RuntimeError(f"Unsupported {data_location}.")
|
|
29
|
+
|
|
30
|
+
ta.CollectData()
|
|
31
|
+
return ta
|
|
32
|
+
|
|
33
|
+
class TensorAdaptorBoundingManager:
|
|
34
|
+
def __init__(self, bounds: 'list[float]') -> None:
|
|
35
|
+
"""
|
|
36
|
+
This class is used to bound values of an tensor adaptor to specified interval.
|
|
37
|
+
If a value in an tensor adaptor is above the max value of bounds, then it will have a value larger than 1.0
|
|
38
|
+
if a value in an tensor adaptor is below the min value of bounds, then it will have a value smaller than 0.0
|
|
39
|
+
Values in an tensor adaptor will be linearly interpolated and mapped from interval [min(bounds), max(bounds)]
|
|
40
|
+
to [0, 1].
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
bounds (list[float]): Bounds of the given tensor adaptor values.
|
|
44
|
+
|
|
45
|
+
Raises:
|
|
46
|
+
RuntimeError: If bounds does not contain two values.
|
|
47
|
+
"""
|
|
48
|
+
if len(bounds) != 2:
|
|
49
|
+
raise RuntimeError(f"The bounds should be of size 2. [bounds = {bounds}]")
|
|
50
|
+
self.bounds = sorted(bounds)
|
|
51
|
+
|
|
52
|
+
def GetBoundGap(self) -> float:
|
|
53
|
+
return self.bounds[1] - self.bounds[0]
|
|
54
|
+
|
|
55
|
+
def GetBoundedTensorAdaptor(self, unbounded_tensor_adaptor: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
56
|
+
result = unbounded_tensor_adaptor.Clone()
|
|
57
|
+
result.data[:] = (result.data[:] - self.bounds[0]) / self.GetBoundGap()
|
|
58
|
+
return result
|
|
59
|
+
|
|
60
|
+
def GetUnboundedTensorAdaptor(self, bounded_tensor_adaptor: Kratos.TensorAdaptors.DoubleTensorAdaptor) -> Kratos.TensorAdaptors.DoubleTensorAdaptor:
|
|
61
|
+
result = bounded_tensor_adaptor.Clone()
|
|
62
|
+
result.data[:] = (result.data[:] * self.GetBoundGap() + self.bounds[0])
|
|
63
|
+
return result
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: KratosSystemIdentificationApplication
|
|
3
|
+
Version: 10.4.4
|
|
4
|
+
Summary: KRATOS Multiphysics ("Kratos") is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, and high performance. Kratos is written in C++, and counts with an extensive Python interface.
|
|
5
|
+
Author-email: Kratos Team <kratos@listas.cimne.upc.edu>
|
|
6
|
+
License: BSD-4-Clause
|
|
7
|
+
Classifier: Programming Language :: C++
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Topic :: Scientific/Engineering
|
|
10
|
+
Requires-Python: >=3.8
|
|
11
|
+
Requires-Dist: kratosmultiphysics==10.4.4
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
KratosMultiphysics/SystemIdentificationApplication/python_registry_lists.py,sha256=JdbRUeLb0ChurxYgeZzWSFyEK5_aYre1I_doPu-908E,199
|
|
2
|
+
KratosMultiphysics/SystemIdentificationApplication/__init__.py,sha256=YQN6PirfZXlOipE9lNXVFs0op-fUVRHbPse2zEQWeR4,745
|
|
3
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_generator_analysis.py,sha256=m6W836uU7f0xAgR4wXj5DRBG5wdhdKdol90Y5O03KUs,6648
|
|
4
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/response_sensitivity_interface.py,sha256=DeE_gvQb6xgClUhB7G5_JNqbbdTOlsZFbYR9pcCJfOA,1237
|
|
5
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/response_sensitivity_analysis.py,sha256=YURa3anPD97X34AyNnEfE93HS-CND3Cvf7keulARe3A,2041
|
|
6
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/system_identification_static_analysis.py,sha256=6Wu335UM6fs5xW5P_at4JcoVg9uu2QiGd35DZHwUGM8,2697
|
|
7
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_sensitivity_solvers/sensor_sensitivity_adjoint_static_solver.py,sha256=gEYSOEaYxQ_skGJ9j-y_2Fzn94-BCx0WtgM9HR6w5bM,2843
|
|
8
|
+
KratosMultiphysics/SystemIdentificationApplication/processes/sensor_output_process.py,sha256=2eoijTmEUIyG4OSzm5DyR2oiuSpJLldcVEjXO5n1o5A,4202
|
|
9
|
+
KratosMultiphysics/SystemIdentificationApplication/responses/temperature_detection_response.py,sha256=fHRWaGsQbWb_-XeLg7naEbf3W6K0AuufCxPNxLl3i3U,1384
|
|
10
|
+
KratosMultiphysics/SystemIdentificationApplication/responses/damage_detection_response.py,sha256=yg_01Ib_hK9wThRFQX7L_jc3R-sb9GxvgBXKM6mV4kY,11240
|
|
11
|
+
KratosMultiphysics/SystemIdentificationApplication/responses/pressure_detection_response.py,sha256=d2lCFGs6o-s-6x4Gag4lfRZgc7qoOTQQPe-PUI9jBP0,1366
|
|
12
|
+
KratosMultiphysics/SystemIdentificationApplication/controls/material_properties_control.py,sha256=UWl5eI3yPTsD0paxgjNPSB6EfOY2brY6kzHB6WbXGSo,13765
|
|
13
|
+
KratosMultiphysics/SystemIdentificationApplication/controls/data_values_control.py,sha256=6JQJcsES2Dp-Wp4AVYM_NqMwGN8UdDlu3v70cbTPpSs,12905
|
|
14
|
+
KratosMultiphysics/SystemIdentificationApplication/utilities/tensor_adaptor_utils.py,sha256=wJ1qkTj-kDHCxb-dReMvCaDYSTWZF9APvz0g8hSl_cg,3270
|
|
15
|
+
KratosMultiphysics/SystemIdentificationApplication/utilities/data_utils.py,sha256=5ZNRz-wUGjZ5OGaAxVBKb1bdLPOa9omUbLBwSXha7tg,3312
|
|
16
|
+
KratosMultiphysics/SystemIdentificationApplication/utilities/sensor_utils.py,sha256=y_idR9FNPfeL6YKzwA0JqU68N_GOaFi9DO4VpBNFxUc,11085
|
|
17
|
+
KratosMultiphysics/SystemIdentificationApplication/convergence_criteria/sensor_error.py,sha256=biIaJNGHrpti8ZYk1itI9BwZyAbYXpO59aZfQ4p6-d4,4854
|
|
18
|
+
KratosMultiphysics/SystemIdentificationApplication/sensor_io/sensor_model_part_controller.py,sha256=vE33Xbq2zOKY1efn52JM3lSBXFsWxx-rNfSTB8QCfEI,3213
|
|
19
|
+
KratosMultiphysics/.libs/KratosSystemIdentificationApplication.so,sha256=zK2G6oUhMu_hB4bBJdaYAaVt2GbAh-RNOFMEls_M7Ms,1227584
|
|
20
|
+
KratosMultiphysics/.libs/libKratosSystemIdentificationCore.dylib,sha256=t8t-6kBSoz7FHJK0nE-SdNGhmveKcADOMmzCQ49bSjI,2651536
|
|
21
|
+
kratossystemidentificationapplication.dylibs/libstdc++.6.dylib,sha256=msZqYToEz3DYpyb3gdNdl4HfDSVAn_HG_87McBJUV0A,3403264
|
|
22
|
+
kratossystemidentificationapplication.dylibs/libKratosCore.dylib,sha256=BqtBk3bY9895iHDNKyyOWhQedbevJjAmi8gJuekJu2Y,63629792
|
|
23
|
+
kratossystemidentificationapplication.dylibs/libgcc_s.1.1.dylib,sha256=igEme-s72bdU4f5YCEh8V5w5Dx9Mzs2l5IXlm8EM-_c,219232
|
|
24
|
+
kratossystemidentificationapplication.dylibs/libgomp.1.dylib,sha256=HOZIqBxyjYyy-zPnzJsGXiXbsA0wrzhKEz5RuKvx4tM,438880
|
|
25
|
+
kratossystemidentificationapplication-10.4.4.dist-info/RECORD,,
|
|
26
|
+
kratossystemidentificationapplication-10.4.4.dist-info/WHEEL,sha256=QX0UaoWXQIAv8vp5R3do793urekDoJdJRoGCk8nXIBY,115
|
|
27
|
+
kratossystemidentificationapplication-10.4.4.dist-info/METADATA,sha256=8DpNB7SIduTjMqKcJgEQt_zv1Cpp5ynSh2CEcouduro,644
|
|
Binary file
|
|
Binary file
|
|
Binary file
|