luminarycloud 0.13.0__py3-none-any.whl → 0.14.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 (328) hide show
  1. luminarycloud/_helpers/cond.py +262 -165
  2. luminarycloud/_helpers/defaults.py +3 -3
  3. luminarycloud/_helpers/download.py +12 -1
  4. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +69 -47
  5. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +45 -1
  6. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
  7. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
  8. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +86 -65
  9. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +38 -1
  10. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2_grpc.py +33 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2_grpc.pyi +10 -0
  12. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +12 -12
  13. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +5 -1
  14. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.py +2 -1
  15. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.pyi +6 -2
  16. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.py +14 -14
  17. luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.pyi +5 -1
  18. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +170 -85
  19. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +215 -10
  20. luminarycloud/_proto/assistant/assistant_pb2.py +177 -21
  21. luminarycloud/_proto/assistant/assistant_pb2.pyi +380 -7
  22. luminarycloud/_proto/client/simulation_pb2.py +705 -521
  23. luminarycloud/_proto/client/simulation_pb2.pyi +552 -35
  24. luminarycloud/_proto/geometry/geometry_pb2.py +74 -40
  25. luminarycloud/_proto/geometry/geometry_pb2.pyi +68 -4
  26. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +321 -0
  27. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +648 -0
  28. luminarycloud/_proto/options/options_pb2.py +9 -5
  29. luminarycloud/_proto/options/options_pb2.pyi +4 -0
  30. luminarycloud/_proto/output/reference_values_pb2.py +22 -5
  31. luminarycloud/_proto/output/reference_values_pb2.pyi +1 -1
  32. luminarycloud/_proto/quantity/quantity_options_pb2.py +28 -4
  33. luminarycloud/_proto/quantity/quantity_options_pb2.pyi +58 -1
  34. luminarycloud/_proto/quantity/quantity_pb2.py +162 -159
  35. luminarycloud/_proto/quantity/quantity_pb2.pyi +2 -0
  36. luminarycloud/enum/vis_enums.py +82 -2
  37. luminarycloud/geometry.py +22 -5
  38. luminarycloud/meshing/mesh_generation_params.py +8 -2
  39. luminarycloud/params/__init__.py +1 -2
  40. luminarycloud/params/enum/_enum_wrappers.py +1184 -3
  41. luminarycloud/params/outputs/output.py +1 -1
  42. luminarycloud/params/{param_wrappers/simulation_param → simulation}/__init__.py +15 -14
  43. luminarycloud/params/{param_wrappers → simulation}/_lib.py +2 -4
  44. luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement/boundary_layer_profile_.py +2 -2
  45. luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement_.py +4 -4
  46. luminarycloud/params/{param_wrappers/simulation_param → simulation}/adjoint_.py +2 -2
  47. luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/gravity_off_.py +4 -4
  48. luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/gravity_on_.py +4 -4
  49. luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity_.py +2 -2
  50. luminarycloud/params/{param_wrappers/simulation_param → simulation}/body_frame_.py +2 -2
  51. luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/volume_material_relationship_.py +2 -2
  52. luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/volume_physics_relationship_.py +2 -2
  53. luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships_.py +6 -6
  54. luminarycloud/params/{param_wrappers/simulation_param → simulation}/general_.py +8 -10
  55. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/boussinesq_off_.py +4 -4
  56. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/boussinesq_on_.py +4 -4
  57. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation_.py +2 -2
  58. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/ideal_gas_.py +4 -6
  59. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/incompressible_fluid_.py +4 -6
  60. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/incompressible_fluid_with_energy_.py +4 -6
  61. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model_.py +2 -2
  62. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -4
  63. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -4
  64. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +4 -4
  65. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model_.py +2 -2
  66. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -6
  67. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/sutherland_.py +4 -6
  68. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +4 -6
  69. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model_.py +2 -2
  70. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/material_fluid_.py +32 -40
  71. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/material_solid_.py +2 -2
  72. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material_entity_.py +6 -10
  73. luminarycloud/params/{param_wrappers/simulation_param → simulation}/monitor_plane_.py +10 -5
  74. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/no_transform_.py +4 -6
  75. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/rotational_transform_.py +4 -6
  76. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/translational_transform_.py +4 -6
  77. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms_.py +2 -2
  78. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/constant_angular_motion_.py +4 -4
  79. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/constant_translation_motion_.py +4 -4
  80. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type_.py +2 -2
  81. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data_.py +16 -20
  82. luminarycloud/params/{param_wrappers/simulation_param → simulation}/multi_physics_coupling_options_.py +2 -2
  83. luminarycloud/params/{param_wrappers/simulation_param → simulation}/output_.py +2 -2
  84. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +4 -4
  85. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +4 -4
  86. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +2 -2
  87. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +49 -0
  88. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_line_.py +4 -6
  89. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/probe_points_.py +4 -6
  90. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/source_points_.py +4 -6
  91. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type_.py +2 -2
  92. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group_.py +20 -17
  93. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/adjoint_controls_fluid_.py +2 -2
  94. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/basic_fluid_.py +2 -2
  95. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/__init__.py +3 -4
  96. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +111 -0
  97. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/__init__.py +4 -3
  98. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +4 -6
  99. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +55 -0
  100. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -6
  101. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -6
  102. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +8 -6
  103. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +8 -6
  104. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +104 -0
  105. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +4 -4
  106. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -4
  107. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +4 -4
  108. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +4 -4
  109. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +2 -2
  110. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet_.py +14 -14
  111. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/symmetry_.py +4 -4
  112. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +50 -0
  113. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -4
  114. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -4
  115. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -4
  116. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/slip_.py +4 -4
  117. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -4
  118. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/wall_energy_.py +2 -2
  119. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/wall_momentum_.py +2 -2
  120. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall_.py +18 -18
  121. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions_fluid_.py +9 -4
  122. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization/__init__.py +1 -2
  123. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization/fluid_existing_solution_.py +4 -6
  124. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +65 -0
  125. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +77 -0
  126. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +44 -0
  127. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization_fluid_.py +2 -2
  128. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +12 -8
  129. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +6 -6
  130. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +4 -4
  131. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -4
  132. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -4
  133. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +8 -6
  134. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +6 -6
  135. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +8 -6
  136. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +2 -2
  137. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +4 -4
  138. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -4
  139. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +8 -6
  140. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model_.py +2 -2
  141. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior_.py +34 -29
  142. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/porous_behavior_.py +14 -10
  143. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +4 -4
  144. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +4 -4
  145. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +4 -4
  146. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +2 -2
  147. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +16 -16
  148. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method_.py +2 -2
  149. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -4
  150. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -4
  151. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method_.py +2 -2
  152. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls_fluid_.py +14 -14
  153. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +4 -4
  154. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/fds_.py +4 -4
  155. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +6 -4
  156. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -4
  157. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_.py +2 -2
  158. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +4 -4
  159. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +4 -4
  160. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order_.py +2 -2
  161. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization_fluid_.py +20 -18
  162. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/ddes_.py +4 -6
  163. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +4 -6
  164. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/iddes_.py +4 -6
  165. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation_.py +2 -2
  166. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +4 -4
  167. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +4 -4
  168. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +2 -2
  169. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst_.py +10 -12
  170. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +4 -4
  171. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +4 -4
  172. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +2 -2
  173. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras_.py +10 -12
  174. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -4
  175. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -4
  176. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -4
  177. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -4
  178. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -4
  179. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model_.py +2 -2
  180. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence_.py +22 -32
  181. luminarycloud/params/simulation/physics/fluid_.py +233 -0
  182. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/adjoint_controls_heat_.py +2 -2
  183. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_convection_.py +4 -4
  184. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -4
  185. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -4
  186. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_symmetry_.py +4 -4
  187. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -4
  188. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions_heat_.py +9 -4
  189. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -4
  190. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -4
  191. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type_.py +2 -2
  192. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source_.py +20 -17
  193. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/heat_existing_solution_.py +4 -6
  194. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/heat_prescribed_values_.py +4 -6
  195. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization_heat_.py +2 -2
  196. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +10 -10
  197. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method_.py +2 -2
  198. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls_heat_.py +6 -6
  199. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/spatial_discretization_heat_.py +2 -2
  200. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat_.py +33 -42
  201. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +5 -7
  202. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/translational_periodicity_.py +4 -6
  203. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type_.py +2 -2
  204. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair_.py +8 -10
  205. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/gauss_seidel_.py +4 -4
  206. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -4
  207. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type_.py +2 -2
  208. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics_.py +6 -6
  209. luminarycloud/params/{param_wrappers → simulation}/simulation_param_.py +34 -40
  210. luminarycloud/params/{param_wrappers/simulation_param → simulation}/sliding_interfaces_.py +10 -5
  211. luminarycloud/params/{param_wrappers/simulation_param → simulation}/surface_name_.py +2 -2
  212. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/compute_statistics_off_.py +4 -6
  213. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/compute_statistics_on_.py +4 -6
  214. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics_.py +2 -2
  215. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/time_explicit_.py +4 -4
  216. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/time_implicit_.py +4 -4
  217. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching_.py +2 -2
  218. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/time_step_ramp_off_.py +4 -4
  219. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/time_step_ramp_on_.py +4 -4
  220. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp_.py +2 -2
  221. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time_.py +20 -30
  222. luminarycloud/params/{param_wrappers/simulation_param → simulation}/volume_entity_.py +2 -2
  223. luminarycloud/project.py +63 -7
  224. luminarycloud/reference_values.py +1 -1
  225. luminarycloud/simulation.py +13 -2
  226. luminarycloud/simulation_param.py +8 -8
  227. luminarycloud/solution.py +7 -1
  228. luminarycloud/types/vector3.py +28 -2
  229. luminarycloud/vis/__init__.py +6 -1
  230. luminarycloud/vis/display.py +101 -51
  231. luminarycloud/vis/filters.py +384 -15
  232. luminarycloud/vis/interactive_scene.py +46 -23
  233. luminarycloud/vis/visualization.py +204 -58
  234. {luminarycloud-0.13.0.dist-info → luminarycloud-0.14.0.dist-info}/METADATA +1 -2
  235. luminarycloud-0.14.0.dist-info/RECORD +466 -0
  236. luminarycloud/params/param_wrappers/__init__.py +0 -2
  237. luminarycloud/params/param_wrappers/simulation_param/particle_group/particle_group_type/actuator_disk_.py +0 -51
  238. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/farfield_.py +0 -197
  239. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/inlet_.py +0 -189
  240. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/__init__.py +0 -4
  241. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/__init__.py +0 -5
  242. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_komega_variables_.py +0 -37
  243. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_turbulent_viscosity_and_intensity_komega_.py +0 -33
  244. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_turbulent_viscosity_ratio_and_intensity_komega_.py +0 -33
  245. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega_boundary_conditions_.py +0 -25
  246. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/__init__.py +0 -3
  247. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_sa_variable_.py +0 -33
  248. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_turbulent_viscosity_ratio_sa_.py +0 -31
  249. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_turbulent_viscosity_sa_.py +0 -31
  250. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras_boundary_conditions_.py +0 -25
  251. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +0 -65
  252. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/fluid_farfield_values_.py +0 -173
  253. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/fluid_prescribed_values_.py +0 -185
  254. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/__init__.py +0 -4
  255. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/__init__.py +0 -5
  256. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_farfield_values_komega_.py +0 -30
  257. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_turbulent_viscosity_and_intensity_komega_.py +0 -33
  258. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_turbulent_viscosity_ratio_and_intensity_komega_.py +0 -33
  259. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega_initialization_.py +0 -25
  260. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/__init__.py +0 -4
  261. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_farfield_values_sa_.py +0 -30
  262. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_sa_variable_.py +0 -31
  263. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_turbulent_viscosity_ratio_sa_.py +0 -31
  264. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_turbulent_viscosity_sa_.py +0 -31
  265. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras_initialization_.py +0 -25
  266. luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence_initialization_.py +0 -69
  267. luminarycloud/params/param_wrappers/simulation_param/physics/fluid_.py +0 -438
  268. luminarycloud-0.13.0.dist-info/RECORD +0 -487
  269. luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement/__init__.py +0 -0
  270. luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/__init__.py +0 -0
  271. luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/__init__.py +0 -0
  272. luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/__init__.py +1 -1
  273. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/__init__.py +1 -1
  274. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/__init__.py +4 -4
  275. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/__init__.py +1 -1
  276. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/__init__.py +0 -0
  277. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/__init__.py +2 -2
  278. luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/__init__.py +2 -2
  279. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/__init__.py +1 -1
  280. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/__init__.py +1 -1
  281. luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/__init__.py +0 -0
  282. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/__init__.py +0 -0
  283. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/__init__.py +2 -2
  284. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/__init__.py +0 -0
  285. luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/__init__.py +1 -1
  286. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/__init__.py +3 -3
  287. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/__init__.py +8 -8
  288. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/__init__.py +0 -0
  289. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/__init__.py +1 -1
  290. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/__init__.py +1 -1
  291. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/__init__.py +1 -1
  292. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/__init__.py +1 -1
  293. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/__init__.py +0 -0
  294. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/__init__.py +2 -2
  295. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/__init__.py +2 -2
  296. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/__init__.py +0 -0
  297. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/__init__.py +0 -0
  298. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/__init__.py +0 -0
  299. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/__init__.py +0 -0
  300. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/__init__.py +0 -0
  301. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/__init__.py +1 -1
  302. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/__init__.py +0 -0
  303. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/__init__.py +2 -2
  304. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/__init__.py +2 -2
  305. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/__init__.py +1 -1
  306. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/__init__.py +4 -4
  307. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/__init__.py +1 -1
  308. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/__init__.py +0 -0
  309. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/__init__.py +1 -1
  310. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/__init__.py +0 -0
  311. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/__init__.py +0 -0
  312. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/__init__.py +2 -2
  313. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/__init__.py +4 -4
  314. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/__init__.py +1 -1
  315. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/__init__.py +0 -0
  316. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type/__init__.py +0 -0
  317. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/__init__.py +1 -1
  318. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/__init__.py +0 -0
  319. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method/__init__.py +0 -0
  320. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/__init__.py +0 -0
  321. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/__init__.py +0 -0
  322. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/__init__.py +0 -0
  323. luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/__init__.py +1 -1
  324. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/__init__.py +1 -1
  325. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/__init__.py +0 -0
  326. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/__init__.py +1 -1
  327. luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/__init__.py +1 -1
  328. {luminarycloud-0.13.0.dist-info → luminarycloud-0.14.0.dist-info}/WHEEL +0 -0
