luminarycloud 0.14.1__py3-none-any.whl → 0.15.1__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 (287) hide show
  1. luminarycloud/__init__.py +5 -1
  2. luminarycloud/_client/client.py +6 -0
  3. luminarycloud/_helpers/__init__.py +1 -0
  4. luminarycloud/_helpers/_code_representation.py +135 -0
  5. luminarycloud/_helpers/_simulation_params_from_json.py +5 -1
  6. luminarycloud/_helpers/upload.py +31 -11
  7. luminarycloud/_helpers/warnings/deprecated.py +8 -10
  8. luminarycloud/_helpers/warnings/experimental.py +4 -4
  9. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +135 -110
  10. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +82 -10
  11. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
  12. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
  13. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.py +50 -28
  14. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +38 -2
  15. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.py +34 -0
  16. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.pyi +12 -0
  17. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +94 -0
  18. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +145 -0
  19. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +104 -0
  20. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +42 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +25 -25
  22. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -3
  23. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +162 -0
  24. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +254 -0
  25. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +203 -0
  26. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +74 -0
  27. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +155 -141
  28. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +24 -2
  29. luminarycloud/_proto/assistant/assistant_pb2.py +74 -74
  30. luminarycloud/_proto/assistant/assistant_pb2.pyi +22 -30
  31. luminarycloud/_proto/cad/boolean_pb2.py +8 -8
  32. luminarycloud/_proto/cad/boolean_pb2.pyi +34 -4
  33. luminarycloud/_proto/client/simulation_pb2.py +303 -294
  34. luminarycloud/_proto/client/simulation_pb2.pyi +26 -1
  35. luminarycloud/_proto/geometry/geometry_pb2.py +58 -58
  36. luminarycloud/_proto/geometry/geometry_pb2.pyi +58 -11
  37. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +42 -42
  38. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +2 -2
  39. luminarycloud/_proto/output/reference_values_pb2.py +5 -5
  40. luminarycloud/_proto/parametricworker/parametricworker_pb2.py +64 -31
  41. luminarycloud/_proto/parametricworker/parametricworker_pb2.pyi +64 -7
  42. luminarycloud/_proto/table/table_pb2.py +9 -8
  43. luminarycloud/_proto/table/table_pb2.pyi +7 -1
  44. luminarycloud/enum/__init__.py +2 -0
  45. luminarycloud/enum/geometry_status.py +28 -0
  46. luminarycloud/feature_modification.py +909 -0
  47. luminarycloud/geometry.py +64 -32
  48. luminarycloud/geometry_version.py +2 -2
  49. luminarycloud/mesh.py +11 -4
  50. luminarycloud/meshing/__init__.py +1 -0
  51. luminarycloud/meshing/mesh_generation_params.py +1 -1
  52. luminarycloud/meshing/metadata/__init__.py +6 -0
  53. luminarycloud/meshing/metadata/mesh_metadata.py +57 -0
  54. luminarycloud/meshing/sizing_strategy/sizing_strategies.py +2 -2
  55. luminarycloud/named_variable_set.py +10 -4
  56. luminarycloud/outputs/output_definitions.py +11 -10
  57. luminarycloud/params/enum/_enum_wrappers.py +77 -968
  58. luminarycloud/params/outputs/output.py +2 -1
  59. luminarycloud/params/simulation/__init__.py +16 -16
  60. luminarycloud/params/simulation/_lib.py +1 -67
  61. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +3 -2
  62. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +3 -2
  63. luminarycloud/params/simulation/adjoint_.py +4 -3
  64. luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -2
  65. luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -2
  66. luminarycloud/params/simulation/basic/gravity_.py +3 -2
  67. luminarycloud/params/simulation/body_frame_.py +3 -2
  68. luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +7 -6
  69. luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +7 -6
  70. luminarycloud/params/simulation/entity_relationships_.py +3 -2
  71. luminarycloud/params/simulation/general_.py +4 -3
  72. luminarycloud/params/simulation/material/fluid/__init__.py +4 -4
  73. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -2
  74. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +3 -2
  75. luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -2
  76. luminarycloud/params/simulation/material/fluid/material_model/__init__.py +1 -1
  77. luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +3 -2
  78. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +3 -2
  79. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +3 -2
  80. luminarycloud/params/simulation/material/fluid/material_model_.py +3 -2
  81. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/__init__.py +2 -2
  82. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +3 -2
  83. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +3 -2
  84. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +4 -3
  85. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -2
  86. luminarycloud/params/simulation/material/fluid/viscosity_model/__init__.py +1 -1
  87. luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +3 -2
  88. luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +3 -2
  89. luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +4 -3
  90. luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -2
  91. luminarycloud/params/simulation/material/material_fluid_.py +7 -6
  92. luminarycloud/params/simulation/material/material_solid_.py +4 -3
  93. luminarycloud/params/simulation/material_entity_.py +9 -8
  94. luminarycloud/params/simulation/monitor_plane_.py +5 -4
  95. luminarycloud/params/simulation/motion_data/__init__.py +1 -1
  96. luminarycloud/params/simulation/motion_data/frame_transforms/__init__.py +1 -1
  97. luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +5 -4
  98. luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +5 -4
  99. luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +5 -4
  100. luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -2
  101. luminarycloud/params/simulation/motion_data/motion_type/__init__.py +1 -1
  102. luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +5 -4
  103. luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +5 -4
  104. luminarycloud/params/simulation/motion_data/motion_type_.py +3 -2
  105. luminarycloud/params/simulation/motion_data_.py +6 -5
  106. luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -2
  107. luminarycloud/params/simulation/output_.py +3 -2
  108. luminarycloud/params/simulation/particle_group/particle_group_type/__init__.py +1 -1
  109. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +4 -3
  110. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +4 -3
  111. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -2
  112. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +7 -6
  113. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -2
  114. luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +5 -4
  115. luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +5 -4
  116. luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -2
  117. luminarycloud/params/simulation/particle_group_.py +4 -3
  118. luminarycloud/params/simulation/physics/__init__.py +3 -3
  119. luminarycloud/params/simulation/physics/fluid/__init__.py +9 -9
  120. luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +3 -2
  121. luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -2
  122. luminarycloud/params/simulation/physics/fluid/boundary_conditions/__init__.py +5 -5
  123. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +5 -4
  124. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/__init__.py +3 -3
  125. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +7 -6
  126. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -4
  127. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +5 -4
  128. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +6 -5
  129. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +5 -4
  130. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +6 -5
  131. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +8 -7
  132. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/__init__.py +1 -1
  133. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -4
  134. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +3 -2
  135. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +3 -2
  136. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +3 -2
  137. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -2
  138. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +6 -5
  139. luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +5 -4
  140. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +3 -2
  141. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/__init__.py +1 -1
  142. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +3 -2
  143. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +3 -2
  144. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/__init__.py +1 -1
  145. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +3 -2
  146. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -2
  147. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +3 -2
  148. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -2
  149. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -2
  150. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +7 -6
  151. luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -2
  152. luminarycloud/params/simulation/physics/fluid/initialization/__init__.py +2 -2
  153. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +5 -4
  154. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +5 -4
  155. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -4
  156. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +3 -2
  157. luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -2
  158. luminarycloud/params/simulation/physics/fluid/physical_behavior/__init__.py +1 -1
  159. luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +8 -7
  160. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/__init__.py +1 -1
  161. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/__init__.py +2 -2
  162. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -2
  163. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +8 -7
  164. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -3
  165. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +5 -4
  166. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -2
  167. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -2
  168. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -2
  169. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +9 -8
  170. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +4 -3
  171. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -3
  172. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -2
  173. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -2
  174. luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +5 -4
  175. luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +3 -2
  176. luminarycloud/params/simulation/physics/fluid/solution_controls/__init__.py +1 -1
  177. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -2
  178. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -2
  179. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +3 -2
  180. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -2
  181. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +7 -6
  182. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -2
  183. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/__init__.py +1 -1
  184. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +3 -2
  185. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +3 -2
  186. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -2
  187. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +5 -4
  188. luminarycloud/params/simulation/physics/fluid/spatial_discretization/__init__.py +1 -1
  189. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/__init__.py +1 -1
  190. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -2
  191. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +3 -2
  192. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +3 -2
  193. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +3 -2
  194. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -2
  195. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -2
  196. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +3 -2
  197. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -2
  198. luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +5 -4
  199. luminarycloud/params/simulation/physics/fluid/turbulence/__init__.py +2 -2
  200. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/__init__.py +1 -1
  201. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -2
  202. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -2
  203. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -2
  204. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -2
  205. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +3 -2
  206. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -2
  207. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -2
  208. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +6 -5
  209. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +3 -2
  210. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -2
  211. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -2
  212. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +6 -5
  213. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/__init__.py +2 -2
  214. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +3 -2
  215. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +3 -2
  216. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +3 -2
  217. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +3 -2
  218. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +3 -2
  219. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -2
  220. luminarycloud/params/simulation/physics/fluid/turbulence_.py +6 -5
  221. luminarycloud/params/simulation/physics/fluid_.py +12 -13
  222. luminarycloud/params/simulation/physics/heat/__init__.py +4 -4
  223. luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -2
  224. luminarycloud/params/simulation/physics/heat/boundary_conditions/__init__.py +2 -2
  225. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -4
  226. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +5 -4
  227. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +5 -4
  228. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +5 -4
  229. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +5 -4
  230. luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +5 -4
  231. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/__init__.py +1 -1
  232. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +3 -2
  233. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -3
  234. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -2
  235. luminarycloud/params/simulation/physics/heat/heat_source_.py +6 -5
  236. luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +5 -4
  237. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +5 -4
  238. luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -2
  239. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +4 -3
  240. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -2
  241. luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +4 -3
  242. luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +3 -2
  243. luminarycloud/params/simulation/physics/heat_.py +9 -8
  244. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/__init__.py +1 -1
  245. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -2
  246. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -2
  247. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -2
  248. luminarycloud/params/simulation/physics/periodic_pair_.py +4 -3
  249. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/__init__.py +1 -1
  250. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -2
  251. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +9 -8
  252. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +3 -2
  253. luminarycloud/params/simulation/physics_.py +7 -6
  254. luminarycloud/params/simulation/simulation_param_.py +12 -13
  255. luminarycloud/params/simulation/sliding_interfaces_.py +8 -7
  256. luminarycloud/params/simulation/surface_name_.py +3 -2
  257. luminarycloud/params/simulation/time/__init__.py +2 -2
  258. luminarycloud/params/simulation/time/compute_statistics/__init__.py +1 -1
  259. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -2
  260. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -2
  261. luminarycloud/params/simulation/time/compute_statistics_.py +3 -2
  262. luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -2
  263. luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -2
  264. luminarycloud/params/simulation/time/time_marching_.py +3 -2
  265. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -2
  266. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +3 -2
  267. luminarycloud/params/simulation/time/time_step_ramp_.py +3 -2
  268. luminarycloud/params/simulation/time_.py +6 -5
  269. luminarycloud/params/simulation/volume_entity_.py +5 -4
  270. luminarycloud/physics_ai/__init__.py +8 -0
  271. luminarycloud/physics_ai/architectures.py +38 -0
  272. luminarycloud/physics_ai/models.py +42 -0
  273. luminarycloud/project.py +39 -19
  274. luminarycloud/reference_values.py +20 -3
  275. luminarycloud/simulation.py +8 -3
  276. luminarycloud/simulation_param.py +50 -27
  277. luminarycloud/simulation_template.py +85 -14
  278. luminarycloud/types/adfloat.py +19 -1
  279. luminarycloud/types/ids.py +2 -0
  280. luminarycloud/vis/__init__.py +0 -3
  281. luminarycloud/vis/display.py +1 -0
  282. luminarycloud/vis/interactive_scene.py +42 -9
  283. luminarycloud/vis/visualization.py +101 -20
  284. luminarycloud/volume_selection.py +5 -5
  285. {luminarycloud-0.14.1.dist-info → luminarycloud-0.15.1.dist-info}/METADATA +2 -2
  286. {luminarycloud-0.14.1.dist-info → luminarycloud-0.15.1.dist-info}/RECORD +287 -271
  287. {luminarycloud-0.14.1.dist-info → luminarycloud-0.15.1.dist-info}/WHEEL +0 -0
