luminarycloud 0.14.0__py3-none-any.whl → 0.15.0__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 (295) hide show
  1. luminarycloud/__init__.py +8 -1
  2. luminarycloud/_client/client.py +9 -0
  3. luminarycloud/_client/logging_interceptor.py +25 -0
  4. luminarycloud/_client/tracing.py +13 -8
  5. luminarycloud/_helpers/__init__.py +2 -0
  6. luminarycloud/_helpers/_code_representation.py +135 -0
  7. luminarycloud/_helpers/_simulation_params_from_json.py +5 -1
  8. luminarycloud/_helpers/download.py +16 -0
  9. luminarycloud/_helpers/named_variables.py +25 -0
  10. luminarycloud/_helpers/upload.py +31 -11
  11. luminarycloud/_helpers/warnings/deprecated.py +8 -10
  12. luminarycloud/_helpers/warnings/experimental.py +4 -4
  13. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +135 -110
  14. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +82 -10
  15. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
  16. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
  17. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +40 -40
  18. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +8 -2
  19. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.py +182 -0
  20. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +260 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.py +204 -0
  22. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.pyi +75 -0
  23. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +94 -0
  24. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +145 -0
  25. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +104 -0
  26. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +42 -0
  27. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +25 -25
  28. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -3
  29. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.py +25 -3
  30. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.pyi +32 -0
  31. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2_grpc.py +34 -0
  32. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2_grpc.pyi +12 -0
  33. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +162 -0
  34. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +254 -0
  35. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +203 -0
  36. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +74 -0
  37. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +157 -141
  38. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +32 -4
  39. luminarycloud/_proto/cad/boolean_pb2.py +8 -8
  40. luminarycloud/_proto/cad/boolean_pb2.pyi +34 -4
  41. luminarycloud/_proto/client/simulation_pb2.py +304 -294
  42. luminarycloud/_proto/client/simulation_pb2.pyi +30 -1
  43. luminarycloud/_proto/geometry/geometry_pb2.py +58 -58
  44. luminarycloud/_proto/geometry/geometry_pb2.pyi +58 -11
  45. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +42 -42
  46. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +2 -2
  47. luminarycloud/_proto/output/reference_values_pb2.py +5 -5
  48. luminarycloud/_proto/parametricworker/parametricworker_pb2.py +31 -31
  49. luminarycloud/_proto/parametricworker/parametricworker_pb2.pyi +6 -4
  50. luminarycloud/_proto/quantity/quantity_pb2.py +4 -4
  51. luminarycloud/_proto/table/table_pb2.py +9 -8
  52. luminarycloud/_proto/table/table_pb2.pyi +7 -1
  53. luminarycloud/enum/__init__.py +2 -0
  54. luminarycloud/enum/geometry_status.py +28 -0
  55. luminarycloud/geometry.py +64 -32
  56. luminarycloud/geometry_version.py +2 -2
  57. luminarycloud/mesh.py +11 -4
  58. luminarycloud/meshing/__init__.py +1 -0
  59. luminarycloud/meshing/metadata/__init__.py +6 -0
  60. luminarycloud/meshing/metadata/mesh_metadata.py +57 -0
  61. luminarycloud/named_variable_set.py +121 -0
  62. luminarycloud/outputs/output_definitions.py +11 -10
  63. luminarycloud/params/enum/_enum_wrappers.py +77 -968
  64. luminarycloud/params/outputs/output.py +2 -1
  65. luminarycloud/params/simulation/__init__.py +16 -16
  66. luminarycloud/params/simulation/_lib.py +1 -67
  67. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +3 -2
  68. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +3 -2
  69. luminarycloud/params/simulation/adjoint_.py +4 -3
  70. luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -2
  71. luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -2
  72. luminarycloud/params/simulation/basic/gravity_.py +3 -2
  73. luminarycloud/params/simulation/body_frame_.py +3 -2
  74. luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +7 -6
  75. luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +7 -6
  76. luminarycloud/params/simulation/entity_relationships_.py +3 -2
  77. luminarycloud/params/simulation/general_.py +4 -3
  78. luminarycloud/params/simulation/material/fluid/__init__.py +4 -4
  79. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -2
  80. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +3 -2
  81. luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -2
  82. luminarycloud/params/simulation/material/fluid/material_model/__init__.py +1 -1
  83. luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +3 -2
  84. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +3 -2
  85. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +3 -2
  86. luminarycloud/params/simulation/material/fluid/material_model_.py +3 -2
  87. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/__init__.py +2 -2
  88. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +3 -2
  89. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +3 -2
  90. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +4 -3
  91. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -2
  92. luminarycloud/params/simulation/material/fluid/viscosity_model/__init__.py +1 -1
  93. luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +3 -2
  94. luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +3 -2
  95. luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +4 -3
  96. luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -2
  97. luminarycloud/params/simulation/material/material_fluid_.py +7 -6
  98. luminarycloud/params/simulation/material/material_solid_.py +4 -3
  99. luminarycloud/params/simulation/material_entity_.py +9 -8
  100. luminarycloud/params/simulation/monitor_plane_.py +5 -4
  101. luminarycloud/params/simulation/motion_data/__init__.py +1 -1
  102. luminarycloud/params/simulation/motion_data/frame_transforms/__init__.py +1 -1
  103. luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +5 -4
  104. luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +5 -4
  105. luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +5 -4
  106. luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -2
  107. luminarycloud/params/simulation/motion_data/motion_type/__init__.py +1 -1
  108. luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +5 -4
  109. luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +5 -4
  110. luminarycloud/params/simulation/motion_data/motion_type_.py +3 -2
  111. luminarycloud/params/simulation/motion_data_.py +6 -5
  112. luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -2
  113. luminarycloud/params/simulation/output_.py +3 -2
  114. luminarycloud/params/simulation/particle_group/particle_group_type/__init__.py +1 -1
  115. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +4 -3
  116. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +4 -3
  117. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -2
  118. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +7 -6
  119. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -2
  120. luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +5 -4
  121. luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +5 -4
  122. luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -2
  123. luminarycloud/params/simulation/particle_group_.py +4 -3
  124. luminarycloud/params/simulation/physics/__init__.py +3 -3
  125. luminarycloud/params/simulation/physics/fluid/__init__.py +9 -9
  126. luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +3 -2
  127. luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -2
  128. luminarycloud/params/simulation/physics/fluid/boundary_conditions/__init__.py +5 -5
  129. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +5 -4
  130. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/__init__.py +3 -3
  131. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +7 -6
  132. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -4
  133. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +5 -4
  134. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +6 -5
  135. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +5 -4
  136. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +6 -5
  137. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +8 -7
  138. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/__init__.py +1 -1
  139. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -4
  140. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +3 -2
  141. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +3 -2
  142. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +3 -2
  143. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -2
  144. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +6 -5
  145. luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +5 -4
  146. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +3 -2
  147. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/__init__.py +1 -1
  148. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +3 -2
  149. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +3 -2
  150. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/__init__.py +1 -1
  151. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +3 -2
  152. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -2
  153. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +3 -2
  154. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -2
  155. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -2
  156. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +7 -6
  157. luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -2
  158. luminarycloud/params/simulation/physics/fluid/initialization/__init__.py +2 -2
  159. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +5 -4
  160. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +5 -4
  161. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -4
  162. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +3 -2
  163. luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -2
  164. luminarycloud/params/simulation/physics/fluid/physical_behavior/__init__.py +1 -1
  165. luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +8 -7
  166. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/__init__.py +1 -1
  167. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/__init__.py +2 -2
  168. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -2
  169. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +8 -7
  170. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -3
  171. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +5 -4
  172. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -2
  173. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -2
  174. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -2
  175. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +9 -8
  176. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +4 -3
  177. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -3
  178. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -2
  179. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -2
  180. luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +5 -4
  181. luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +3 -2
  182. luminarycloud/params/simulation/physics/fluid/solution_controls/__init__.py +1 -1
  183. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -2
  184. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -2
  185. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +3 -2
  186. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -2
  187. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +7 -6
  188. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -2
  189. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/__init__.py +1 -1
  190. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +3 -2
  191. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +3 -2
  192. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -2
  193. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +5 -4
  194. luminarycloud/params/simulation/physics/fluid/spatial_discretization/__init__.py +1 -1
  195. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/__init__.py +1 -1
  196. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -2
  197. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +3 -2
  198. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +3 -2
  199. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +3 -2
  200. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -2
  201. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -2
  202. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +3 -2
  203. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -2
  204. luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +5 -4
  205. luminarycloud/params/simulation/physics/fluid/turbulence/__init__.py +2 -2
  206. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/__init__.py +1 -1
  207. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -2
  208. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -2
  209. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -2
  210. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -2
  211. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +3 -2
  212. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -2
  213. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -2
  214. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +6 -5
  215. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +3 -2
  216. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -2
  217. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -2
  218. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +6 -5
  219. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/__init__.py +2 -2
  220. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +3 -2
  221. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +3 -2
  222. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +3 -2
  223. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +3 -2
  224. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +3 -2
  225. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -2
  226. luminarycloud/params/simulation/physics/fluid/turbulence_.py +6 -5
  227. luminarycloud/params/simulation/physics/fluid_.py +12 -13
  228. luminarycloud/params/simulation/physics/heat/__init__.py +4 -4
  229. luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -2
  230. luminarycloud/params/simulation/physics/heat/boundary_conditions/__init__.py +2 -2
  231. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -4
  232. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +5 -4
  233. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +5 -4
  234. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +5 -4
  235. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +5 -4
  236. luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +5 -4
  237. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/__init__.py +1 -1
  238. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +3 -2
  239. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -3
  240. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -2
  241. luminarycloud/params/simulation/physics/heat/heat_source_.py +6 -5
  242. luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +5 -4
  243. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +5 -4
  244. luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -2
  245. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +4 -3
  246. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -2
  247. luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +4 -3
  248. luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +3 -2
  249. luminarycloud/params/simulation/physics/heat_.py +9 -8
  250. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/__init__.py +1 -1
  251. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -2
  252. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -2
  253. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -2
  254. luminarycloud/params/simulation/physics/periodic_pair_.py +4 -3
  255. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/__init__.py +1 -1
  256. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -2
  257. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +9 -8
  258. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +3 -2
  259. luminarycloud/params/simulation/physics_.py +7 -6
  260. luminarycloud/params/simulation/simulation_param_.py +12 -13
  261. luminarycloud/params/simulation/sliding_interfaces_.py +8 -7
  262. luminarycloud/params/simulation/surface_name_.py +3 -2
  263. luminarycloud/params/simulation/time/__init__.py +2 -2
  264. luminarycloud/params/simulation/time/compute_statistics/__init__.py +1 -1
  265. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -2
  266. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -2
  267. luminarycloud/params/simulation/time/compute_statistics_.py +3 -2
  268. luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -2
  269. luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -2
  270. luminarycloud/params/simulation/time/time_marching_.py +3 -2
  271. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -2
  272. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +3 -2
  273. luminarycloud/params/simulation/time/time_step_ramp_.py +3 -2
  274. luminarycloud/params/simulation/time_.py +6 -5
  275. luminarycloud/params/simulation/volume_entity_.py +5 -4
  276. luminarycloud/physics_ai/__init__.py +8 -0
  277. luminarycloud/physics_ai/architectures.py +38 -0
  278. luminarycloud/physics_ai/models.py +42 -0
  279. luminarycloud/project.py +73 -21
  280. luminarycloud/reference_values.py +20 -3
  281. luminarycloud/simulation.py +8 -3
  282. luminarycloud/simulation_param.py +136 -29
  283. luminarycloud/simulation_template.py +84 -13
  284. luminarycloud/solution.py +17 -2
  285. luminarycloud/types/__init__.py +1 -0
  286. luminarycloud/types/adfloat.py +49 -19
  287. luminarycloud/types/ids.py +3 -0
  288. luminarycloud/vis/__init__.py +0 -3
  289. luminarycloud/vis/display.py +1 -0
  290. luminarycloud/vis/interactive_scene.py +47 -1
  291. luminarycloud/vis/visualization.py +57 -23
  292. luminarycloud/volume_selection.py +31 -19
  293. {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/METADATA +2 -2
  294. {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/RECORD +295 -274
  295. {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/WHEEL +0 -0
@@ -9,6 +9,7 @@ from typing import Optional, TypeVar, cast
9
9
  import luminarycloud.params.enum._enum_wrappers as enum
10
10
  from luminarycloud._helpers._simulation_params_from_json import (
11
11
  simulation_params_from_json_path,
12
+ simulation_params_from_json_dict,
12
13
  )
13
14
  from luminarycloud._helpers.warnings import experimental
14
15
  from luminarycloud._proto.client import simulation_pb2 as clientpb
@@ -46,7 +47,29 @@ logger = getLogger(__name__)
46
47
 
47
48
  @dataclass(kw_only=True, repr=False)
48
49
  class SimulationParam(_SimulationParam):
49
- """Simulation configuration that supports multiple physics."""
50
+ """
51
+ Solver configuration parameters that support multi-physics simulations.
52
+
53
+ The structure of these parameters is related to the decision tree of selecting different models,
54
+ boundary conditions, etc. for the simulation.
55
+ Most of these choices are made by picking one class for a given field over a number of
56
+ alternatives. For example:
57
+
58
+ >>> import luminarycloud.params.simulation as sim_params
59
+ >>> params = SimulationParam()
60
+ >>> params.physics[0].fluid.turbulence = sim_params.physics.fluid.turbulence.KomegaSst()
61
+ >>> params.physics[0].fluid.turbulence = sim_params.physics.fluid.turbulence.SpalartAllmaras()
62
+
63
+ The alternatives are listed in the documentation of each field (turbulence in this case), and
64
+ the (sub)module that provides them is always named after the field.
65
+ Therefore, even without consulting the documentation, it is possible to list the alternatives
66
+ using Python's ``dir`` function, in this case:
67
+
68
+ >>> dir(sim_params.physics.fluid.turbulence)
69
+
70
+ The alternative classes have different fields, which may again have their own alternative
71
+ classes thereby repeating the pattern and creating the tree structure.
72
+ """
50
73
 
51
74
  reference_values: ReferenceValues = field(default_factory=ReferenceValues)
52
75
  "Reference values for outputs and stopping conditions."
@@ -56,30 +79,67 @@ class SimulationParam(_SimulationParam):
56
79
 
57
80
  def _to_proto(self) -> clientpb.SimulationParam:
58
81
  _proto = super()._to_proto()
59
- transient = self.basic is not None and self.basic.time == enum.FlowBehavior.TRANSIENT
60
- if self.reference_values.reference_value_type == ReferenceValuesType.FARFIELD_VALUES:
61
- raise ValueError(
62
- "ReferenceValuesType.FARFIELD_VALUES cannot be used in SimulationParam yet."
63
- )
64
- self.reference_values._to_proto_common(_proto.reference_values)
82
+ _proto.reference_values.CopyFrom(self.reference_values._to_client_proto())
65
83
  return _proto
66
84
 
67
85
  @classmethod
68
86
  def from_proto(self, proto: clientpb.SimulationParam) -> "SimulationParam":
69
87
  _wrapper = cast(SimulationParam, super().from_proto(proto))
70
- transient = (
71
- _wrapper.basic is not None and _wrapper.basic.time == enum.FlowBehavior.TRANSIENT
72
- )
73
- _wrapper.reference_values._from_proto_common(proto.reference_values)
88
+ _wrapper.reference_values._from_client_proto(proto.reference_values)
74
89
  return _wrapper
75
90
 
76
91
  @classmethod
77
- def from_json(cls, path: PathLike) -> "SimulationParam":
78
- return cls.from_proto(simulation_params_from_json_path(path))
92
+ def from_json(cls, source: PathLike | dict) -> "SimulationParam":
93
+ if isinstance(source, PathLike):
94
+ return cls.from_proto(simulation_params_from_json_path(source))
95
+ else:
96
+ return cls.from_proto(simulation_params_from_json_dict(source))
79
97
 
80
98
  def assign_material(self, material: MaterialEntity, volume: Volume | str) -> None:
81
99
  """
82
- Assigns a material entity to a volume ID.
100
+ Assigns a material entity to a volume.
101
+
102
+ This method links a material entity to a specific volume in the simulation domain.
103
+ If the volume or material entity has not been added to the simulation parameters yet,
104
+ they will be added automatically.
105
+
106
+ Parameters
107
+ ----------
108
+ material : MaterialEntity
109
+ The material entity to assign to the volume. This is typically created using
110
+ lc.params.simulation.MaterialEntity.
111
+ volume : Volume | str
112
+ The volume to assign the material to. Can be a Volume object or a string
113
+ representing the volume ID.
114
+
115
+ Examples
116
+ --------
117
+ Using volumes from list_tags():
118
+
119
+ >>> # Get the fluid volume from tags
120
+ >>> tags = geometry.list_tags()
121
+ >>> # Assume the fluid volume is tagged with "Fluid"
122
+ >>> fluid_volume_tag_name = "Fluid"
123
+ >>> fluid_tag = next(
124
+ ... (tag for tag in tags if tag.name == fluid_volume_tag_name and tag.volumes), None
125
+ ... )
126
+ >>> if fluid_tag:
127
+ ... # Assume we want to assign the material to the first volume in the tag
128
+ ... for fluid_volume in fluid_tag.volumes:
129
+ ... simulation_param.assign_material(material, fluid_volume)
130
+ >>> else:
131
+ ... raise ValueError("No fluid volume found")
132
+
133
+ Using volumes from list_entities():
134
+
135
+ >>> # Get the fluid volume from list_entities()
136
+ >>> surfaces, volumes = geometry.list_entities()
137
+ >>> if volumes:
138
+ ... # Assume we want to assign the material to the first volume in the list
139
+ ... fluid_volume_to_assign = volumes[0]
140
+ ... simulation_param.assign_material(material, fluid_volume_to_assign)
141
+ >>> else:
142
+ ... raise ValueError("No fluid volume found")
83
143
  """
84
144
  volume_identifier = EntityIdentifier()
85
145
  if isinstance(volume, str):
@@ -112,7 +172,49 @@ class SimulationParam(_SimulationParam):
112
172
 
113
173
  def assign_physics(self, physics: Physics, volume: Volume | str) -> None:
114
174
  """
115
- Assigns a physics entity to a volume ID.
175
+ Assigns a physics entity to a volume.
176
+
177
+ This method links a physics entity to a specific volume in the simulation domain.
178
+ If the volume or physics entity has not been added to the simulation parameters yet,
179
+ they will be added automatically.
180
+
181
+ Parameters
182
+ ----------
183
+ physics : Physics
184
+ The physics entity to assign to the volume. This is typically created using
185
+ lc.params.simulation.Physics.
186
+ volume : Volume | str
187
+ The volume to assign the physics to. Can be a Volume object or a string
188
+ representing the volume ID.
189
+
190
+ Examples
191
+ --------
192
+ Using volumes from list_tags():
193
+
194
+ >>> # Get the fluid volume from tags
195
+ >>> tags = geometry.list_tags()
196
+ >>> # Assume the fluid volume is tagged with "Fluid"
197
+ >>> fluid_volume_tag_name = "Fluid"
198
+ >>> fluid_tag = next(
199
+ ... (tag for tag in tags if tag.name == fluid_volume_tag_name and tag.volumes), None
200
+ ... )
201
+ >>> if fluid_tag:
202
+ ... # Assume we want to assign the physics to the first volume in the tag
203
+ ... for fluid_volume in fluid_tag.volumes:
204
+ ... simulation_param.assign_physics(physics, fluid_volume)
205
+ >>> else:
206
+ ... raise ValueError("No fluid volume found")
207
+
208
+ Using volumes from list_entities():
209
+
210
+ >>> # Get the fluid volume from list_entities()
211
+ >>> surfaces, volumes = geometry.list_entities()
212
+ >>> if volumes:
213
+ ... # Assume we want to assign the physics to the first volume in the list
214
+ ... fluid_volume_to_assign = volumes[0]
215
+ ... simulation_param.assign_physics(physics, fluid_volume_to_assign)
216
+ >>> else:
217
+ ... raise ValueError("No fluid volume found")
116
218
  """
117
219
  if isinstance(volume, str):
118
220
  volume_identifier = EntityIdentifier(id=volume)
@@ -206,16 +308,17 @@ class SimulationParam(_SimulationParam):
206
308
  def __repr__(self) -> str:
207
309
  return pformat(vars(self), compact=True, sort_dicts=True)
208
310
 
209
- def to_code(self) -> str:
311
+ def to_code(self, hide_defaults: bool = True) -> str:
210
312
  """
211
313
  Returns the python code that generates an identical SimulationParam object.
212
- This is a verbose representation where every parameter is set, even if its value
213
- corresponds to the default, or a preset would override the value.
314
+ This is a verbose representation that does not make use of helper functions like
315
+ assign_material and assign_physics.
316
+ Parameters with default values are omitted by default, with hide_defaults=False, code will
317
+ also be generated for those parameters.
214
318
  """
215
319
  code = """## NOTE: This is a verbose representation of a SimulationParam object as the
216
320
  ## code that creates an identical object. The verbosity is intended to facilitate
217
- ## the discovery of available parameters. However, note that when presets are used
218
- ## (e.g. for material properties) some lines of this representation become redundant.
321
+ ## the discovery of available parameters.
219
322
  import luminarycloud
220
323
  from luminarycloud import *
221
324
  from luminarycloud.types import Vector3
@@ -224,16 +327,20 @@ from luminarycloud.params.enum import *
224
327
  from luminarycloud.params import simulation as params
225
328
 
226
329
 
227
- obj = SimulationParam()
228
330
  """
229
- for line in _SimulationParam.to_code(self).split("\n")[1:]:
230
- if line.startswith("new_") or line.startswith("#"):
231
- code += f"{line}\n"
232
- elif line.startswith(".new_"):
233
- code += f"{line[1:]}\n"
234
- elif line:
235
- code += f"obj{line}\n"
236
- return code
331
+ return code + self._to_code_helper("obj", hide_defaults).replace(
332
+ "luminarycloud.simulation_param.SimulationParam()", "SimulationParam()", 1
333
+ )
334
+
335
+ def find_parameter(self, parameter: str) -> None:
336
+ """
337
+ Searches the full output of "to_code()" for occurrences of "parameter" and prints the lines
338
+ with matches. This is a helper function to assist users in finding, for example, how to
339
+ change farfield conditions, material properties, etc.
340
+ """
341
+ for i, line in enumerate(self.to_code(False).split("\n")):
342
+ if parameter.lower() in line.lower():
343
+ print(f"line {i}: {line}")
237
344
 
238
345
 
239
346
  T = TypeVar("T")
@@ -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(
@@ -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 += "outputs = []\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 += "outputs.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(outputs[{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
  """
luminarycloud/solution.py CHANGED
@@ -6,11 +6,13 @@ from os import PathLike
6
6
  import luminarycloud as lc
7
7
 
8
8
  from ._client import get_default_client
9
+ from ._helpers.warnings import experimental
9
10
  from ._helpers.download import (
10
11
  download_surface_solution,
11
12
  download_volume_solution,
12
13
  download_surface_deformation_template,
13
14
  download_surface_sensitivity_data,
15
+ download_parameter_sensitivity_data,
14
16
  )
15
17
  from ._helpers.file_chunk_stream import FileChunkStream
16
18
  from ._proto.api.v0.luminarycloud.solution import solution_pb2 as solutionpb
@@ -131,7 +133,7 @@ class Solution(ProtoWrapperBase):
131
133
  Project.set_surface_deformation to create simulations with volume mesh morphing.
132
134
  """
133
135
  stream = download_surface_deformation_template(get_default_client(), self.id)
134
- return _handle_surface_data_stream(stream, dst)
136
+ _handle_surface_data_stream(stream, dst)
135
137
 
136
138
  def download_surface_sensitivity_data(self, dst: Optional[PathLike] = None) -> None:
137
139
  """
@@ -142,4 +144,17 @@ class Solution(ProtoWrapperBase):
142
144
  The IDs of the sensitivity data are consistent with the node IDs of the surface deformation.
143
145
  """
144
146
  stream = download_surface_sensitivity_data(get_default_client(), self.id)
145
- return _handle_surface_data_stream(stream, dst)
147
+ _handle_surface_data_stream(stream, dst)
148
+
149
+ @experimental
150
+ def download_parameter_sensitivity_data(self, dst: Optional[PathLike] = None) -> None:
151
+ """
152
+ Download the parameter sensitivity data associated with an adjoint solution into the
153
+ destination file or into a default-named file. The data consists of parameter names and
154
+ sensitivity values (d "adjoint output" / d "SimulationParam parameter").
155
+
156
+ NOTE: This is a very experimental feature, likely to change in the future in favor of
157
+ including the sensitivities in a SimulationParam object directly.
158
+ """
159
+ stream = download_parameter_sensitivity_data(get_default_client(), self.id)
160
+ _handle_surface_data_stream(stream, dst)
@@ -6,6 +6,7 @@ from .ids import (
6
6
  SolutionID as SolutionID,
7
7
  SimulationTemplateID as SimulationTemplateID,
8
8
  GeometryFeatureID as GeometryFeatureID,
9
+ NamedVariableSetID as NamedVariableSetID,
9
10
  )
10
11
 
11
12
  from .adfloat import (
@@ -1,19 +1,40 @@
1
+ from abc import ABCMeta
1
2
  from typing import Any
2
3
  from .._proto.base.base_pb2 import AdFloatType, FirstOrderAdType, SecondOrderAdType
3
4
 
4
5
 
5
- class FirstOrderAdFloat(float):
6
+ class AdFloat(float, metaclass=ABCMeta):
7
+ """An immutable float with adjoints/tangents"""
8
+
9
+ pass
10
+
11
+
12
+ class FirstOrderAdFloat(AdFloat):
6
13
  """An immutable float with first order adjoints/tangents attached."""
7
14
 
8
- tangent: tuple[float, ...]
9
- adjoint: tuple[float, ...]
15
+ _tangent: tuple[float, ...]
16
+ _adjoint: tuple[float, ...]
10
17
 
11
18
  def __new__(cls: type["FirstOrderAdFloat"], value: float, *_: Any) -> "FirstOrderAdFloat":
12
19
  return super().__new__(cls, value)
13
20
 
14
21
  def __init__(self, value: float, tangent: tuple[float, ...], adjoint: tuple[float, ...]):
15
- self.tangent = tuple(float(t) for t in tangent)
16
- self.adjoint = tuple(float(a) for a in adjoint)
22
+ if isinstance(value, AdFloat):
23
+ raise ValueError("Value cannot be an AdFloat")
24
+ if any(isinstance(t, AdFloat) for t in tangent):
25
+ raise ValueError("Tangent cannot be an AdFloat")
26
+ if any(isinstance(a, AdFloat) for a in adjoint):
27
+ raise ValueError("Adjoint cannot be an AdFloat")
28
+ self._tangent = tuple(float(t) for t in tangent)
29
+ self._adjoint = tuple(float(a) for a in adjoint)
30
+
31
+ @property
32
+ def tangent(self) -> tuple[float, ...]:
33
+ return self._tangent
34
+
35
+ @property
36
+ def adjoint(self) -> tuple[float, ...]:
37
+ return self._adjoint
17
38
 
18
39
  @staticmethod
19
40
  def _from_proto(proto: FirstOrderAdType) -> "FirstOrderAdFloat":
@@ -24,12 +45,12 @@ class FirstOrderAdFloat(float):
24
45
  )
25
46
 
26
47
 
27
- class SecondOrderAdFloat(float):
48
+ class SecondOrderAdFloat(AdFloat):
28
49
  """An immutable float with second order adjoints/tangents attached."""
29
50
 
30
- value: FirstOrderAdFloat
31
- tangent: tuple[FirstOrderAdFloat, ...]
32
- adjoint: tuple[FirstOrderAdFloat, ...]
51
+ _value: FirstOrderAdFloat
52
+ _tangent: tuple[FirstOrderAdFloat, ...]
53
+ _adjoint: tuple[FirstOrderAdFloat, ...]
33
54
 
34
55
  def __new__(cls, value: FirstOrderAdFloat, *_: Any) -> "SecondOrderAdFloat":
35
56
  return super().__new__(cls, value)
@@ -42,16 +63,25 @@ class SecondOrderAdFloat(float):
42
63
  ):
43
64
  if not isinstance(value, FirstOrderAdFloat):
44
65
  raise TypeError("Value must be a FirstOrderAdFloat")
45
- for t in tangent:
46
- if not isinstance(t, FirstOrderAdFloat):
47
- raise TypeError("Tangent must be a tuple of FirstOrderAdFloat")
48
- for a in adjoint:
49
- if not isinstance(a, FirstOrderAdFloat):
50
- raise TypeError("Adjoint must be a tuple of FirstOrderAdFloat")
51
-
52
- self.value = value
53
- self.tangent = tangent
54
- self.adjoint = adjoint
66
+ if any(not isinstance(t, FirstOrderAdFloat) for t in tangent):
67
+ raise TypeError("Tangent must be a tuple of FirstOrderAdFloat")
68
+ if any(not isinstance(a, FirstOrderAdFloat) for a in adjoint):
69
+ raise TypeError("Adjoint must be a tuple of FirstOrderAdFloat")
70
+ self._value = value
71
+ self._tangent = tangent
72
+ self._adjoint = adjoint
73
+
74
+ @property
75
+ def value(self) -> FirstOrderAdFloat:
76
+ return self._value
77
+
78
+ @property
79
+ def tangent(self) -> tuple[FirstOrderAdFloat, ...]:
80
+ return self._tangent
81
+
82
+ @property
83
+ def adjoint(self) -> tuple[FirstOrderAdFloat, ...]:
84
+ return self._adjoint
55
85
 
56
86
  @staticmethod
57
87
  def _from_proto(proto: SecondOrderAdType) -> "SecondOrderAdFloat":
@@ -8,3 +8,6 @@ SimulationID = NewType("SimulationID", str)
8
8
  SolutionID = NewType("SolutionID", str)
9
9
  SimulationTemplateID = NewType("SimulationTemplateID", str)
10
10
  GeometryFeatureID = NewType("GeometryFeatureID", str)
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,5 +1,5 @@
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
5
  from typing import TYPE_CHECKING, cast
@@ -15,6 +15,9 @@ except ImportError:
15
15
  lcj = None
16
16
 
17
17
 
18
+ _SOURCE_FILTER_ID = "___LC_SOURCE_FILTER___"
19
+
20
+
18
21
  class InteractiveScene:
19
22
  """
20
23
  The InteractiveScene acts as the bridge between the the Scene and
@@ -39,6 +42,9 @@ class InteractiveScene:
39
42
  self.widget._ipython_display_()
40
43
 
41
44
  def set_scene(self, scene: "Scene") -> None:
45
+ # Import here to avoid circular import issue
46
+ from .visualization import LookAtCamera
47
+
42
48
  # Display the initial scene we've been given
43
49
  # Submit request for the render data URLs we need
44
50
  req = vis_pb2.GetRenderDataUrlsRequest()
@@ -67,6 +73,12 @@ class InteractiveScene:
67
73
  bad_ids = scene._validate_surfaces_and_tags(streamlines._surface_names)
68
74
  if len(bad_ids) != 0:
69
75
  raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
76
+ if isinstance(filter, SurfaceLIC):
77
+ # Validate surfaces names
78
+ lic = cast(SurfaceLIC, filter)
79
+ bad_ids = scene._validate_surfaces_and_tags(lic._surface_names)
80
+ if len(bad_ids) != 0:
81
+ raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
70
82
 
71
83
  if isinstance(filter, Filter):
72
84
  vis_filter: vis_pb2.Filter = filter._to_proto()
@@ -85,6 +97,27 @@ class InteractiveScene:
85
97
  # is moved there.
86
98
  self.widget.set_workspace_state(scene, resp)
87
99
 
100
+ # Sync display attributes and visibilities for surfaces
101
+ self.set_display_attributes(_SOURCE_FILTER_ID, scene.global_display_attrs)
102
+ for s, v in scene._surface_visibilities.items():
103
+ self.set_surface_visibility(s, v)
104
+
105
+ for f in scene._filters:
106
+ self.set_display_attributes(f.id, f.display_attrs)
107
+
108
+ # Find and apply the first look at camera, if any, in the scene
109
+ set_camera = False
110
+ for c in scene._cameras:
111
+ if not isinstance(c, LookAtCamera):
112
+ continue
113
+ set_camera = True
114
+ self.set_camera(c)
115
+
116
+ # If we don't have an initial camera to use, reset the camera after loading
117
+ # the workspace state
118
+ if not set_camera:
119
+ self.reset_camera()
120
+
88
121
  def set_surface_visibility(self, surface_id: str, visible: bool) -> None:
89
122
  self.widget.set_surface_visibility(surface_id, visible)
90
123
 
@@ -97,6 +130,12 @@ class InteractiveScene:
97
130
  def reset_camera(self) -> None:
98
131
  self.widget.reset_camera()
99
132
 
133
+ def set_camera(self, camera: "LookAtCamera") -> None:
134
+ self.widget.camera_pan = [camera.pan_x, camera.pan_y]
135
+ self.widget.camera_position = [camera.position[0], camera.position[1], camera.position[2]]
136
+ self.widget.camera_look_at = [camera.look_at[0], camera.look_at[1], camera.look_at[2]]
137
+ self.widget.camera_up = [camera.up[0], camera.up[1], camera.up[2]]
138
+
100
139
  def get_camera(self) -> "LookAtCamera":
101
140
  # Import here to avoid circular import issue
102
141
  from .visualization import LookAtCamera
@@ -105,4 +144,11 @@ class InteractiveScene:
105
144
  camera.position = self.widget.camera_position
106
145
  camera.look_at = self.widget.camera_look_at
107
146
  camera.up = self.widget.camera_up
147
+ # Immediately after creation, the widget's camera_pan is empty, so avoid going out of bounds
148
+ # and report 0 which is what it would be anyway
149
+ camera.pan_x = self.widget.camera_pan[0] if self.widget.camera_pan else 0
150
+ camera.pan_y = self.widget.camera_pan[1] if self.widget.camera_pan else 0
108
151
  return camera
152
+
153
+ def set_triad_visible(self, visible: bool) -> None:
154
+ self.widget.set_triad_visible(visible)