@@ -2,11 +2,12 @@
2
2
  # type: ignore
3
3
 
4
4
  import json
5
- from contextlib import contextmanager
6
- from dataclasses import dataclass
7
- from itertools import chain
8
- from collections.abc import Iterable, Mapping
5
+ from dataclasses import dataclass, field
6
+ from itertools import pairwise
7
+ from collections import defaultdict
8
+ from collections.abc import Iterable, Mapping, Iterator
9
9
  from typing import Any, Optional, TypeVar
10
+ from uuid import UUID, uuid4
10
11
 
11
12
  from google.protobuf.any_pb2 import Any as AnyProto
12
13
  from google.protobuf.descriptor import Descriptor, FieldDescriptor
@@ -49,261 +50,353 @@ K = TypeVar("K")
49
50
  V = TypeVar("V")
50
51
 
51
52
 
52
- class ContextMap(Mapping[K, V]):
53
+ class ContextFrame(Mapping[K, V]):
53
54
  """
54
- A utility class which implements a Mapping (i.e. dict) interface as a stack of context frames.
55
+ A utility class which implements a Mapping (i.e. dict) interface as a... graph(?) of context frames.
55
56
 
56
- Writes only write to the topmost frame, while reads look at each from frame top to bottom and
57
- return the first hit. Frames can be pushed and popped onto/from the stack.
57
+ Writes only write to this frame, while reads look at this frame and then each of its ancestor
58
+ frames, returning only the first hit. Returns None if there is no hit.
58
59
  """
