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,52 +1,20 @@
1
1
  from luminarycloud.types import Vector3, Vector3Like
2
2
  from ..types.vector3 import _to_vector3
3
- from luminarycloud.enum import VisQuantity
3
+ from luminarycloud.enum import (
4
+ VisQuantity,
5
+ StreamlineDirection,
6
+ SurfaceStreamlineMode,
7
+ FieldComponent,
8
+ )
9
+ import luminarycloud.enum.quantity_type as quantity_type
4
10
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
5
11
  from abc import ABC, abstractmethod
6
- import string, random, math
12
+ import math
7
13
  import dataclasses as dc
8
14
  from .display import Field, DisplayAttributes
9
- from ..enum.vis_enums import StreamlineDirection, SurfaceStreamlineMode
10
15
  from typing import List, Any, cast
11
-
12
-
13
- def generate_id(prefix: str) -> str:
14
- return prefix + "".join(random.choices(string.ascii_lowercase, k=24))
15
-
16
-
17
- @dc.dataclass
18
- class Plane:
19
- """
20
- This class defines a plane.
21
-
22
- .. warning:: This feature is experimental and may change or be removed in the future.
23
-
24
- """
25
-
26
- origin: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
27
- """A point defined on the plane. Default: [0,0,0]."""
28
- normal: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=0, z=0))
29
- """The vector orthogonal to the plane. Default: [0,1,0]"""
30
-
31
-
32
- @dc.dataclass
33
- class Box:
34
- """
35
- This class defines a box used for filter such as box clip.
36
-
37
- .. warning:: This feature is experimental and may change or be removed in the future.
38
-
39
- """
40
-
41
- center: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
42
- """A point defined at the center of the box. Default: [0,0,0]."""
43
- lengths: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=1, z=1))
44
- """The the legnths of each side of the box. Default: [1,1,1]"""
45
- angles: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
46
- """
47
- The rotation of the box specified in Euler angles (degrees) and applied
48
- in XYZ ordering. Default: [0,0,0]
49
- """
16
+ from .primitives import Box, Plane
17
+ from .vis_util import generate_id
50
18
 
51
19
 
52
20
  class Filter(ABC):
@@ -72,6 +40,10 @@ class Filter(ABC):
72
40
  def _to_proto(self) -> vis_pb2.Filter:
73
41
  pass
74
42
 
43
+ @abstractmethod
44
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
45
+ pass
46
+
75
47
  def set_parent(self, filter: Any) -> None:
76
48
  """
77
49
  Set this filter's parent filter. This controls what data the filter uses
@@ -158,6 +130,20 @@ class Slice(Filter):
158
130
  vis_filter.slice.project_vectors = self.project_vectors
159
131
  return vis_filter
160
132
 
133
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
134
+ typ = filter.WhichOneof("value")
135
+ if typ != "slice":
136
+ raise TypeError(f"Expected 'slice', got {typ}")
137
+ self.id = filter.id
138
+ self.name = filter.name
139
+ self.project_vectors = filter.slice.project_vectors
140
+ origin = Vector3()
141
+ origin._from_proto(filter.slice.plane.origin)
142
+ self.plane.origin = origin
143
+ normal = Vector3()
144
+ normal._from_proto(filter.slice.plane.normal)
145
+ self.plane.normal = normal
146
+
161
147
 
162
148
  class Isosurface(Filter):
163
149
  """
@@ -207,6 +193,18 @@ class Isosurface(Filter):
207
193
  vis_filter.contour.iso_values.append(val)
208
194
  return vis_filter
209
195
 
196
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
197
+ typ = filter.WhichOneof("value")
198
+ if typ != "contour":
199
+ raise TypeError(f"Expected 'contour', got {typ}")
200
+ self.id = filter.id
201
+ self.name = filter.name
202
+ self.field.quantity = VisQuantity(filter.contour.field.quantity_typ)
203
+ self.field.component = FieldComponent(filter.contour.field.component)
204
+ self.isovalues.clear()
205
+ for val in filter.contour.iso_values:
206
+ self.isovalues.append(val)
207
+
210
208
 
