diff --git a/apps/tutorials/codegen/HeatEquationKernel.py b/apps/tutorials/codegen/HeatEquationKernel.py index a9c5e472ea25da75888b4bfa038ec175ffba6983..8339fdff1cca5859ca71b8e8d0e5c06601c7c1f2 100644 --- a/apps/tutorials/codegen/HeatEquationKernel.py +++ b/apps/tutorials/codegen/HeatEquationKernel.py @@ -22,9 +22,11 @@ with CodeGeneration() as ctx: Ti6Al4V = Ti6Al4V.create_Ti6Al4V(u.center()) # density, density_subexpr = Ti6Al4V.density # Alternative subexp = [] - for a in Ti6Al4V.assignments: - data_symbol = ps.TypedSymbol(a[0].label.name, Arr(Fp(64))) # Alternative - subexp.append(ps.Assignment(data_symbol, a[1])) + # Iterate over the dictionary items + for label, assignment_list in Ti6Al4V.assignments.items(): + for data_label, data_values in assignment_list: + data_symbol = ps.TypedSymbol(data_label, Arr(Fp(64))) # Define the symbol with appropriate type + subexp.append(ps.Assignment(data_symbol, data_values)) # thermal_diffusivity_expr = thermal_diffusivity_by_heat_conductivity(Ti6Al4V.heat_conductivity, Ti6Al4V.density, Ti6Al4V.heat_capacity) thermal_diffusivity_expr = thermal_diffusivity_by_heat_conductivity(Ti6Al4V.heat_conductivity, Ti6Al4V.density, Ti6Al4V.heat_capacity) # Alternative subexp.append(ps.Assignment(thermal_diffusivity, thermal_diffusivity_expr)) diff --git a/src/materials/alloys/Alloy.py b/src/materials/alloys/Alloy.py index 27975f52fa1063e0a118b7c2a5990a57f5ae8d99..c5ff7250bb6d7b830f95957845d951a3483cdf00 100644 --- a/src/materials/alloys/Alloy.py +++ b/src/materials/alloys/Alloy.py @@ -1,6 +1,6 @@ import numpy as np from sympy import Expr -from typing import List, Union +from typing import List, Union, Dict, Tuple, Any from dataclasses import dataclass, field, asdict from src.materials.elements import Element from src.materials.elements import Ti, Al, V @@ -27,7 +27,8 @@ class Alloy: heat_conductivity: Union[float, Expr] = None thermal_diffusivity: Union[float, Expr] = None - assignments: list[tuple, ...] = field(default_factory=list, init=False) + # assignments: list[tuple, ...] = field(default_factory=list, init=False) + assignments: Dict[str, List[Tuple[str, Any]]] = field(default_factory=dict, init=False) def interpolate(self, quantity: str) -> float: comp = np.asarray(self.composition) diff --git a/src/materials/alloys/Ti6Al4V.py b/src/materials/alloys/Ti6Al4V.py index 4b8ccd2ccfda5d31aecab5f6f8afd46deabb441d..52a0026ad197f03fc2cab26f42370b639f833fc6 100644 --- a/src/materials/alloys/Ti6Al4V.py +++ b/src/materials/alloys/Ti6Al4V.py @@ -5,7 +5,7 @@ from src.materials.elements import Ti, Al, V from src.materials.constants import Constants from src.materials import interpolators from src.materials import models -from src.materials.property import Property +# from src.materials.property import Property def create_Ti6Al4V(T: Union[float, sp.Symbol]) -> Alloy: @@ -21,14 +21,16 @@ def create_Ti6Al4V(T: Union[float, sp.Symbol]) -> Alloy: Ti6Al4V.density = 4430.0 # kg/m³ Ref [5] Ti6Al4V.thermal_expansion_coefficient = 10e-6 # /K Ref[6] - '''Ti6Al4V.heat_capacity = interpolators.interpolate_lookup( - T, Ti6Al4V.solidification_interval(), [700.0, 1126.0]) # J/kg-k''' + heat_capacity_expr, heat_capacity_assignments = interpolators.interpolate_equidistant( + T, 1820, 20, [700, 800, 900, 1000, 1100, 1200], 'heat_capacity') + Ti6Al4V.heat_capacity = heat_capacity_expr - heat_capacity = interpolators.interpolate_equidistant( - T, 1820, 20, [700, 800, 900, 1000, 1100, 1200], 'heat_capacity') # J/kg-k - - Ti6Al4V.heat_capacity = heat_capacity.expression - Ti6Al4V.assignments += heat_capacity.assignments + # Merge the returned assignments into the Ti6Al4V assignments dictionary + for label, data in heat_capacity_assignments.items(): + if label in Ti6Al4V.assignments: + Ti6Al4V.assignments[label].extend(data) + else: + Ti6Al4V.assignments[label] = data Ti6Al4V.heat_conductivity = interpolators.interpolate_lookup( T, Ti6Al4V.solidification_interval(), [21.58, 33.60]) # W/m-k @@ -38,14 +40,19 @@ def create_Ti6Al4V(T: Union[float, sp.Symbol]) -> Alloy: Ti6Al4V.density = interpolators.interpolate_lookup( T, [1878.0, 1884.2, 1894.7, 1905.3, 1915.8, 1926.3, 1928.0], - [4236.3, 4234.9, 4233.6, 4232.3, 4230.9, 4229.7, 4227.0])''' + [4236.3, 4234.9, 4233.6, 4232.3, 4230.9, 4229.7, 4227.0]) - density = interpolators.interpolate_equidistant( + density_expr, density_assignments = interpolators.interpolate_equidistant( T, 1878.0, 5, [4236.3, 4234.9, 4233.6, 4232.3, 4230.9, 4229.7, 4227.0], 'density') - - Ti6Al4V.density = density.expression - Ti6Al4V.assignments += density.assignments + Ti6Al4V.density = density_expr + + # Merge the returned assignments into the Ti6Al4V assignments dictionary + for label, data in density_assignments.items(): + if label in Ti6Al4V.assignments: + Ti6Al4V.assignments[label].extend(data) + else: + Ti6Al4V.assignments[label] = data''' Ti6Al4V.thermal_diffusivity = models.thermal_diffusivity_by_heat_conductivity( Ti6Al4V.heat_conductivity, Ti6Al4V.density, Ti6Al4V.heat_capacity) diff --git a/src/materials/interpolators.py b/src/materials/interpolators.py index 6b32bf27768b537930b26535f92f6c28cb9c5808..8d57a4bf0bb339952dd62c77dcf910c654b0f5f6 100644 --- a/src/materials/interpolators.py +++ b/src/materials/interpolators.py @@ -1,14 +1,15 @@ import numpy as np import sympy as sp -from typing import Union, List +from typing import Union, List, Tuple, Dict # import pystencils as ps # from pystencils.types.quick import * -from src.materials.property import Property +# from src.materials.property import Property from pystencils.sympyextensions import CastFunc def interpolate_equidistant(T: Union[float, sp.Symbol], T_base: float, T_incr: float, - data_array: Union[np.ndarray, List[float]], label: str) -> Union[float, Property]: # TODO + data_array: Union[np.ndarray, List[float]], label: str) \ + -> Union[float, Tuple[Union[sp.Expr, float], Dict[str, List[Tuple[str, Tuple[float, ...]]]]]]: # TODO """ Interpolates values for equidistant temperature data points. @@ -41,7 +42,8 @@ def interpolate_equidistant(T: Union[float, sp.Symbol], T_base: float, T_incr: f # (((T_incr - mod) * data_symbol[idx] + (mod * data_symbol[idx + 1])) / T_incr, True)) (((T_incr - mod) * data_base[idx_int] + (mod * data_base[idx_int + 1])) / T_incr, True)) # Alternative # return result.subs(data_symbol, sp.Array(data_array)) - return Property(result, ((data_base, data_array),)) # [result, ps.Assignment(data_symbol, data_array), ps.Assignment(data_symbol, data_array)] # Alternative resurn a property, 1st arg: result, 2nd: List[tuple] + assignments = {label: [(label, data_array)]} + return result, assignments # [result, ps.Assignment(data_symbol, data_array), ps.Assignment(data_symbol, data_array)] # Alternative resurn a property, 1st arg: result, 2nd: List[tuple] else: if T < T_base: return data_array[0] @@ -106,20 +108,20 @@ if __name__ == '__main__': density_data_array2 = [4236.3, 4234.9, 4233.6, 4232.3, 4230.9, 4229.7, 4227.0] # Symbolic interpolation - symbolic_result = interpolate_lookup(Temp, density_temp_array1, density_data_array1) + symbolic_result = interpolate_lookup(Temp, density_temp_array2, density_data_array2) print("Symbolic interpolation result with interpolate_lookup:", symbolic_result) # Numeric interpolation - numeric_result = interpolate_lookup(450.0, density_temp_array1, density_data_array1) + numeric_result = interpolate_lookup(450.0, density_temp_array2, density_data_array2) print("Numeric interpolation result with interpolate_lookup:", numeric_result) T_base = 200 T_incr = 100 # Symbolic interpolation - symbolic_result = interpolate_equidistant(Temp, T_base, T_incr, density_data_array1, 'density') + symbolic_result = interpolate_equidistant(Temp, T_base, T_incr, density_data_array2, 'density') print("Symbolic interpolation result with interpolate_equidistant:", symbolic_result) # Numeric interpolation - numeric_result = interpolate_equidistant(450.0, T_base, T_incr, density_data_array1, 'density') + numeric_result = interpolate_equidistant(450.0, T_base, T_incr, density_data_array2, 'density') print("Numeric interpolation result with interpolate_equidistant:", numeric_result) diff --git a/src/materials/property.py b/src/materials/property.py index aacd51db2d94a68084ecae3a8545c36a2ff1b6a4..7a61e3e21e7ed630642153fc77662c631cce3e05 100644 --- a/src/materials/property.py +++ b/src/materials/property.py @@ -1,8 +1,8 @@ -from sympy import Expr +"""from sympy import Expr from dataclasses import dataclass @dataclass class Property: expression: Expr | float - assignments: tuple[tuple, ...] = tuple + assignments: tuple[tuple, ...] = tuple"""