59
60
 
60
- _frames: list[dict[type[K], type[V]]]
61
- _current_frame: dict[type[K], type[V]]
61
+ __id: UUID
62
+ __parent_frames: list["ContextFrame"]
63
+ __current_frame: dict[type[K], type[V]]
62
64
 
63
65
  def __init__(self):
64
- self._current_frame = dict()
65
- self._frames = [self._current_frame]
66
+ self.__id = uuid4()
67
+ self.__current_frame = dict()
68
+ self.__parent_frames = []
66
69
 
67
- @contextmanager
68
- def scope(self):
70
+ def new_frame(self) -> "ContextFrame":
71
+ """Creates a new frame on top of this frame"""
72
+ __next_frame = ContextFrame()
73
+ __next_frame.__parent_frames = [self]
74
+ return __next_frame
75
+
76
+ def entangle(self, other: "ContextFrame") -> None:
69
77
  """
70
- Pushes a new frame on enter, and pops on exit.
71
-
72
- Examples
73
- --------
74
- >>> with context_map.scope():
75
- >>> context_map[k] = v
76
- >>> assert context_map[k] == v
77
- >>> assert context_map[k] != v
78
+ Entangles this frame with another frame.
79
+
80
+ Essentially, becomes a secondary parent of the other frame, and vice versa. This creates a
81
+ cycle but reads won't revisit frames. Might seem weird, but it's necessary.
78
82
  """