211
209
  class PlaneClip(Filter):
212
210
  """
@@ -255,6 +253,21 @@ class PlaneClip(Filter):
255
253
  vis_filter.clip.inverted = self.inverted
256
254
  return vis_filter
257
255
 
256
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
257
+ typ = filter.WhichOneof("value")
258
+ if typ != "clip":
259
+ raise TypeError(f"Expected 'clip', got {typ}")
260
+ clip_typ = filter.clip.WhichOneof("clip_function")
261
+ if clip_typ != "plane":
262
+ raise TypeError(f"Expected 'plane clip', got {clip_typ}")
263
+ self.id = filter.id
264
+ self.name = filter.name
265
+ self.plane.normal = Vector3()
266
+ self.plane.normal._from_proto(filter.clip.plane.normal)
267
+ self.plane.origin = Vector3()
268
+ self.plane.origin._from_proto(filter.clip.plane.origin)
269
+ self.inverted = filter.clip.inverted
270
+
258
271
 
259
272
  class BoxClip(Filter):
260
273
  """
@@ -307,6 +320,27 @@ class BoxClip(Filter):
307
320
  vis_filter.clip.inverted = self.inverted
308
321
  return vis_filter
309
322
 
323
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
324
+ typ = filter.WhichOneof("value")
325
+ if typ != "clip":
326
+ raise TypeError(f"Expected 'clip', got {typ}")
327
+ clip_typ = filter.clip.WhichOneof("clip_function")
328
+ if clip_typ != "box":
329
+ raise TypeError(f"Expected 'box', got {clip_typ}")
330
+ self.id = filter.id
331
+ self.name = filter.name
332
+ self.box.center = Vector3()
333
+ self.box.center._from_proto(filter.clip.box.center)
334
+ self.box.lengths = Vector3()
335
+ self.box.lengths._from_proto(filter.clip.box.lengths)
336
+ self.box.angles = Vector3()
337
+ self.box.angles._from_proto(filter.clip.box.angles)
338
+ # Backend units are radians, convert back to degrees
339
+ self.box.angles.x = self.box.angles.x * (180 / math.pi)
340
+ self.box.angles.y = self.box.angles.y * (180 / math.pi)
341
+ self.box.angles.z = self.box.angles.z * (180 / math.pi)
342
+ self.inverted = filter.clip.inverted
343
+
310
344
 
311
345
  class VectorGlyphs(Filter):
312
346
  """
@@ -377,10 +411,27 @@ class FixedSizeVectorGlyphs(VectorGlyphs):
377
411
  vis_filter.glyph.fixed_size_glyphs = self.size
378
412
  vis_filter.glyph.n_glyphs = self.sampling_rate
379
413
  vis_filter.glyph.sampling_mode = vis_pb2.GLYPH_SAMPLING_MODE_EVERY_NTH
414
+ if not quantity_type._is_vector(self.field.quantity):
415
+ raise ValueError("FixedSizeVectorGlyphs: field must be a vector type")
380
416
  vis_filter.glyph.field.quantity_typ = self.field.quantity.value
381
417
  vis_filter.glyph.field.component = self.field.component.value
382
418
  return vis_filter
383
419
 
420
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
421
+ typ = filter.WhichOneof("value")
422
+ if typ != "glyph":
423
+ raise TypeError(f"Expected 'glyph', got {typ}")
424
+ glyph_typ = filter.glyph.WhichOneof("glyph_size")
425
+ if glyph_typ != "fixed_size_glyphs":
426
+ raise TypeError(f"Expected 'fixed size', got {typ}")
427
+ self.id = filter.id
428
+ self.name = filter.name
429
+ self.n_glyphs = filter.glyph.n_glyphs
430
+ self.size = filter.glyph.fixed_size_glyphs
431
+ self.sampling_rate = filter.glyph.n_glyphs
432
+ self.field.quantity = VisQuantity(filter.glyph.field.quantity_typ)
433
+ self.field.component = FieldComponent(filter.glyph.field.component)
434
+
384
435
 
385
436
  class ScaledVectorGlyphs(VectorGlyphs):
386
437
  """