@@ -8,7 +8,7 @@ from difflib import Differ
8
8
  from .enum import (
9
9
  TableType,
10
10
  )
11
- from ._helpers.warnings import experimental
11
+ from ._helpers.warnings import experimental, deprecated
12
12
  from ._client import get_default_client
13
13
  from ._helpers._simulation_params_from_json import simulation_params_from_json_path
14
14
  from ._helpers._timestamp_to_datetime import timestamp_to_datetime
@@ -60,8 +60,6 @@ class SimulationTemplate(ProtoWrapperBase):
60
60
  "Simulation template ID."
61
61
  name: str
62
62
  "Simulation name."
63
- parameters: clientpb.SimulationParam
64
- "Simulation description."
65
63
 
66
64
  _proto: simtemplatepb.SimulationTemplate
67
65
 
@@ -77,7 +75,7 @@ class SimulationTemplate(ProtoWrapperBase):
77
75
  self,
78
76
  *,
79
77
  name: Optional[str] = None,
80
- parameters: Optional[Union[clientpb.SimulationParam, SimulationParam, PathLike]] = None,
78
+ parameters: Optional[SimulationParam | PathLike] = None,
81
79
  ) -> None:
82
80
  """
83
81
  Update simulation template.
@@ -92,6 +90,17 @@ class SimulationTemplate(ProtoWrapperBase):
92
90
  changes applied by the backend (server), for example due to presets. Any differences
93
91
  between input and result are printed on screen.
94
92
  """