79
- self.push()
80
- yield self
81
- self.pop()
82
-
83
- def push(self) -> None:
84
- """Pushes a new frame onto the stack"""
85
- self._current_frame = dict()
86
- self._frames.append(self._current_frame)
87
-
88
- def pop(self) -> None:
89
- """Pops the topmost frame from the stack"""
90
- if len(self._frames) == 1:
91
- raise IndexError
92
- self._frames.pop()
93
- self._current_frame = self._frames[-1]
83
+ self.__parent_frames.append(other)
84
+ other.__parent_frames.append(self)
85
+
86
+ def __setitem__(self, key: type[K], value: type[V]) -> None:
87
+ self.__current_frame[key] = value
94
88
 
95
89
  def __getitem__(self, key: type[K]) -> Optional[type[V]]:
96
- for frame in reversed(self._frames):
97
- if key in frame:
98
- return frame[key]
90
+ return self.__getitem_helper(key, set())
91
+
92
+ def __getitem_helper(self, key: type[K], closed: set[str]) -> Optional[type[V]]:
93
+ if key in self.__current_frame:
94
+ return self.__current_frame[key]
95
+ for frame in self.__parent_frames:
96
+ if frame.__id in closed:
97
+ continue
98
+ closed.add(frame.__id)
99
+
100
+ found = frame.__getitem_helper(key, closed)
101
+ if found is not None:
102
+ return found
99
103
  return None
100
104
 
101
- def __setitem__(self, key: type[K], value: type[V]) -> None:
102
- self._current_frame[key] = value
105
+ def __iter__(self) -> Iterator[tuple[type[K], type[V]]]:
106
+ raise NotImplementedError
103
107
 
104
- def __iter__(self):
105
- return chain(*reversed(self._frames))
108
+ def __len__(self) -> int:
109
+ raise NotImplementedError
106
110
 
107
- def __len__(self):
108
- return len(self._frames)
109
111
 
112
+ @dataclass(kw_only=True)
113
+ class Node:
114
+ """
115
+ Represents actual data in an instance of client params. Unlike just the "param", a node has a
116
+ value and a parent.
117
+
118
+ To help with evaluating conds, it also keeps track of whether it is active/inactive and has a
119
+ context that can be used to resolve relative references to other nodes.
120
+ """
121
+
122
+ name: str = ""
123
+ "Param name or key name (depending on whether this is a map or message value)"
124
+ value: Any = None
125
+ parent: Optional["Node"] = None
126
+ children: list["Node"] = field(default_factory=list)
127
+
128
+ is_active: Optional[bool] = None
129
+ context: ContextFrame[str | int, "Node"] = field(default_factory=ContextFrame)
110
130
 