@@ -421,10 +472,27 @@ class ScaledVectorGlyphs(VectorGlyphs):
421
472
  vis_filter.glyph.glyph_scale_size = self.scale
422
473
  vis_filter.glyph.n_glyphs = self.sampling_rate
423
474
  vis_filter.glyph.sampling_mode = vis_pb2.GLYPH_SAMPLING_MODE_EVERY_NTH
475
+ if not quantity_type._is_vector(self.field.quantity):
476
+ raise ValueError("ScaledVectorGyph: field must be a vector type")
424
477
  vis_filter.glyph.field.quantity_typ = self.field.quantity.value
425
478
  vis_filter.glyph.field.component = self.field.component.value
426
479
  return vis_filter
427
480
 
481
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
482
+ typ = filter.WhichOneof("value")
483
+ if typ != "glyph":
484
+ raise TypeError(f"Expected 'glyph', got {typ}")
485
+ glyph_typ = filter.glyph.WhichOneof("glyph_size")
486
+ if glyph_typ != "glyph_scale_size":
487
+ raise TypeError(f"Expected 'scaled size', got {typ}")
488
+ self.id = filter.id
489
+ self.name = filter.name
490
+ self.n_glyphs = filter.glyph.n_glyphs
491
+ self.scale = filter.glyph.glyph_scale_size
492
+ self.sampling_rate = filter.glyph.n_glyphs
493
+ self.field.quantity = VisQuantity(filter.glyph.field.quantity_typ)
494
+ self.field.component = FieldComponent(filter.glyph.field.component)
495
+
428
496
 
429
497
  class Threshold(Filter):
430
498
  """
@@ -497,6 +565,20 @@ class Threshold(Filter):
497
565
  vis_filter.threshold.strict = self.strict
498
566
  return vis_filter
499
567
 
568
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
569
+ typ = filter.WhichOneof("value")
570
+ if typ != "threshold":
571
+ raise TypeError(f"Expected 'threshold', got {typ}")
572
+ self.id = filter.id
573
+ self.name = filter.name
574
+ self.min_value = filter.threshold.range.min
575
+ self.max_value = filter.threshold.range.max
576
+ self.smooth = filter.threshold.smooth
577
+ self.invert = filter.threshold.invert
578
+ self.strict = filter.threshold.strict
579
+ self.field.quantity = VisQuantity(filter.threshold.field.quantity_typ)
580
+ self.field.component = FieldComponent(filter.threshold.field.component)
581
+
500
582
 
501
583
  class Streamlines(Filter):
502
584
  """
@@ -576,9 +658,29 @@ class RakeStreamlines(Streamlines):
576
658
  vis_filter.streamlines.max_length = self.max_length
577
659
  vis_filter.streamlines.rake.start.CopyFrom(_to_vector3(self.start)._to_proto())
578
660
  vis_filter.streamlines.rake.end.CopyFrom(_to_vector3(self.end)._to_proto())
661
+ if not quantity_type._is_vector(self.field.quantity):
662
+ raise ValueError("RakeStreamlines: field must be a vector type")
579
663
  vis_filter.streamlines.field.quantity_typ = self.field.quantity.value
580
664
  return vis_filter
581
665
 