93
+ return self._update(name=name, parameters=parameters)
94
+
95
+ def _update(
96
+ self,
97
+ *,
98
+ name: Optional[str] = None,
99
+ parameters: Optional[SimulationParam | clientpb.SimulationParam | PathLike] = None,
100
+ ) -> None:
101
+ """
102
+ Update simulation template. See `update()` for more details.
103
+ """
95
104
  req = simtemplatepb.UpdateSimulationTemplateRequest(id=self.id)
96
105
 
97
106
  if name is not None:
@@ -110,12 +119,14 @@ class SimulationTemplate(ProtoWrapperBase):
110
119
  # Table references are manipulated via the simulation template, hence we need to persist
111
120
  # them when we update the parameters.
112
121
  param_proto.table_references.clear()
113
- for k, v in self.parameters.table_references.items():
122
+ for k, v in self._proto.parameters.table_references.items():
114
123
  param_proto.table_references[k].CopyFrom(v)
115
124
 
116
125
  req.parameters.CopyFrom(param_proto)
117
126
 
118
- res = get_default_client().UpdateSimulationTemplate(req)
127
+ res: simtemplatepb.UpdateSimulationTemplateResponse = (
128
+ get_default_client().UpdateSimulationTemplate(req)
129
+ )
119
130
  self._proto = res.simulation_template
120
131
 