111
- class CondHelper:
112
- @dataclass
113
- class _Node:
114
- """
115
- Represents an actual field in an instance of client params. Unlike the "param" it is
116
- an instance of, a node has a value, a parent, and can be active/inactive.
117
- """
118
131
 
119
- name: str
120
- "Param name"
121
- parent_name: Optional[str]
122
- "Param name of parent"
123
- value: Any
124
- is_active: Optional[bool]
132
+ class CondHelper:
125
133
 
126
134
  def __init__(self):
127
135
  self.params = ParamMap(SimulationParam)
128
- self.node_by_name = ContextMap[str, self._Node]()
129
- self.node_by_number = ContextMap[int, self._Node]()
136
+ self.nodes_by_surface: dict[str, list[Node]] = defaultdict(
137
+ list
138
+ ) # nodes with surface references
130
139
 
131
140
  def prune(self, tree: dict[str, Any]) -> dict[str, Any]:
132
141
  """
133
142
  Takes a dict of client parameters and returns a pruned tree, with inactive nodes and empty
134
143
  values removed.
135
144
  """
136
- # Scan subtree to register all nodes.
137
- self._scan_subtree(tree, None)
138
- # Then, prune, using our registered nodes to evaluate conds.
139
- return self._prune_subtree(tree)
140
-
141
- def _scan_subtree(self, subtree: dict[str, Any], parent_name: Optional[str]) -> None:
145
+ # Scan entire tree to register all nodes.
146
+ root_node = Node(is_active=True)
147
+ self._scan_tree(tree, root_node)
148
+
149
+ physics_nodes_by_id = self._physics_nodes_by_id(root_node)
150
+ material_nodes_by_id = self._material_nodes_by_id(root_node)
151
+
152
+ # Entangle physics and material nodes
153
+ self._entangle_fluid_and_heat_physics(physics_nodes_by_id)
154
+ self._entangle_physics_and_material_nodes(tree, physics_nodes_by_id, material_nodes_by_id)
155
+ self._entangle_surface_nodes()
156
+
157
+ # Finally, prune, using our registered nodes to evaluate conds.
158
+ return self._prune_helper(root_node)
159
+
160
+ def _scan_tree(
161
+ self,
162
+ tree: dict[str, Any],
163
+ parent_node: Optional[Node],
164
+ ) -> None:
142
165
  """
143
- From the root, traverses the tree to register all nodes, ignoring "repeated" and
144
- "map" fields (we will only recurse into those fields after pushing a new frame onto the node
145
- maps).
166
+ From the root, traverses the tree to register all nodes. Whenever we go down into a
167
+ "repeated" or "map" fields we push a new frame onto the context.
146
168
  """
147
- for key, value in subtree.items():
169
+ context = parent_node.context
170
+ for key, value in tree.items():
148
171
  param = self.params.by_name.get(key, None)
149
172
  if param is None:
173
+ continue # ignore non-params
174
+
175
+ node = Node(
176
+ name=key,
177
+ parent=parent_node,
178
+ value=value,
179
+ is_active=None,
180
+ context=context,
181
+ )
182
+ parent_node.children.append(node)
183
+ context[param.name] = node
184
+ context[param.number] = node
185
+
186
+ # Keep track of nodes with surface references
187
+ if is_surface_reference(param):
188
+ for surface in value: # NOTE: just going to assume it's a list of surfaces
189
+ self.nodes_by_surface[surface].append(parent_node)
190
+
191
+ if param.message_type is None or isinstance(value, str):
150
192
  continue
151
- node = self._Node(name=key, parent_name=parent_name, value=value, is_active=None)
152
193
 
153
- if param.message_type is not None and param.label != FieldDescriptor.LABEL_REPEATED:
154
- self._scan_subtree(value, param.name)
194
+ # Recurse into message types
195
+ if param.label == FieldDescriptor.LABEL_REPEATED:
196
+ # map types show up as REPEATED in descriptor
197
+ if isinstance(value, dict) and len(value) > 0:
198
+ for k, v in value.items():
199
+ new_node = Node(
200
+ name=k,
201
+ value=v,
202
+ is_active=True,
203
+ context=context.new_frame(),
204
+ ) # new frame
205
+ node.children.append(new_node)
206
+ self._scan_tree(v, new_node)
207
+ elif isinstance(value, Iterable) and len(value) > 0:
208
+ for v in value:
209
+ new_node = Node(
210
+ value=v,
211
+ is_active=True,
212
+ context=context.new_frame(),
213
+ ) # new frame
214
+ node.children.append(new_node)
215
+ self._scan_tree(v, new_node)
216
+ else:
217
+ self._scan_tree(value, node)
218
+
219
+ def _entangle_fluid_and_heat_physics(self, physics_nodes_by_id: dict[str, Node]) -> None:
220
+ """
221
+ Entangles fluid and heat physics nodes.
222
+ """
223
+ fluid_node = None
224
+ heat_node = None
225
+ for node in physics_nodes_by_id.values():
226
+ if "fluid" in node.value:
227
+ fluid_node = node
228
+ elif "heat" in node.value:
229
+ heat_node = node
230
+ if fluid_node is not None and heat_node is not None:
231
+ fluid_node.context.entangle(heat_node.context)
232
+
233
+ def _entangle_physics_and_material_nodes(
234
+ self,
235
+ root: dict[str, Any],
236
+ physics_nodes_by_id: dict[str, Node],
237
+ material_nodes_by_id: dict[str, Node],
238
+ ) -> None:
239
+ """
240
+ Entangles physics and material nodes that have a relationship with the same volume.
241
+ """
242
+ for physics_node in physics_nodes_by_id.values():
243
+ physics_id = physics_node.value["physics_identifier"]["id"]
244
+ material_id = self._get_material_id_by_physics_id(root, physics_id)
245
+ if not material_id:
246
+ continue
247
+ material_node = material_nodes_by_id[material_id]
248
+ physics_node.context.entangle(material_node.context)
155
249
 