666
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
667
+ typ = filter.WhichOneof("value")
668
+ if typ != "streamlines":
669
+ raise TypeError(f"Expected 'streamlines', got {typ}")
670
+ s_typ = filter.streamlines.WhichOneof("seed_type")
671
+ if s_typ != "rake":
672
+ raise TypeError(f"Expected 'rake streamlines', got {s_typ}")
673
+ self.id = filter.id
674
+ self.name = filter.name
675
+ self.n_streamlines = filter.streamlines.n_streamlines
676
+ self.max_length = filter.streamlines.max_length
677
+
678
+ self.start = Vector3()
679
+ self.start._from_proto(filter.streamlines.rake.start)
680
+ self.end = Vector3()
681
+ self.end._from_proto(filter.streamlines.rake.end)
682
+ self.field.quantity = VisQuantity(filter.streamlines.field.quantity_typ)
683
+
582
684
 
583
685
  class SurfaceStreamlines(Streamlines):
584
686
  """
@@ -694,9 +796,28 @@ class SurfaceStreamlines(Streamlines):
694
796
  raise ValueError("SurfaceStreamlines: need at least one surfaces specified.")
695
797
  for id in self._surface_names:
696
798
  vis_filter.streamlines.surface.surface_names.append(id)
799
+ if not quantity_type._is_vector(self.field.quantity):
800
+ raise ValueError("SurfaceStreamlines: field must be a vector type")
801
+ vis_filter.streamlines.field.component = self.field.component.value
697
802
  vis_filter.streamlines.field.quantity_typ = self.field.quantity.value
698
803
  return vis_filter
699
804
 
805
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
806
+ typ = filter.WhichOneof("value")
807
+ if typ != "streamlines":
808
+ raise TypeError(f"Expected 'streamlines', got {typ}")
809
+ s_typ = filter.streamlines.WhichOneof("seed_type")
810
+ if s_typ != "surface":
811
+ raise TypeError(f"Expected 'surface streamlines', got {s_typ}")
812
+ self.id = filter.id
813
+ self.name = filter.name
814
+ self.max_length = filter.streamlines.max_length
815
+ self.offset = filter.streamlines.surface.offset
816
+ self._surface_names.clear()
817
+ for s in filter.streamlines.surface.surface_names:
818
+ self._surface_names.append(s)
819
+ self.field.quantity = VisQuantity(filter.streamlines.field.quantity_typ)
820
+
700
821
 
701
822
  class SurfaceLIC(Filter):
702
823
  """
@@ -738,7 +859,7 @@ class SurfaceLIC(Filter):
738
859
 
739
860
  def add_surface(self, id: str) -> None:
