luminarycloud 0.15.2__py3-none-any.whl → 0.15.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. luminarycloud/__init__.py +1 -0
  2. luminarycloud/_helpers/_code_representation.py +44 -19
  3. luminarycloud/_helpers/_create_simulation.py +2 -0
  4. luminarycloud/_helpers/_entity_identifier.py +6 -0
  5. luminarycloud/_helpers/named_variables.py +6 -15
  6. luminarycloud/_helpers/warnings/experimental.py +6 -2
  7. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +103 -81
  8. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +37 -1
  9. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +33 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +10 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +45 -15
  12. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +104 -22
  13. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +46 -46
  14. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +7 -1
  15. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +12 -12
  16. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -2
  17. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +221 -143
  18. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +154 -7
  19. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
  20. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
  21. luminarycloud/_proto/assistant/assistant_pb2.py +92 -71
  22. luminarycloud/_proto/assistant/assistant_pb2.pyi +58 -11
  23. luminarycloud/_proto/assistant/assistant_pb2_grpc.py +47 -13
  24. luminarycloud/_proto/assistant/assistant_pb2_grpc.pyi +18 -6
  25. luminarycloud/_proto/client/simulation_pb2.py +373 -324
  26. luminarycloud/_proto/client/simulation_pb2.pyi +123 -3
  27. luminarycloud/_proto/fvm/solver_results_pb2.py +25 -11
  28. luminarycloud/_proto/fvm/solver_results_pb2.pyi +24 -1
  29. luminarycloud/_proto/geometry/geometry_pb2.py +64 -63
  30. luminarycloud/_proto/geometry/geometry_pb2.pyi +11 -3
  31. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +18 -14
  32. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +14 -4
  33. luminarycloud/_proto/named_variable_set/named_variable_set_pb2.py +49 -0
  34. luminarycloud/_proto/named_variable_set/named_variable_set_pb2.pyi +53 -0
  35. luminarycloud/_proto/namedvariableset/namedvariableset_pb2.py +49 -0
  36. luminarycloud/_proto/namedvariableset/namedvariableset_pb2.pyi +53 -0
  37. luminarycloud/_proto/quantity/quantity_pb2.py +8 -5
  38. luminarycloud/_proto/quantity/quantity_pb2.pyi +2 -0
  39. luminarycloud/_wrapper.py +26 -7
  40. luminarycloud/enum/__init__.py +5 -0
  41. luminarycloud/enum/physics_ai_lifecycle_state.py +30 -0
  42. luminarycloud/enum/quantity_type.py +43 -0
  43. luminarycloud/enum/vis_enums.py +6 -2
  44. luminarycloud/geometry.py +46 -2
  45. luminarycloud/meshing/mesh_generation_params.py +6 -5
  46. luminarycloud/meshing/sizing_strategy/sizing_strategies.py +2 -1
  47. luminarycloud/named_variable_set.py +13 -6
  48. luminarycloud/params/enum/_enum_wrappers.py +68 -0
  49. luminarycloud/params/simulation/_lib.py +1 -1
  50. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +5 -6
  51. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +6 -7
  52. luminarycloud/params/simulation/adjoint_.py +3 -4
  53. luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -4
  54. luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -4
  55. luminarycloud/params/simulation/basic/gravity_.py +3 -4
  56. luminarycloud/params/simulation/body_frame_.py +3 -4
  57. luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +9 -6
  58. luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +9 -6
  59. luminarycloud/params/simulation/entity_relationships_.py +3 -4
  60. luminarycloud/params/simulation/general_.py +3 -4
  61. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -4
  62. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +5 -6
  63. luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -4
  64. luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +5 -6
  65. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +4 -5
  66. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +5 -6
  67. luminarycloud/params/simulation/material/fluid/material_model_.py +3 -4
  68. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -5
  69. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -5
  70. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +3 -4
  71. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -4
  72. luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -5
  73. luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +6 -7
  74. luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +3 -4
  75. luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -4
  76. luminarycloud/params/simulation/material/material_fluid_.py +4 -5
  77. luminarycloud/params/simulation/material/material_solid_.py +6 -7
  78. luminarycloud/params/simulation/material_entity_.py +6 -5
  79. luminarycloud/params/simulation/monitor_plane_.py +4 -5
  80. luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +3 -4
  81. luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +3 -4
  82. luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +3 -4
  83. luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -4
  84. luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +3 -4
  85. luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +3 -4
  86. luminarycloud/params/simulation/motion_data/motion_type_.py +3 -4
  87. luminarycloud/params/simulation/motion_data_.py +3 -4
  88. luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -4
  89. luminarycloud/params/simulation/output_.py +3 -4
  90. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +3 -4
  91. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +3 -4
  92. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -4
  93. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +5 -6
  94. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -4
  95. luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +3 -4
  96. luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +3 -4
  97. luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -4
  98. luminarycloud/params/simulation/particle_group_.py +3 -4
  99. luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +4 -5
  100. luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -4
  101. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +9 -10
  102. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +5 -6
  103. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -6
  104. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -5
  105. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -5
  106. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +4 -5
  107. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +5 -6
  108. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +4 -5
  109. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -6
  110. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -5
  111. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +7 -8
  112. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +5 -6
  113. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -4
  114. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +3 -4
  115. luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +3 -4
  116. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +9 -10
  117. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -5
  118. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -5
  119. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -5
  120. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -4
  121. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -5
  122. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -4
  123. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -4
  124. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +3 -4
  125. luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -4
  126. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +3 -4
  127. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +3 -4
  128. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -6
  129. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +9 -10
  130. luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -4
  131. luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +4 -5
  132. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -4
  133. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +6 -7
  134. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -5
  135. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -5
  136. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -4
  137. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -4
  138. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -4
  139. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +5 -6
  140. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +3 -4
  141. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -5
  142. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -4
  143. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -4
  144. luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +3 -4
  145. luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +4 -5
  146. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -4
  147. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -4
  148. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +4 -5
  149. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -4
  150. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +8 -9
  151. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -4
  152. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -5
  153. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -5
  154. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -4
  155. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +3 -4
  156. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -4
  157. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +5 -6
  158. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +5 -6
  159. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -5
  160. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -4
  161. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -4
  162. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +8 -9
  163. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -4
  164. luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +4 -5
  165. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -4
  166. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -4
  167. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -4
  168. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -4
  169. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +16 -17
  170. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -4
  171. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -4
  172. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +3 -4
  173. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +15 -16
  174. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -4
  175. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -4
  176. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +3 -4
  177. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -5
  178. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -5
  179. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -5
  180. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -5
  181. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -5
  182. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -4
  183. luminarycloud/params/simulation/physics/fluid/turbulence_.py +5 -6
  184. luminarycloud/params/simulation/physics/fluid_.py +7 -6
  185. luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -4
  186. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -6
  187. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -5
  188. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -5
  189. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +3 -4
  190. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -5
  191. luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +3 -4
  192. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -5
  193. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -5
  194. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -4
  195. luminarycloud/params/simulation/physics/heat/heat_source_.py +3 -4
  196. luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +3 -4
  197. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +4 -5
  198. luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -4
  199. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +3 -4
  200. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -4
  201. luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +3 -4
  202. luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +5 -6
  203. luminarycloud/params/simulation/physics/heat_.py +5 -5
  204. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -4
  205. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -4
  206. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -4
  207. luminarycloud/params/simulation/physics/periodic_pair_.py +3 -4
  208. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -4
  209. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -5
  210. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +4 -5
  211. luminarycloud/params/simulation/physics_.py +6 -5
  212. luminarycloud/params/simulation/simulation_param_.py +3 -4
  213. luminarycloud/params/simulation/sliding_interfaces_.py +3 -4
  214. luminarycloud/params/simulation/surface_name_.py +3 -4
  215. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -4
  216. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -4
  217. luminarycloud/params/simulation/time/compute_statistics_.py +3 -4
  218. luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -4
  219. luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -4
  220. luminarycloud/params/simulation/time/time_marching_.py +3 -4
  221. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -4
  222. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +4 -5
  223. luminarycloud/params/simulation/time/time_step_ramp_.py +3 -4
  224. luminarycloud/params/simulation/time_.py +4 -5
  225. luminarycloud/params/simulation/volume_entity_.py +6 -5
  226. luminarycloud/physics_ai/__init__.py +2 -0
  227. luminarycloud/physics_ai/architectures.py +42 -8
  228. luminarycloud/physics_ai/inference.py +0 -2
  229. luminarycloud/physics_ai/models.py +44 -15
  230. luminarycloud/pipeline_util/dictable.py +27 -0
  231. luminarycloud/pipeline_util/yaml.py +55 -0
  232. luminarycloud/pipelines/__init__.py +29 -0
  233. luminarycloud/pipelines/core.py +225 -0
  234. luminarycloud/pipelines/operators.py +197 -0
  235. luminarycloud/pipelines/parameters.py +42 -0
  236. luminarycloud/project.py +60 -9
  237. luminarycloud/simulation.py +35 -4
  238. luminarycloud/simulation_param.py +16 -12
  239. luminarycloud/simulation_template.py +31 -12
  240. luminarycloud/solution.py +1 -1
  241. luminarycloud/types/__init__.py +2 -0
  242. luminarycloud/types/adfloat.py +50 -8
  243. luminarycloud/types/ids.py +2 -0
  244. luminarycloud/types/vector3.py +2 -1
  245. luminarycloud/vis/__init__.py +12 -5
  246. luminarycloud/vis/data_extraction.py +546 -0
  247. luminarycloud/vis/display.py +64 -8
  248. luminarycloud/vis/filters.py +183 -43
  249. luminarycloud/vis/interactive_scene.py +2 -1
  250. luminarycloud/vis/primitives.py +38 -0
  251. luminarycloud/vis/vis_util.py +56 -0
  252. luminarycloud/vis/visualization.py +241 -71
  253. {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/METADATA +3 -1
  254. {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/RECORD +255 -240
  255. {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/WHEEL +0 -0
@@ -1,3 +1,4 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
1
2
  import dataclasses as dc
2
3
  import io
3
4
  import json
@@ -7,23 +8,47 @@ from time import sleep, time
7
8
  from typing import Dict, List, Tuple, cast
8
9
 
9
10
  import luminarycloud._proto.api.v0.luminarycloud.common.common_pb2 as common_pb2
10
- import requests
11
11
  from luminarycloud.params.simulation.physics.fluid.boundary_conditions import Farfield
12
12
  from luminarycloud.types import Vector3, Vector3Like
13
13
 
14
14
  from .._client import get_default_client
15
15
  from .._helpers._get_project_id import _get_project_id
16
+ from .._proto.quantity import quantity_pb2 as quantitypb
16
17
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
17
- from ..enum.vis_enums import *
18
+ from ..types import SimulationID, MeshID
19
+ from luminarycloud.enum import (
20
+ CameraDirection,
21
+ CameraProjection,
22
+ RenderStatusType,
23
+ EntityType,
24
+ SceneMode,
25
+ VisQuantity,
26
+ FieldComponent,
27
+ Representation,
28
+ ColorMapPreset,
29
+ )
18
30
  from ..exceptions import NotFoundError
19
31
  from ..geometry import Geometry, get_geometry
20
32
  from ..mesh import Mesh, get_mesh, get_mesh_metadata
21
33
  from ..simulation import get_simulation
22
34
  from ..solution import Solution
23
35
  from ..types.vector3 import _to_vector3
24
- from .display import ColorMap, ColorMapAppearance, DisplayAttributes, Field
25
- from .filters import BoxClip, Filter, PlaneClip, Slice, SurfaceStreamlines, SurfaceLIC
36
+ from .display import ColorMap, ColorMapAppearance, DisplayAttributes, Field, DataRange
37
+ from .filters import (
38
+ BoxClip,
39
+ Filter,
40
+ PlaneClip,
41
+ Slice,
42
+ SurfaceStreamlines,
43
+ SurfaceLIC,
44
+ Threshold,
45
+ RakeStreamlines,
46
+ ScaledVectorGlyphs,
47
+ FixedSizeVectorGlyphs,
48
+ Isosurface,
49
+ )
26
50
  from .interactive_scene import InteractiveScene
51
+ from .vis_util import _InternalToken, _download_file, _get_status
27
52
 
28
53
  logger = logging.getLogger(__name__)
29
54
 
@@ -63,6 +88,18 @@ class DirectionalCamera:
63
88
  1.0
64
89
  """
65
90
 
91
+ def _from_proto(self, static_ani: vis_pb2.AnimationSettingsStatic) -> None:
92
+ """Populate this DirectionalCamera from a proto static animation property."""
93
+ c_typ = static_ani.camera.WhichOneof("specification")
94
+ if c_typ != "direction":
95
+ raise TypeError(f"Expected 'direction' camera type, got {c_typ}. ")
96
+ self.label = static_ani.label if static_ani.label else ""
97
+ self.direction = CameraDirection(static_ani.camera.direction)
98
+ self.zoom_in = static_ani.camera.zoom
99
+ self.width = static_ani.resolution.width
100
+ self.height = static_ani.resolution.height
101
+ self.projection = CameraProjection(static_ani.camera.projection)
102
+
66
103
 
67
104
  @dc.dataclass
68
105
  class LookAtCamera:
@@ -104,11 +141,23 @@ class LookAtCamera:
104
141
  scene where pan is used (i.e., control + middle mouse).
105
142
  """
106
143
 
107
-
108
- class _InternalToken:
109
- """Marker class to control instantiation access for RenderOutput."""
110
-
111
- pass
144
+ def _from_proto(self, static_ani: vis_pb2.AnimationSettingsStatic) -> None:
145
+ """Populate this LookAtCamera from a proto static animation property."""
146
+ c_typ = static_ani.camera.WhichOneof("specification")
147
+ if c_typ != "look_at":
148
+ raise TypeError(f"Expected 'look_at' camera type, got {c_typ}. ")
149
+ self.label = static_ani.label if static_ani.label else ""
150
+ self.position = Vector3()
151
+ self.position._from_proto(static_ani.camera.look_at.position)
152
+ self.up = Vector3()
153
+ self.up._from_proto(static_ani.camera.look_at.up)
154
+ self.look_at = Vector3()
155
+ self.look_at._from_proto(static_ani.camera.look_at.look_at)
156
+ self.pan_x = static_ani.camera.look_at.pan.x
157
+ self.pan_y = static_ani.camera.look_at.pan.y
158
+ self.width = static_ani.resolution.width
159
+ self.height = static_ani.resolution.height
160
+ self.projection = CameraProjection(static_ani.camera.projection)
112
161
 
113
162
 
114
163
  class RenderOutput:
@@ -172,8 +221,7 @@ class RenderOutput:
172
221
  self
173
222
  """
174
223
  self._fail_if_deleted()
175
- render = get_render(self._project_id, self._extract_id)
176
- self.status = render.status
224
+ self.status = _get_status(self._project_id, self._extract_id)
177
225
  return self
178
226
 
179
227
  def wait(
@@ -231,23 +279,12 @@ class RenderOutput:
231
279
  req.project_id = self._project_id
232
280
  res: vis_pb2.DownloadExtractResponse = get_default_client().DownloadExtract(req)
233
281
 
234
- buffers: List[Tuple["io.BytesIO", str]] = []
235
- assert len(res.files) == len(res.labels)
236
- for output, label in zip(res.files, res.labels):
237
- buffer = io.BytesIO()
238
- if output.signed_url:
239
- response = requests.get(output.signed_url, stream=True)
240
- response.raise_for_status()
241
- for chunk in response.iter_content(chunk_size=8192):
242
- buffer.write(chunk)
243
- elif output.full_contents:
244
- buffer.write(output.full_contents)
245
- else:
246
- raise Exception("download_image respose contains no data.")
247
- # Reset buffer position to the beginning for reading
248
- buffer.seek(0)
249
- buffers.append((buffer, label))
250
- return buffers
282
+ image_buffers: List[Tuple["io.BytesIO", str]] = []
283
+ assert len(res.images.files) == len(res.images.labels)
284
+ for output, label in zip(res.images.files, res.images.labels):
285
+ buffer = _download_file(output)
286
+ image_buffers.append((buffer, label))
287
+ return image_buffers
251
288
 
252
289
  def save_images(self, file_prefix: str, write_labels: bool = False) -> None:
253
290
  """
@@ -437,12 +474,26 @@ class Scene:
437
474
 
438
475
  def hide_far_field(self) -> None:
439
476
  """
440
- Hide all far fields surfaces based on simulation parameters. Will work
441
- if the entity is a simulation.
477
+ Hide all far fields surfaces based on simulation parameters. Will only work
478
+ if the entity is a simulation, otherwise it will raise an error.
442
479
  """
443
480
 
481
+ if self._entity_type != EntityType.SIMULATION:
482
+ raise ValueError(
483
+ "hide_far_field: This method only works with solutions, not meshes or geometries."
484
+ )
485
+
444
486
  for boundary_id in self._far_field_boundary_ids:
445
- self.surface_visibility(boundary_id, False)
487
+ if boundary_id in self._surface_ids:
488
+ self.surface_visibility(boundary_id, False)
489
+ elif boundary_id in self._tag_ids:
490
+ self.tag_visibility(boundary_id, False)
491
+ else:
492
+ # This should not happen, but if it does, we raise an error.
493
+ raise ValueError(
494
+ f"Internal Error: Boundary id {boundary_id} not found in surface ids {self._surface_ids} "
495
+ f"or tag ids {self._tag_ids}"
496
+ )
446
497
 
447
498
  def surface_ids(self) -> List[str]:
448
499
  """Get a list of all the surface ids associated with the mesh."""
@@ -476,6 +527,7 @@ class Scene:
476
527
  if not tag_id in self._tag_ids:
477
528
  raise ValueError(f"Id {tag_id} not a known tag id {self._tag_ids}")
478
529
  self._surface_visibilities[tag_id] = visible
530
+ # TODO(matt): unroll the tags for the interactive scene.
479
531
 
480
532
  def add_filter(self, filter: Filter) -> None:
481
533
  """
@@ -580,16 +632,7 @@ class Scene:
580
632
  static.resolution.height = camera.height
581
633
  req.spec.animation_properties.statics.items.append(static)
582
634
 
583
- req.spec.global_display_attributes.visible = self.global_display_attrs.visible
584
- req.spec.global_display_attributes.representation = (
585
- self.global_display_attrs.representation.value
586
- )
587
- req.spec.global_display_attributes.field.component = (
588
- self.global_display_attrs.field.component.value
589
- )
590
- req.spec.global_display_attributes.field.quantity_typ = (
591
- self.global_display_attrs.field.quantity.value
592
- )
635
+ req.spec.global_display_attributes.CopyFrom(self.global_display_attrs._to_proto())
593
636
 
594
637
  for id, visible in self._surface_visibilities.items():
595
638
  attrs = vis_pb2.DisplayAttributes()
@@ -629,6 +672,14 @@ class Scene:
629
672
  ):
630
673
  cmap_fields[filter.display_attrs.field] = True
631
674
 
675
+ # Add the global display field as well if visible
676
+ if (
677
+ self.auto_color_map_annotations
678
+ and self.global_display_attrs.field.quantity != VisQuantity.NONE
679
+ and self.global_display_attrs.visible
680
+ ):
681
+ cmap_fields[self.global_display_attrs.field] = True
682
+
632
683
  for cmap in self._color_maps:
633
684
  if self.auto_color_map_annotations and not cmap.appearance:
634
685
  # Defer color map processing to the auto color annotation.
@@ -638,7 +689,7 @@ class Scene:
638
689
 
639
690
  # Add the automated color maps if enabled. If we don't specify them
640
691
  # in the proto, the annotations will not appear in the image.
641
- if self.auto_color_map_annotations:
692
+ if self.auto_color_map_annotations and self._entity_type == EntityType.SIMULATION:
642
693
  auto_cmaps: List[ColorMap] = []
643
694
  for field in cmap_fields:
644
695
  found = False
@@ -808,35 +859,6 @@ class Scene:
808
859
  return cloned
809
860
 
810
861
 
811
- def get_render(project_id: str, extract_id: str) -> RenderOutput:
812
- """
813
- Get a previously created set of render outputs by project and extract id.
814
-
815
- .. warning:: This feature is experimental and may change or be removed in the future.
816
-
817
- Parameters
818
- ----------
819
- project_id : str
820
- The project id to of the extract.
821
- extract_id: str
822
- The id to of the extract.
823
-
824
- """
825
- req = vis_pb2.GetExtractRequest()
826
- req.extract_id = extract_id
827
- req.project_id = project_id
828
- res: vis_pb2.GetExtractResponse = get_default_client().GetExtract(req)
829
- render_output = RenderOutput(_InternalToken())
830
- render_output._set_data(
831
- extract_id=extract_id,
832
- project_id=project_id,
833
- name=res.extract.name,
834
- desciption=res.extract.description,
835
- status=RenderStatusType(res.extract.status),
836
- )
837
- return render_output
838
-
839
-
840
862
  def list_quantities(solution: Solution) -> List[VisQuantity]:
841
863
  """
842
864
  List the quantity types, including derived quantities, that are available in
@@ -911,6 +933,8 @@ def list_renders(entity: Geometry | Mesh | Solution) -> List[RenderOutput]:
911
933
  else:
912
934
  raise ValueError(f"Unknown entity type: '{entity_type}' ")
913
935
 
936
+ # We are requesting images not data
937
+ req.data_only = False
914
938
  res: vis_pb2.ListExtractsResponse = get_default_client().ListExtracts(req)
915
939
 
916
940
  results: List[RenderOutput] = []
@@ -928,3 +952,149 @@ def list_renders(entity: Geometry | Mesh | Solution) -> List[RenderOutput]:
928
952
  results.append(result)
929
953
 
930
954
  return results
955
+
956
+
957
+ def _reconstruct(extract_id: str, project_id: str) -> Scene:
958
+ """
959
+ This function reconstructs a scene from an extract id and project id. The
960
+ resulting scene should produce an identical image to the one that was
961
+ originally rendered. The main use case for this function is to support code
962
+ generation. Note: the scene will render the same image, but the might not
963
+ contain the exact same settings. For example, we auto-generate color maps
964
+ for all fields used in the global and filter display attributes by default.
965
+ When we get the extract back, we don't know if it was auto-generated or not.
966
+ Thus, the resulting color maps will be much more verbose than the original.
967
+ """
968
+ req = vis_pb2.GetExtractRequest()
969
+ req.extract_id = extract_id
970
+ req.project_id = project_id
971
+ res: vis_pb2.GetExtractSpecResponse = get_default_client().GetExtractSpec(req)
972
+ if res.spec.data_only:
973
+ raise ValueError("Error: cannot reconstruct a scene from a data only extract")
974
+
975
+ entity = res.spec.entity_type.WhichOneof("entity")
976
+ if entity == "geometry":
977
+ geom = get_geometry(res.spec.entity_type.geometry.id)
978
+ scene = Scene(geom)
979
+ elif entity == "mesh":
980
+ mesh_id = MeshID(res.spec.entity_type.mesh.id)
981
+ mesh = get_mesh(mesh_id)
982
+ scene = Scene(mesh)
983
+ elif entity == "simulation":
984
+ sim_id = SimulationID(res.spec.entity_type.simulation.id)
985
+ sim = get_simulation(sim_id)
986
+ sols = sim.list_solutions()
987
+ found = False
988
+ for sol in sols:
989
+ if sol.id == res.spec.entity_type.simulation.solution_id:
990
+ scene = Scene(sol)
991
+ found = True
992
+ break
993
+ if not found:
994
+ raise ValueError(f"Error: could not find the solution")
995
+ else:
996
+ raise ValueError(f"Error: could not resolve entity type")
997
+
998
+ try:
999
+ _ = scene # check to see if this is bound
1000
+ except NameError:
1001
+ raise ValueError(f"Error: could not create scene from entity")
1002
+
1003
+ # keep track of filter ids so we connect them later and keep track of
1004
+ # surface and tag visibilties.
1005
+ filter_ids: List[str] = []
1006
+ for filter in res.spec.filters:
1007
+ filter_ids.append(filter.id)
1008
+ typ = filter.WhichOneof("value")
1009
+ pfilter: Filter | None = None
1010
+ if typ == "clip":
1011
+ c_typ = filter.clip.WhichOneof("clip_function")
1012
+ if c_typ == "box":
1013
+ pfilter = BoxClip("")
1014
+ else:
1015
+ pfilter = PlaneClip("")
1016
+ elif typ == "slice":
1017
+ pfilter = Slice("")
1018
+ elif typ == "streamlines":
1019
+ s_typ = filter.streamlines.WhichOneof("seed_type")
1020
+ if s_typ == "surface":
1021
+ pfilter = SurfaceStreamlines("")
1022
+ elif s_typ == "rake":
1023
+ pfilter = RakeStreamlines("")
1024
+ else:
1025
+ raise ValueError(f"Error: unsupported streamlines seed type {s_typ}")
1026
+ elif typ == "glyph":
1027
+ g_typ = filter.glyph.WhichOneof("glyph_size")
1028
+ if g_typ == "fixed_size_glyphs":
1029
+ pfilter = FixedSizeVectorGlyphs("")
1030
+ else:
1031
+ pfilter = ScaledVectorGlyphs("")
1032
+ elif typ == "surface_lic":
1033
+ pfilter = SurfaceLIC("")
1034
+ elif typ == "threshold":
1035
+ pfilter = Threshold("")
1036
+ elif typ == "contour":
1037
+ pfilter = Isosurface("")
1038
+ else:
1039
+ raise ValueError(f"Error: unknown filter type {typ}")
1040
+
1041
+ assert pfilter is not None, "Internal error: filter type not set"
1042
+ pfilter._from_proto(filter)
1043
+ # Set the display attributes
1044
+ pattrs = DisplayAttributes()
1045
+ attrs = res.spec.display_attributes[pfilter.id]
1046
+ assert attrs is not None, "Internal error: display attributes not set"
1047
+ pfilter.display_attrs._from_proto(attrs)
1048
+ scene.add_filter(pfilter)
1049
+
1050
+ # Connect filters to their parents.
1051
+ for parent_id, children in res.spec.filter_connections.items():
1052
+ parent_filter = next((f for f in scene._filters if f.id == parent_id), None)
1053
+ if parent_filter is not None:
1054
+ for child_id in children.children_id:
1055
+ child_filter = next((f for f in scene._filters if f.id == child_id), None)
1056
+ if child_filter is not None:
1057
+ child_filter.set_parent(parent_filter)
1058
+ else:
1059
+ raise ValueError(
1060
+ f"Error: child filter {child_id} not found in the scene filters"
1061
+ )
1062
+ else:
1063
+ raise ValueError(f"Error: parent filter {parent_id} not found in the scene filters")
1064
+
1065
+ # scene attributes
1066
+ scene.supersampling = res.spec.supersampling_ratio
1067
+ scene.triad_visible = res.spec.triad_properties.visible
1068
+ scene.axes_grid_visible = res.spec.axes_grid_properties.visible
1069
+ scene.background_color = Vector3(
1070
+ x=res.spec.background_properties.color.r,
1071
+ y=res.spec.background_properties.color.g,
1072
+ z=res.spec.background_properties.color.b,
1073
+ )
1074
+ scene.global_display_attrs._from_proto(res.spec.global_display_attributes)
1075
+
1076
+ for id, attrs in res.spec.display_attributes.items():
1077
+ if id in filter_ids:
1078
+ continue # Skip filters, we already processed them.
1079
+ if id in scene._surface_ids or id in scene._tag_ids:
1080
+ # We only use visible or not for surfaces. The rest of the
1081
+ # attributes are set in the global display attributes.
1082
+ scene._surface_visibilities[id] = attrs.visible
1083
+
1084
+ for static_ani in res.spec.animation_properties.statics.items:
1085
+ cam_typ = static_ani.camera.WhichOneof("specification")
1086
+ if cam_typ == "direction":
1087
+ cam = DirectionalCamera()
1088
+ cam._from_proto(static_ani)
1089
+ scene.add_camera(cam)
1090
+ else:
1091
+ l_cam = LookAtCamera()
1092
+ l_cam._from_proto(static_ani)
1093
+ scene.add_camera(l_cam)
1094
+
1095
+ # Add color maps
1096
+ for color_map in res.spec.color_maps:
1097
+ cmap = ColorMap()
1098
+ cmap._from_proto(color_map)
1099
+ scene.add_color_map(cmap)
1100
+ return scene
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luminarycloud
3
- Version: 0.15.2
3
+ Version: 0.15.4
4
4
  Summary: Luminary Cloud SDK
5
5
  Project-URL: Homepage, https://www.luminarycloud.com/
6
6
  Project-URL: Documentation, https://app.luminarycloud.com/docs/api/
@@ -24,9 +24,11 @@ Requires-Dist: opentelemetry-semantic-conventions~=0.46b0
24
24
  Requires-Dist: protobuf~=4.21
25
25
  Requires-Dist: pyjwt~=2.6
26
26
  Requires-Dist: python-dotenv~=1.0.0
27
+ Requires-Dist: pyyaml~=6.0.2
27
28
  Requires-Dist: requests~=2.28
28
29
  Requires-Dist: waitress~=3.0.1
29
30
  Requires-Dist: werkzeug~=3.0.1
31
+ Requires-Dist: zstandard
30
32
  Provides-Extra: jupyter
31
33
  Requires-Dist: luminarycloud-jupyter; extra == 'jupyter'
32
34
  Description-Content-Type: text/markdown