156
- self.node_by_name[param.name] = node
157
- self.node_by_number[param.number] = node
250
+ def _entangle_surface_nodes(self) -> None:
251
+ """
252
+ Entangles any nodes that reference the same surface.
253
+ """
254
+ for node_group in self.nodes_by_surface.values():
255
+ for a, b in pairwise(node_group):
256
+ a.context.entangle(b.context)
158
257
 
159
- def _prune_subtree(self, subtree: dict[str, Any]) -> dict[str, Any]:
258
+ def _prune_helper(self, root_node: Node) -> dict[str, Any]:
160
259
  """
161
- Prunes the tree, using the node maps to evaluate the conds.
260
+ Prunes the tree, using nodes to resolve conds.
162
261
  """
163
262
  pruned_tree = dict()
164
- for key, value in subtree.items():
165
- param = self.params.by_name.get(key, None)
166
- if (
167
- param is None or key == "surface_name"
168
- ): # "surface_name" is repeated twice in the tree...
169
- pruned_tree[key] = value
263
+ for node in root_node.children:
264
+ name, value = node.name, node.value
265
+ param = self.params.by_name.get(name, None)
266
+
267
+ if param is None or name == "surface_name": # "surface_name" appears twice in the tree
268
+ pruned_tree[name] = value
170
269
  continue
171
- node = self.node_by_name[key]
270
+
172
271
  if self._is_node_active(node):
173
272
  if param.message_type is None or not str.startswith(
174
273
  param.message_type.full_name, "luminary.proto.client"
175
274
  ):
176
275
  if not (isinstance(value, Iterable) and len(value) == 0):
177
- pruned_tree[key] = value
178
- elif key == "physics":
179
- pruned_tree[key] = [self._prune_single_physics(subtree, v) for v in value]
276
+ pruned_tree[name] = value
180
277
  elif param.label == FieldDescriptor.LABEL_REPEATED:
181
278
  # map types show up as REPEATED in descriptor, so we need to distinguish
182
279
  if isinstance(value, dict) and len(value) > 0:
183
- pruned_tree[key] = {k: self._prune_repeated(v) for k, v in value.items()}
280
+ pruned_tree[name] = {n.name: self._prune_helper(n) for n in node.children}
184
281
  elif isinstance(value, Iterable) and len(value) > 0:
185
- pruned_tree[key] = [self._prune_repeated(v) for v in value]
282
+ pruned_tree[name] = [self._prune_helper(n) for n in node.children]
186
283
  else:
187
- pruned_value = self._prune_subtree(value)
188
- if len(pruned_value) > 0:
189
- pruned_tree[key] = pruned_value
284
+ pruned_value = self._prune_helper(node)
285
+ if len(pruned_value) > 0: # prune empty dicts
286
+ pruned_tree[name] = pruned_value
190
287
  return pruned_tree
191
288
 
192
- def _prune_repeated(self, value: Any) -> dict[str, Any]:
193
- """Prunes a single element of a repeated field."""
194
- if not isinstance(value, dict):
195
- return value
196
- with self.node_by_name.scope():
197
- with self.node_by_number.scope():
198
- return self.prune(value)
199
-
200
- def _prune_single_physics(
201
- self, root: dict[str, Any], physics: dict[str, Any]
202
- ) -> dict[str, Any]:
289
+ def _physics_nodes_by_id(self, root_node: Node) -> dict[str, Node]:
203
290
  """
204
- Prunes a single physics object of the repeated physics field
205
-
206
- Attempts to find the material associated with the physics, and if it finds one, scans the
207
- material subtree to register all material properties in the node context before calling
208
- prune() on the physics.
291
+ Gets a map of physics nodes by their id.
209
292
  """