740
861
  """
741
- Add a surface to generate compute the surface LIC on. Adding no
862
+ Add a surface to compute the surface LIC on. Adding no
742
863
  surfaces indicates that all surfaces will be used.
743
864
 
744
865
  Parameters
@@ -781,3 +902,22 @@ class SurfaceLIC(Filter):
781
902
  vis_filter.surface_lic.field.quantity_typ = self.field.quantity.value
782
903
  vis_filter.surface_lic.contrast = self.contrast
783
904
  return vis_filter
905
+
906
+ def _from_proto(self, filter: vis_pb2.Filter) -> None:
907
+ typ = filter.WhichOneof("value")
908
+ if typ != "surface_lic":
909
+ raise TypeError(f"Expected 'surface lic', got {typ}")
910
+ l_typ = filter.surface_lic.WhichOneof("lic_type")
911
+ if l_typ != "geometry":
912
+ # there is only one type of surface lic currently.
913
+ raise TypeError(f"Expected geometry', got {l_typ}")
914
+ self.id = filter.id
915
+ self.name = filter.name
916
+ self.contrast = filter.surface_lic.contrast
917
+ self._surface_names = []
918
+ for s in filter.surface_lic.geometry.surface_names:
919
+ self._surface_names.append(s)
920
+ if not quantity_type._is_vector(self.field.quantity):
921
+ raise ValueError("SurfaceLIC: field must be a vector type")
922
+ self.field.quantity = VisQuantity(filter.surface_lic.field.quantity_typ)
923
+ self.field.component = FieldComponent(filter.surface_lic.field.component)
@@ -1,7 +1,8 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
1
2
  from .display import DisplayAttributes
2
3
  from .filters import SurfaceStreamlines, Filter, SurfaceLIC
3
4
  from .._client import get_default_client
4
- from ..enum.vis_enums import EntityType, SceneMode
5
+ from luminarycloud.enum.vis_enums import EntityType, SceneMode
5
6
  from typing import TYPE_CHECKING, cast, Union
6
7
 
7
8
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
@@ -0,0 +1,38 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
+ import dataclasses as dc
3
+ from luminarycloud.types import Vector3, Vector3Like
4
+
5
+
6
+ @dc.dataclass
7
+ class Plane:
8
+ """
9
+ This class defines a plane.
10
+
11
+ .. warning:: This feature is experimental and may change or be removed in the future.
12
+
13
+ """
14
+
15
+ origin: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
16
+ """A point defined on the plane. Default: [0,0,0]."""
17
+ normal: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=0, z=0))
18
+ """The vector orthogonal to the plane. Default: [0,1,0]"""
19
+
20
+
21
+ @dc.dataclass
22
+ class Box:
23
+ """
24
+ This class defines a box used for filter such as box clip.
25
+
26
+ .. warning:: This feature is experimental and may change or be removed in the future.
27
+
28
+ """
29
+
30
+ center: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
31
+ """A point defined at the center of the box. Default: [0,0,0]."""
32
+ lengths: Vector3Like = dc.field(default_factory=lambda: Vector3(x=1, y=1, z=1))
33
+ """The the legnths of each side of the box. Default: [1,1,1]"""
34
+ angles: Vector3Like = dc.field(default_factory=lambda: Vector3(x=0, y=0, z=0))
35
+ """
36
+ The rotation of the box specified in Euler angles (degrees) and applied
37
+ in XYZ ordering. Default: [0,0,0]
38
+ """
@@ -0,0 +1,56 @@
1
+ # Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
2
+ import io
3
+ import requests
4
+ import string, random
5
+ import luminarycloud._proto.api.v0.luminarycloud.common.common_pb2 as common_pb2
6
+ from ..enum.vis_enums import RenderStatusType, VisQuantity
7
+ from .._proto.api.v0.luminarycloud.vis import vis_pb2
8
+ from .._client import get_default_client
9
+
10
+
11
+ def generate_id(prefix: str) -> str:
12
+ return prefix + "".join(random.choices(string.ascii_lowercase, k=24))
13
+
14
+
15
+ class _InternalToken:
16
+ """Marker class to control instantiation access for vis outputs."""
17
+
18
+ pass
19
+
20
+
21
+ def _download_file(file: common_pb2.File) -> "io.BytesIO":
22
+ buffer = io.BytesIO()
23
+ if file.signed_url:
24
+ response = requests.get(file.signed_url, stream=True)
25
+ response.raise_for_status()
26
+ for chunk in response.iter_content(chunk_size=8192):
27
+ buffer.write(chunk)
28
+ elif file.full_contents:
29
+ buffer.write(file.full_contents)
30
+ else:
31
+ raise Exception("file respose contains no data.")
32
+ # Reset buffer position to the beginning for reading
33
+ buffer.seek(0)
34
+ return buffer
35
+
36
+
37
+ def _get_status(project_id: str, extract_id: str) -> RenderStatusType:
38
+ """
39
+ Get a previously created set of render outputs by project and extract id. This
40
+ can be used by both extracts and images since the status type is just an alias.
41
+
42
+ .. warning:: This feature is experimental and may change or be removed in the future.
43
+
44
+ Parameters
45
+ ----------
46
+ project_id : str
47
+ The project id to of the extract.
48
+ extract_id: str
49
+ The id to of the extract.
50
+
51
+ """
52
+ req = vis_pb2.GetExtractRequest()
53
+ req.extract_id = extract_id
54
+ req.project_id = project_id
55
+ res: vis_pb2.GetExtractResponse = get_default_client().GetExtract(req)
56
+ return RenderStatusType(res.extract.status)