121
132
  def print_diff(
@@ -134,11 +145,11 @@ class SimulationTemplate(ProtoWrapperBase):
134
145
  # Show any inconsistency after the update and update the input argument.
135
146
  if isinstance(parameters, SimulationParam):
136
147
  old_param = deepcopy(parameters)
137
- parameters._from_proto(self.parameters)
148
+ parameters._from_proto(self._proto.parameters)
138
149
  print_diff(old_param, parameters)
139
150
  elif isinstance(parameters, clientpb.SimulationParam):
140
- print_diff(parameters, self.parameters)
141
- parameters.CopyFrom(self.parameters)
151
+ print_diff(parameters, self._proto.parameters)
152
+ parameters.CopyFrom(self._proto.parameters)
142
153
 
143
154
  def delete(self) -> None:
144
155
  """
@@ -147,12 +158,17 @@ class SimulationTemplate(ProtoWrapperBase):
147
158
  req = simtemplatepb.DeleteSimulationTemplateRequest(id=self.id)
148
159
  get_default_client().DeleteSimulationTemplate(req)
149
160
 
161
+ def get_parameters(self) -> SimulationParam:
162
+ return self.get_simulation_param()
163
+
164
+ @deprecated(
165
+ "Use get_parameters() instead. This method will be removed in a future release.",
166
+ )
150
167
  def get_simulation_param(self) -> SimulationParam:
151
168
  """
152
- Returns the simulation parameters associated with this template to allow customization of
153
- the parameters.
169
+ Returns a copy of the simulation parameters associated with this template.
154
170
  """
155
- return SimulationParam.from_proto(self.parameters)
171
+ return SimulationParam.from_proto(self._proto.parameters)
156
172
 
157
173
  def list_tables(
158
174
  self,
@@ -172,7 +188,7 @@ class SimulationTemplate(ProtoWrapperBase):
172
188
  List of tables.
173
189
  """
174
190
  res: list[RectilinearTable] = []
175
- for id, metadata in self.parameters.table_references.items():
191
+ for id, metadata in self._proto.parameters.table_references.items():
176
192
  if table_type is None or table_type.value == metadata.table_type:
177
193
  res.append(
178
194
  RectilinearTable(
@@ -357,7 +373,7 @@ class SimulationTemplate(ProtoWrapperBase):
357
373
  iterations_to_consider: int | None = None,
358
374
  ) -> StoppingCondition:
359
375
  """
360
- Create a stopping condition on an output definition, or update it if the stopping condition
376
+ Create a stopping condition on an output definition, or update it if the output definition
361
377
  already has one.
362
378
 
363
379
  While this API will prevent the creation of multiple stopping conditions on the same output
@@ -442,6 +458,61 @@ class SimulationTemplate(ProtoWrapperBase):
442
458
  self.id, max_iterations, max_physical_time, max_inner_iterations, stop_on_any
443
459
  )
444
460
 
461
+ def to_code(self, hide_defaults: bool = True) -> str:
462
+ """
463
+ Returns the python code that generates an identical SimulationTemplate object.
464
+ By default parameters with default values are omitted, this change be changed with
465
+ hide_defaults=False.
466
+ """
467
+ param_code = self.get_simulation_param().to_code(hide_defaults)
468
+ code, param_code = param_code.split("\n\n\n")
469
+
470
+ # Modify the header note included by SimulationParam.to_code.
471
+ code = code.replace("SimulationParam", "SimulationTemplate")
472
+ code += "\n\n\n"
473
+ code += '# Create a new simulation template or modify the "Setup" template.\n'
474
+ code += 'project = get_project("...")\n'
475
+ code += f"# template = project.create_simulation_template(name={self.name})\n"
476
+ code += "template = project.list_simulation_templates()[0]\n\n"
477
+
478
+ code += "# Define the simulation parameters.\n"
479
+ code += param_code
480
+ code += "\n# Update the simulation template with the parameters.\n"
481
+ code += "template.update(parameters=obj)\n\n"
482
+
483
+ code += "# Define the outputs for monitoring simulations.\n"
484
+ code += "# This assumes the outputs do not exist yet, to modify an exiting output use\n"
485
+ code += "# update_output_definition instead of create_output_definition, the former\n"
486
+ code += "# requires the definition ID, that is obtained from list_output_definitions.\n"
487
+ output_definitions = self.list_output_definitions()
488
+ for i, definition in enumerate(output_definitions):
489
+ if i == 0:
490
+ code += "output_list = []\n"
491
+ output_code = definition._to_code_helper("new_output", hide_defaults)
492
+ for line in output_code.split("\n"):
493
+ # Omit ID because we are generating for create_output_definition.
494
+ if line and not line.startswith("new_output.id"):
495
+ code += f"{line}\n"
496
+ code += "output_list.append(template.create_output_definition(new_output))\n\n"
497
+
498
+ code += "# Define the basic and output-based stopping conditions.\n"
499
+ gsc = self.get_general_stopping_conditions()
500
+ code += f"template.update_general_stopping_conditions({gsc.max_iterations}, "
501
+ code += f"{gsc.max_physical_time}, {gsc.max_inner_iterations}, {gsc.stop_on_any})\n"
502
+
503
+ for i, sc in enumerate(self.list_stopping_conditions()):
504
+ if i == 0:
505
+ code += "\n# Output-based conditions require the ID of the associated output.\n"
506
+ # Find the old output to use the new ID created by create_output_definition.
507
+ for j, od in enumerate(output_definitions):
508
+ if sc.output_definition_id == od.id:
509
+ code += f"template.create_or_update_stopping_condition(output_list[{j}].id, "
510
+ code += f"{sc.threshold}, {sc.start_at_iteration}, {sc.averaging_iterations}, "
511
+ code += f"{sc.iterations_to_consider})\n"
512
+ break
513
+
514
+ return code
515
+
445
516
 
446
517
  def get_simulation_template(id: SimulationTemplateID) -> SimulationTemplate:
447
518
  """
@@ -36,6 +36,15 @@ class FirstOrderAdFloat(AdFloat):
36
36
  def adjoint(self) -> tuple[float, ...]:
37
37
  return self._adjoint
38
38
 
39
+ def __eq__(self, other: Any) -> bool:
40
+ if not isinstance(other, FirstOrderAdFloat):
41
+ return False
42
+ return (
43
+ float(self) == float(other)
44
+ and self.tangent == other.tangent
45
+ and self.adjoint == other.adjoint
46
+ )
47
+
39
48
  @staticmethod
40
49
  def _from_proto(proto: FirstOrderAdType) -> "FirstOrderAdFloat":
41
50
  return FirstOrderAdFloat(
@@ -53,7 +62,7 @@ class SecondOrderAdFloat(AdFloat):
53
62
  _adjoint: tuple[FirstOrderAdFloat, ...]
54
63
 
55
64
  def __new__(cls, value: FirstOrderAdFloat, *_: Any) -> "SecondOrderAdFloat":
56
- return super().__new__(cls, value)
65
+ return super().__new__(cls, float(value))
57
66
 
58
67
  def __init__(
59
68
  self,
@@ -83,6 +92,15 @@ class SecondOrderAdFloat(AdFloat):
83
92
  def adjoint(self) -> tuple[FirstOrderAdFloat, ...]:
84
93
  return self._adjoint
85
94
 
95
+ def __eq__(self, other: Any) -> bool:
96
+ if not isinstance(other, SecondOrderAdFloat):
97
+ return False
98
+ return (
99
+ self._value == other._value
100
+ and self._tangent == other._tangent
101
+ and self._adjoint == other._adjoint
102
+ )
103
+
86
104
  @staticmethod
87
105
  def _from_proto(proto: SecondOrderAdType) -> "SecondOrderAdFloat":
88
106
  return SecondOrderAdFloat(
@@ -9,3 +9,5 @@ SolutionID = NewType("SolutionID", str)
9
9
  SimulationTemplateID = NewType("SimulationTemplateID", str)
10
10
  GeometryFeatureID = NewType("GeometryFeatureID", str)
11
11
  NamedVariableSetID = NewType("NamedVariableSetID", str)
12
+ PhysicsAiArchitectureID = NewType("PhysicsAiArchitectureID", str)
13
+ PhysicsAiModelID = NewType("PhysicsAiModelID", str)
@@ -37,6 +37,3 @@ from .display import (
37
37
  from .interactive_scene import (
38
38
  InteractiveScene as InteractiveScene,
39
39
  )
40
-
41
- from ..enum.vis_enums import *
42
- from ..types.vector3 import Vector3, Vector3Like
@@ -185,4 +185,5 @@ class ColorMap:
185
185
  res.height = self.appearance.height
186
186
  res.lower_left_anchor_location.x = self.appearance.lower_left_x
187
187
  res.lower_left_anchor_location.y = self.appearance.lower_left_y
188
+ res.text_size = self.appearance.text_size
188
189
  return res
@@ -1,13 +1,16 @@
1
1
  from .display import DisplayAttributes
2
- from .filters import SurfaceStreamlines, Filter
2
+ from .filters import SurfaceStreamlines, Filter, SurfaceLIC
3
3
  from .._client import get_default_client
4
4
  from ..enum.vis_enums import EntityType, SceneMode
5
- from typing import TYPE_CHECKING, cast
5
+ from typing import TYPE_CHECKING, cast, Union
6
6
 
7
7
  from .._proto.api.v0.luminarycloud.vis import vis_pb2
8
8
 
9
9
  if TYPE_CHECKING:
10
- from .visualization import Scene, LookAtCamera
10
+ from .visualization import Scene, LookAtCamera, ColorMap
11
+ from ..geometry import Geometry
12
+ from ..mesh import Mesh
13
+ from ..solution import Solution
11
14
 
12
15
  try:
13
16
  import luminarycloud_jupyter as lcj
@@ -32,7 +35,8 @@ class InteractiveScene:
32
35
  if not lcj:
33
36
  raise ImportError("InteractiveScene requires luminarycloud[jupyter] to be installed")
34
37
  self.widget = lcj.LCVisWidget(scene_mode=mode)
35
- self.set_scene(scene)
38
+ self._scene = scene
39
+ self.set_scene(scene, False)
36
40
 
37
41
  def _ipython_display_(self) -> None:
38
42
  """
@@ -41,7 +45,10 @@ class InteractiveScene:
41
45
  """
42
46
  self.widget._ipython_display_()
43
47
 
44
- def set_scene(self, scene: "Scene") -> None:
48
+ def set_scene(self, scene: "Scene", isComparator: bool) -> None:
49
+ # TODO(matt): we could make isCompartor and index so we could compare
50
+ # more than two scenes at once.
51
+
45
52
  # Import here to avoid circular import issue
46
53
  from .visualization import LookAtCamera
47
54
 
@@ -73,6 +80,12 @@ class InteractiveScene:
73
80
  bad_ids = scene._validate_surfaces_and_tags(streamlines._surface_names)
74
81
  if len(bad_ids) != 0:
75
82
  raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
83
+ if isinstance(filter, SurfaceLIC):
84
+ # Validate surfaces names
85
+ lic = cast(SurfaceLIC, filter)
86
+ bad_ids = scene._validate_surfaces_and_tags(lic._surface_names)
87
+ if len(bad_ids) != 0:
88
+ raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
76
89
 
77
90
  if isinstance(filter, Filter):
78
91
  vis_filter: vis_pb2.Filter = filter._to_proto()
@@ -88,8 +101,10 @@ class InteractiveScene:
88
101
 
89
102
  # TODO: would be nice to print/report some download progress info
90
103
  # This can be done on the app frontend side now that the download
91
- # is moved there.
92
- self.widget.set_workspace_state(scene, resp)
104
+ # is moved there. Matt: this would be a lot of work. The current vis service
105
+ # call used in the backend doesn't use the streaming version. Further, there is
106
+ # a lot of extra code to manage the streaming callbacks.
107
+ self.widget.set_workspace_state(scene, resp, isComparator)
93
108
 
94
109
  # Sync display attributes and visibilities for surfaces
95
110
  self.set_display_attributes(_SOURCE_FILTER_ID, scene.global_display_attrs)
@@ -107,6 +122,10 @@ class InteractiveScene:
107
122
  set_camera = True
108
123
  self.set_camera(c)
109
124
 
125
+ # Set any color maps we have. TODO(matt): only a few attributes are connected atm.
126
+ for color_map in scene._color_maps:
127
+ self.set_color_map(color_map)
128
+
110
129
  # If we don't have an initial camera to use, reset the camera after loading
111
130
  # the workspace state
112
131
  if not set_camera:
@@ -125,12 +144,14 @@ class InteractiveScene:
125
144
  self.widget.reset_camera()
126
145
 
127
146
  def set_camera(self, camera: "LookAtCamera") -> None:
128
- # Clear the camera pan, we should add this to the SDK later
129
- self.widget.camera_pan = [0, 0]
147
+ self.widget.camera_pan = [camera.pan_x, camera.pan_y]
130
148
  self.widget.camera_position = [camera.position[0], camera.position[1], camera.position[2]]
131
149
  self.widget.camera_look_at = [camera.look_at[0], camera.look_at[1], camera.look_at[2]]
132
150
  self.widget.camera_up = [camera.up[0], camera.up[1], camera.up[2]]
133
151
 
152
+ def set_color_map(self, color_map: "ColorMap") -> None:
153
+ self.widget.set_color_map(color_map)
154
+
134
155
  def get_camera(self) -> "LookAtCamera":
135
156
  # Import here to avoid circular import issue
136
157
  from .visualization import LookAtCamera
@@ -139,7 +160,19 @@ class InteractiveScene:
139
160
  camera.position = self.widget.camera_position
140
161
  camera.look_at = self.widget.camera_look_at
141
162
  camera.up = self.widget.camera_up
163
+ # Immediately after creation, the widget's camera_pan is empty, so avoid going out of bounds
164
+ # and report 0 which is what it would be anyway
165
+ camera.pan_x = self.widget.camera_pan[0] if self.widget.camera_pan else 0
166
+ camera.pan_y = self.widget.camera_pan[1] if self.widget.camera_pan else 0
142
167
  return camera
143
168
 
144
169
  def set_triad_visible(self, visible: bool) -> None:
145
170
  self.widget.set_triad_visible(visible)
171
+
172
+ def compare(self, entity: Union["Geometry", "Mesh", "Solution"]) -> None:
173
+ # The entity can be a Geometry, Mesh, or Solution and is checked by the
174
+ # clone method. This can raise error if the scenes are incompatiable.
175
+ # This happens when tags or surface ids aren't shared or if we try to
176
+ # compare two different types of entities.
177
+ comparison_scene = self._scene.clone(entity)
178
+ self.set_scene(comparison_scene, True)
@@ -1,27 +1,29 @@
1
- from .._proto.api.v0.luminarycloud.vis import vis_pb2
1
+ import dataclasses as dc
2
+ import io
3
+ import json
4
+ import logging
5
+ import copy
6
+ from time import sleep, time
7
+ from typing import Dict, List, Tuple, cast
8
+
2
9
  import luminarycloud._proto.api.v0.luminarycloud.common.common_pb2 as common_pb2
10
+ import requests
11
+ from luminarycloud.params.simulation.physics.fluid.boundary_conditions import Farfield
12
+ from luminarycloud.types import Vector3, Vector3Like
13
+
3
14
  from .._client import get_default_client
4
- from ..solution import Solution
5
- from ..mesh import get_mesh_metadata, Mesh, get_mesh
6
- from ..geometry import Geometry, get_geometry, Tag
15
+ from .._helpers._get_project_id import _get_project_id
16
+ from .._proto.api.v0.luminarycloud.vis import vis_pb2
7
17
  from ..enum.vis_enums import *
8
- from ..enum.quantity_type import QuantityType
18
+ from ..exceptions import NotFoundError
19
+ from ..geometry import Geometry, get_geometry
20
+ from ..mesh import Mesh, get_mesh, get_mesh_metadata
9
21
  from ..simulation import get_simulation
10
- from .display import DisplayAttributes, ColorMap, Field, ColorMapAppearance
11
- from .filters import Filter, PlaneClip, Slice, BoxClip, SurfaceStreamlines
12
- from luminarycloud.types import Vector3, Vector3Like
22
+ from ..solution import Solution
13
23
  from ..types.vector3 import _to_vector3
14
- from .._helpers._get_project_id import _get_project_id
15
- from ..exceptions import NotFoundError
24
+ from .display import ColorMap, ColorMapAppearance, DisplayAttributes, Field
25
+ from .filters import BoxClip, Filter, PlaneClip, Slice, SurfaceStreamlines, SurfaceLIC
16
26
  from .interactive_scene import InteractiveScene
17
- import io
18
- import json
19
- from luminarycloud._proto.client import simulation_pb2 as clientpb
20
- from typing import List, Tuple, cast, Union, Dict
21
- import requests
22
- from time import time, sleep
23
- import logging
24
- import dataclasses as dc
25
27
 
26
28
  logger = logging.getLogger(__name__)
27
29
 
@@ -87,6 +89,20 @@ class LookAtCamera:
87
89
  """ The width of the output image in pixels. Default: 1024 """
88
90
  height: int = 1024
89
91
  """ The height of the output image in pixels. Default: 1024 """
92
+ pan_x: float = 0
93
+ """
94
+ Pan the camera in the x direction (right). This is a world space value defined in
95
+ the camera coordinate system. Pan is not typically directly set by the user,
96
+ but pan is useful for reproducing camera parameters from an interactive
97
+ scene where pan is used (i.e., control + middle mouse).
98
+ """
99
+ pan_y: float = 0
100
+ """
101
+ Pan the camera in the y direction (up). This is a world space value defined in
102
+ the camera coordinate system. Pan is not typically directly set by the user,
103
+ but pan is useful for reproducing camera parameters from an interactive
104
+ scene where pan is used (i.e., control + middle mouse).
105
+ """
90
106
 
91
107
 
92
108
  class _InternalToken:
@@ -414,8 +430,8 @@ class Scene:
414
430
  params = simulation.get_parameters()
415
431
  for physics in params.physics:
416
432
  if physics.fluid:
417
- for bc in physics.fluid.boundary_conditions_fluid:
418
- if bc.physical_boundary == clientpb.PhysicalBoundary.FARFIELD:
433
+ for bc in physics.fluid.boundary_conditions:
434
+ if isinstance(bc, Farfield):
419
435
  for bc_surface in bc.surfaces:
420
436
  self._far_field_boundary_ids.append(bc_surface)
421
437
 
@@ -547,6 +563,8 @@ class Scene:
547
563
  out_camera.look_at.position.CopyFrom(_to_vector3(lookat.position)._to_proto())
548
564
  out_camera.look_at.up.CopyFrom(_to_vector3(lookat.up)._to_proto())
549
565
  out_camera.look_at.look_at.CopyFrom(_to_vector3(lookat.look_at)._to_proto())
566
+ out_camera.look_at.pan.x = lookat.pan_x
567
+ out_camera.look_at.pan.y = lookat.pan_y
550
568
  elif isinstance(camera, DirectionalCamera):
551
569
  out_camera.direction = camera.direction.value
552
570
  if camera.zoom_in <= 0 or camera.zoom_in > 1:
@@ -589,6 +607,12 @@ class Scene:
589
607
  bad_ids = self._validate_surfaces_and_tags(streamlines._surface_names)
590
608
  if len(bad_ids) != 0:
591
609
  raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
610
+ if isinstance(filter, SurfaceLIC):
611
+ # Validate surfaces names
612
+ lic = cast(SurfaceLIC, filter)
613
+ bad_ids = self._validate_surfaces_and_tags(lic._surface_names)
614
+ if len(bad_ids) != 0:
615
+ raise ValueError(f"SurfaceLIC has invalid surfaces: {bad_ids}")
592
616
 
593
617
  if isinstance(filter, Filter):
594
618
  vis_filter: vis_pb2.Filter = filter._to_proto()
@@ -633,6 +657,7 @@ class Scene:
633
657
  # processing them above
634
658
  cmap.appearance = ColorMapAppearance()
635
659
  auto_cmaps.append(cmap)
660
+
636
661
  if len(auto_cmaps) != 0:
637
662
  # These are all default contructed, so they all have the same dimentions.
638
663
  # All the coordinates are in normalized device space.
@@ -726,6 +751,62 @@ class Scene:
726
751
  self._interactive_scene = InteractiveScene(self, mode=scene_mode)
727
752
  return self._interactive_scene
728
753
 
754
+ def clone(self, entity: Geometry | Mesh | Solution) -> "Scene":
755
+ """
756
+ Clone this scene is based on a new entity. The new entity must be of
757
+ the same type as the previous one. For example, you can't swap a scene
758
+ based on a geometry with a solution. This is a deep copy operation.
759
+ Both entities must be compatible with one another, meaning they share tags
760
+ or surfaces ids used for setting surface visibilities and some filters like
761
+ surface streamlines and surface LIC.
762
+ """
763
+
764
+ entity_type: EntityType
765
+ if isinstance(entity, Solution):
766
+ entity_type = EntityType.SIMULATION
767
+ elif isinstance(entity, Mesh):
768
+ entity_type = EntityType.MESH
769
+ elif isinstance(entity, Geometry):
770
+ entity_type = EntityType.GEOMETRY
771
+ else:
772
+ raise TypeError(
773
+ f"Swap expected Solution, Mesh or Geometry, got {type(entity).__name__}"
774
+ )
775
+
776
+ if entity_type != self._entity_type:
777
+ raise TypeError(
778
+ f"Swap entity type mismatch expected {self._entity_type} got {entity_type}"
779
+ )
780
+
781
+ cloned = Scene(entity)
782
+ cloned.global_display_attrs = copy.deepcopy(self.global_display_attrs)
783
+ cloned.triad_visible = self.triad_visible
784
+ cloned.axes_grid_visible = self.axes_grid_visible
785
+ cloned.auto_color_map_annotations = self.auto_color_map_annotations
786
+ cloned.background_color = copy.deepcopy(self.background_color)
787
+ cloned.supersampling = self.supersampling
788
+ # TODO(matt): This is really meant for interactive case comparison. The label field in each
789
+ # camera could contain information specific to the previous scene. We could skip this and force
790
+ # the user to add more cameras.
791
+ cloned._cameras = copy.deepcopy(self._cameras)
792
+ # TODO(matt): for filters we could do some validation here to make sure that anything with
793
+ # surfaces (e.g., LIC and surface streamlines) have valid ids in them.
794
+ cloned._filters = copy.deepcopy(self._filters)
795
+
796
+ cloned._color_maps = copy.deepcopy(self._color_maps)
797
+ # TODO(matt): depending on what we want to do here, we could have a flag
798
+ # to ignore incompatible visibilitites. Filter surfaces are validated
799
+ # when the request is made. We could also skip these checks if they are
800
+ # based on the same geometry or mesh.
801
+ # Now loop through the surface visibilies and make sure they are compatible with the new
802
+ # scene based on the entity.
803
+ for id, visible in self._surface_visibilities.items():
804
+ if id in cloned._surface_ids or id in cloned._tag_ids:
805
+ cloned._surface_visibilities[id] = visible
806
+ else:
807
+ raise ValueError(f"Scene.clone: id {id} not present in tags or surface ids")
808
+ return cloned
809
+
729
810
 
730
811
  def get_render(project_id: str, extract_id: str) -> RenderOutput:
731
812
  """
@@ -209,7 +209,7 @@ class VolumeSelection:
209
209
 
210
210
  def subtract(
211
211
  self,
212
- tool_volumes: list[Volume],
212
+ tool_volumes: Iterable[Volume],
213
213
  *,
214
214
  propagate_tags: bool = False,
215
215
  feature_name: str = "Subtract",
@@ -221,7 +221,7 @@ class VolumeSelection:
221
221
 
222
222
  Parameters
223
223
  ----------
224
- tool_volumes : list[Volume]
224
+ tool_volumes : Iterable[Volume]
225
225
  The volumes to subtract from the selected volumes.
226
226
  propagate_tags : bool
227
227
  Whether to propagate the tool volume tags to the surfaces created by the subtraction.
@@ -265,7 +265,7 @@ class VolumeSelection:
265
265
 
266
266
  def chop(
267
267
  self,
268
- tool_volumes: list[Volume],
268
+ tool_volumes: Iterable[Volume],
269
269
  *,
270
270
  propagate_tags: bool = False,
271
271
  feature_name: str = "Chop",
@@ -278,7 +278,7 @@ class VolumeSelection:
278
278
 
279
279
  Parameters
280
280
  ----------
281
- tool_volumes : list[Volume]
281
+ tool_volumes : Iterable[Volume]
282
282
  The volumes to chop the selected volumes with.
283
283
  propagate_tags : bool
284
284
  Whether to propagate the tool volume tags to the surfaces created by the chop.
@@ -460,7 +460,7 @@ class VolumeSelection:
460
460
  self,
461
461
  resolution_min: Optional[float] = None,
462
462
  resolution_max: Optional[float] = None,
463
- tool: Optional[Iterator[VolumeSelection]] = None,
463
+ tool: Optional[Iterable[Volume]] = None,
464
464
  *,
465
465
  feature_name: str = "Shrinkwrap",
466
466
  ) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luminarycloud
3
- Version: 0.14.1
3
+ Version: 0.15.1
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/
@@ -45,6 +45,6 @@ and functionality may change significantly).
45
45
  import luminarycloud as lc
46
46
  project = lc.create_project("NACA 0012", "My first SDK project.")
47
47
  mesh = project.upload_mesh("./airfoil.lcmesh")
48
- sim_template = project.create_simulation_template("test template", "./simulation_template.json")
48
+ sim_template = project.create_simulation_template("test template", params_json_path="./simulation_template.json")
49
49
  sim = project.create_simulation(mesh.id, "My simulation", sim_template.id)
50
50
  ```