210
- try:
211
- physics_id = physics["physics_identifier"]["id"]
212
- material_id = self._get_material_id_by_physics_id(root, physics_id)
213
- material = self._get_material_by_id(root, material_id)
214
- except (KeyError, StopIteration, TypeError):
215
- material = None
216
- with self.node_by_name.scope():
217
- with self.node_by_number.scope():
218
- if material is not None:
219
- self._scan_subtree(material, None)
220
- return self.prune(physics)
293
+ nodes_by_physics_id = dict()
294
+ for node in root_node.children:
295
+ if node.name == "physics":
296
+ for physics_node in node.children:
297
+ physics_id = physics_node.value["physics_identifier"]["id"]
298
+ nodes_by_physics_id[physics_id] = physics_node
299
+ return nodes_by_physics_id
300
+
301
+ def _material_nodes_by_id(self, root_node: Node) -> dict[str, Node]:
302
+ """
303
+ Gets a map of material nodes by their id.
304
+ """
305
+ nodes_by_material_id = dict()
306
+ for node in root_node.children:
307
+ if node.name == "material_entity":
308
+ for material_node in node.children:
309
+ material_id = material_node.value["material_identifier"]["id"]
310
+ nodes_by_material_id[material_id] = material_node
311
+ return nodes_by_material_id
221
312
 
222
313
  def _get_material_id_by_physics_id(
223
314
  self, root: dict[str, Any], physics_id: str
224
- ) -> dict[str, Any]:
315
+ ) -> dict[str, Any] | None:
225
316
  volume_id = self._get_volume_id_by_physics_id(root, physics_id)
317
+ if volume_id is None:
318
+ return None
226
319
  return self._get_material_id_by_volume_id(root, volume_id)
227
320
 
228
- def _get_volume_id_by_physics_id(self, root: dict[str, Any], physics_id: str) -> str:
229
- entity_relationships = root["entity_relationships"]
230
- return next(
231
- link["volume_identifier"]["id"]
232
- for link in entity_relationships["volume_physics_relationship"]
233
- if link["physics_identifier"]["id"] == physics_id
234
- )
235
-
236
- def _get_material_id_by_volume_id(self, root: dict[str, Any], volume_id: str) -> str:
237
- entity_relationships = root["entity_relationships"]
238
- return next(
239
- link["material_identifier"]["id"]
240
- for link in entity_relationships["volume_material_relationship"]
241
- if link["volume_identifier"]["id"] == volume_id
242
- )
243
-
244
- def _get_material_by_id(self, root: dict[str, Any], material_id: str) -> dict[str, Any]:
245
- return next(
246
- m for m in root["material_entity"] if m["material_identifier"]["id"] == material_id
247
- )
248
-
249
- def _is_node_active(self, node: "_Node") -> bool:
321
+ def _get_volume_id_by_physics_id(self, root: dict[str, Any], physics_id: str) -> str | None:
322
+ entity_relationships = root.get("entity_relationships")
323
+ if not entity_relationships:
324
+ return None
325
+ for link in entity_relationships.get("volume_physics_relationship", []):
326
+ if link.get("physics_identifier", {}).get("id") == physics_id:
327
+ return link.get("volume_identifier", {}).get("id")
328
+ return None
329
+
330
+ def _get_material_id_by_volume_id(self, root: dict[str, Any], volume_id: str) -> str | None:
331
+ entity_relationships = root.get("entity_relationships")
332
+ if not entity_relationships:
333
+ return None
334
+ for link in entity_relationships.get("volume_material_relationship", []):
335
+ if link.get("volume_identifier", {}).get("id") == volume_id:
336
+ return link.get("material_identifier", {}).get("id")
337
+ return None
338
+
339
+ def _is_node_active(self, node: Node) -> bool:
250
340
  """
251
341
  Checks if a node is active.
252
342
 
253
343
  Checks the parent first, and then the conds. Only does this once.
254
344
  """
255
345
  if node.is_active is None:
256
- if node.parent_name is not None:
257
- parent = self.node_by_name[node.parent_name]
258
- if not self._is_node_active(parent):
346
+ if node.parent is not None:
347
+ if not self._is_node_active(node.parent):
259
348
  node.is_active = False
260
349
  return False
261
350
  cond = get_cond(self.params.by_name[node.name])
262
- node.is_active = self._check_cond(cond)
351
+ node.is_active = self._check_cond(cond, node.context)
263
352
  return node.is_active
264
353
 
265
- def _check_cond(self, cond: conditionpb.Condition) -> bool:
354
+ def _check_cond(
355
+ self, cond: conditionpb.Condition, context: ContextFrame[str | int, Node]
356
+ ) -> bool:
266
357
  type = cond.WhichOneof("typ")
267
358
  if type is None:
268
359
  return True
269
360
  if type == "choice":
270
- return self._check_choice(cond.choice)
361
+ return self._check_choice(cond.choice, context)
271
362
  elif type == "boolean":
272
- return self._check_boolean(cond.boolean)
363
+ return self._check_boolean(cond.boolean, context)
273
364
  elif type == "allof":
274
- return all(self._check_cond(c) for c in cond.allof.cond)
365
+ return all(self._check_cond(c, context) for c in cond.allof.cond)
275
366
  elif type == "anyof":
276
- return any(self._check_cond(c) for c in cond.anyof.cond)
367
+ return any(self._check_cond(c, context) for c in cond.anyof.cond)
277
368
  elif type == "not":
278
- return not self._check_cond(getattr(cond, "not").cond)
369
+ return not self._check_cond(getattr(cond, "not").cond, context)
279
370
  elif type == "tag":
280
- return self._check_tag(cond.tag)
371
+ return self._check_tag(cond.tag, context)
281
372
  elif type == "false":
282
373
  return (
283
374
  True # CondFalse is generally used to control visibility in UI and can be ignored
284
375
  )
285
376
  return False
286
377
 
287
- def _check_choice(self, cond_choice: conditionpb.Choice) -> bool:
378
+ def _check_choice(
379
+ self, cond_choice: conditionpb.Choice, context: ContextFrame[str | int, Node]
380
+ ) -> bool:
288
381
  name = cond_choice.param_name
289
- node = self.node_by_name[name]
382
+ node = context[name]
290
383
  if node is None:
291
- param = self.params.by_name[name]
292
- return param == cond_choice.tag
384
+ return 0 == cond_choice.tag
293
385
  return self._is_node_active(node) and node.value == cond_choice.name
294
386
 
295
- def _check_boolean(self, cond_boolean: conditionpb.TrueFalse) -> bool:
387
+ def _check_boolean(
388
+ self, cond_boolean: conditionpb.TrueFalse, context: ContextFrame[str | int, Node]
389
+ ) -> bool:
296
390
  tag = cond_boolean.param_name_tag
297
- node = self.node_by_number[tag]
391
+ node = context[tag]
298
392
  if node is None:
299
- param = self.params.by_number[tag]
300
- return bool(param)
393
+ return False
301
394
  return self._is_node_active(node) and bool(node.value)
302
395
 
303
- def _check_tag(self, cond_tag: conditionpb.Tag) -> bool:
396
+ def _check_tag(self, cond_tag: conditionpb.Tag, context: ContextFrame[str | int, Node]) -> bool:
304
397
  name = cond_tag.tag_name
305
- node = self.node_by_name[name]
306
- return node is not None and self._is_node_active(node)
398
+ node = context[name]
399
+ return (node is not None) and self._is_node_active(node)
307
400
 
308
401
 
309
402
  def params_to_dict(sim_params: SimulationParam) -> dict[str, Any]:
@@ -340,3 +433,7 @@ def get_default(param: FieldDescriptor) -> Any:
340
433
  elif type == "vector3":
341
434
  return dfl.vector3
342
435
  return None
436
+
437
+
438
+ def is_surface_reference(param: FieldDescriptor) -> bool:
439
+ return param.GetOptions().Extensions[optionspb.is_geometry_surfaces]
@@ -1,13 +1,13 @@
1
1
  # Copyright 2024 Luminary Cloud, Inc. All Rights Reserved.
2
- from google.protobuf.any_pb2 import Any as AnyPB
3
2
  from google.protobuf.descriptor import FieldDescriptor
3
+ from google.protobuf.message import Message
4
4
 
5
5
  import luminarycloud._proto.base.base_pb2 as basepb
6
6
  import luminarycloud._proto.options.options_pb2 as optionspb
7
7
  from luminarycloud.types.vector3 import _to_vector3_proto
8
8
 
9
9
 
10
- def _reset_defaults(params: AnyPB) -> None:
10
+ def _reset_defaults(params: Message) -> None:
11
11
  for field in params.DESCRIPTOR.fields:
12
12
  if field.label == FieldDescriptor.LABEL_REPEATED:
13
13
  for nested in getattr(params, field.name):
@@ -18,7 +18,7 @@ def _reset_defaults(params: AnyPB) -> None:
18
18
  _reset_defaults(getattr(params, field.name))
19
19
 
20
20
 
21
- def _set_default(params: AnyPB, name: str) -> None:
21
+ def _set_default(params: Message, name: str) -> None:
22
22
  field = params.DESCRIPTOR.fields_by_name[name]
23
23
  dfl: optionspb.Value = field.GetOptions().Extensions[optionspb.default_value]
24
24
  type = dfl.WhichOneof("typ")
@@ -96,12 +96,23 @@ def download_surface_solution(
96
96
  def download_volume_solution(
97
97
  client: Client,
98
98
  solution_id: str,
99
+ single_precision: bool = False,
99
100
  ) -> FileChunkStream:
100
101
  """
101
102
  Returns the download as a file-like object.
102
103
 
103
104
  The filename can be retrieved from the `filename` attribute of the returned object.
104
105
 
106
+ Parameters
107
+ ----------
108
+ client: Client
109
+ The client to use for the download.
110
+ solution_id: str
111
+ The ID of the solution to download.
112
+ single_precision: bool
113
+ If True, the solution will be downloaded in single precision.
114
+ If False, the solution will be downloaded in double precision.
115
+
105
116
  Examples
106
117
  --------
107
118
  >>> with download_volume_solution(client, "your-solution-id") as dl:
@@ -109,7 +120,7 @@ def download_volume_solution(
109
120
  ... fp.write(dl.read())
110
121
  """
111
122
 
112
- request = GetSolutionVolumeDataRequest(id=solution_id)
123
+ request = GetSolutionVolumeDataRequest(id=solution_id, single_precision=single_precision)
113
124
  response = client.GetSolutionVolumeData(request)
114
125
  return _create_file_chunk_stream(client, solution_id, "volume solution", response.file)
115
126