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.
- luminarycloud/_helpers/cond.py +262 -165
- luminarycloud/_helpers/defaults.py +3 -3
- luminarycloud/_helpers/download.py +12 -1
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +69 -47
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +45 -1
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +86 -65
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +38 -1
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +12 -12
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +5 -1
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.py +2 -1
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.pyi +6 -2
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.py +14 -14
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.pyi +5 -1
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +170 -85
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +215 -10
- luminarycloud/_proto/assistant/assistant_pb2.py +177 -21
- luminarycloud/_proto/assistant/assistant_pb2.pyi +380 -7
- luminarycloud/_proto/client/simulation_pb2.py +705 -521
- luminarycloud/_proto/client/simulation_pb2.pyi +552 -35
- luminarycloud/_proto/geometry/geometry_pb2.py +74 -40
- luminarycloud/_proto/geometry/geometry_pb2.pyi +68 -4
- luminarycloud/_proto/hexmesh/hexmesh_pb2.py +321 -0
- luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +648 -0
- luminarycloud/_proto/options/options_pb2.py +9 -5
- luminarycloud/_proto/options/options_pb2.pyi +4 -0
- luminarycloud/_proto/output/reference_values_pb2.py +22 -5
- luminarycloud/_proto/output/reference_values_pb2.pyi +1 -1
- luminarycloud/_proto/quantity/quantity_options_pb2.py +28 -4
- luminarycloud/_proto/quantity/quantity_options_pb2.pyi +58 -1
- luminarycloud/_proto/quantity/quantity_pb2.py +162 -159
- luminarycloud/_proto/quantity/quantity_pb2.pyi +2 -0
- luminarycloud/enum/vis_enums.py +82 -2
- luminarycloud/geometry.py +22 -5
- luminarycloud/meshing/mesh_generation_params.py +8 -2
- luminarycloud/params/__init__.py +1 -2
- luminarycloud/params/enum/_enum_wrappers.py +1184 -3
- luminarycloud/params/outputs/output.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/__init__.py +15 -14
- luminarycloud/params/{param_wrappers → simulation}/_lib.py +2 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement/boundary_layer_profile_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/adjoint_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/gravity_off_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/gravity_on_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/body_frame_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/volume_material_relationship_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/volume_physics_relationship_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships_.py +6 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/general_.py +8 -10
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/boussinesq_off_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/boussinesq_on_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/ideal_gas_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/incompressible_fluid_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/incompressible_fluid_with_energy_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/sutherland_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/material_fluid_.py +32 -40
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/material_solid_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material_entity_.py +6 -10
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/monitor_plane_.py +10 -5
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/no_transform_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/rotational_transform_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/translational_transform_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/constant_angular_motion_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/constant_translation_motion_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data_.py +16 -20
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/multi_physics_coupling_options_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/output_.py +2 -2
- 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
- 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
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +2 -2
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +49 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_line_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/probe_points_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/source_points_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group_.py +20 -17
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/adjoint_controls_fluid_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/basic_fluid_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/__init__.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +111 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/__init__.py +4 -3
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +4 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +55 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +8 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +8 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +104 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet_.py +14 -14
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/symmetry_.py +4 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +50 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/slip_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/wall_energy_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/wall_momentum_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall_.py +18 -18
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions_fluid_.py +9 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization/__init__.py +1 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization/fluid_existing_solution_.py +4 -6
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +65 -0
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +77 -0
- luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +44 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/initialization_fluid_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +12 -8
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +6 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +8 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +6 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +8 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +8 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior_.py +34 -29
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/porous_behavior_.py +14 -10
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +4 -4
- 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
- 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
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +16 -16
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls_fluid_.py +14 -14
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/fds_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +6 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization_fluid_.py +20 -18
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/ddes_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/iddes_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst_.py +10 -12
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras_.py +10 -12
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence_.py +22 -32
- luminarycloud/params/simulation/physics/fluid_.py +233 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/adjoint_controls_heat_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_convection_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_symmetry_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions_heat_.py +9 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -4
- 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
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source_.py +20 -17
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/heat_existing_solution_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/heat_prescribed_values_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization_heat_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +10 -10
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls_heat_.py +6 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/spatial_discretization_heat_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat_.py +33 -42
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +5 -7
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/translational_periodicity_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair_.py +8 -10
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/gauss_seidel_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics_.py +6 -6
- luminarycloud/params/{param_wrappers → simulation}/simulation_param_.py +34 -40
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/sliding_interfaces_.py +10 -5
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/surface_name_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/compute_statistics_off_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/compute_statistics_on_.py +4 -6
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/time_explicit_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/time_implicit_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/time_step_ramp_off_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/time_step_ramp_on_.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp_.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time_.py +20 -30
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/volume_entity_.py +2 -2
- luminarycloud/project.py +63 -7
- luminarycloud/reference_values.py +1 -1
- luminarycloud/simulation.py +13 -2
- luminarycloud/simulation_param.py +8 -8
- luminarycloud/solution.py +7 -1
- luminarycloud/types/vector3.py +28 -2
- luminarycloud/vis/__init__.py +6 -1
- luminarycloud/vis/display.py +101 -51
- luminarycloud/vis/filters.py +384 -15
- luminarycloud/vis/interactive_scene.py +46 -23
- luminarycloud/vis/visualization.py +204 -58
- {luminarycloud-0.13.0.dist-info → luminarycloud-0.14.0.dist-info}/METADATA +1 -2
- luminarycloud-0.14.0.dist-info/RECORD +466 -0
- luminarycloud/params/param_wrappers/__init__.py +0 -2
- luminarycloud/params/param_wrappers/simulation_param/particle_group/particle_group_type/actuator_disk_.py +0 -51
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/farfield_.py +0 -197
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/inlet_.py +0 -189
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/__init__.py +0 -4
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/__init__.py +0 -5
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_komega_variables_.py +0 -37
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_turbulent_viscosity_and_intensity_komega_.py +0 -33
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega/bc_turbulent_viscosity_ratio_and_intensity_komega_.py +0 -33
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/komega_boundary_conditions_.py +0 -25
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/__init__.py +0 -3
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_sa_variable_.py +0 -33
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_turbulent_viscosity_ratio_sa_.py +0 -31
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras/bc_turbulent_viscosity_sa_.py +0 -31
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence/spalart_allmaras_boundary_conditions_.py +0 -25
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +0 -65
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/fluid_farfield_values_.py +0 -173
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/fluid_prescribed_values_.py +0 -185
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/__init__.py +0 -4
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/__init__.py +0 -5
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_farfield_values_komega_.py +0 -30
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_turbulent_viscosity_and_intensity_komega_.py +0 -33
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega/init_turbulent_viscosity_ratio_and_intensity_komega_.py +0 -33
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/komega_initialization_.py +0 -25
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/__init__.py +0 -4
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_farfield_values_sa_.py +0 -30
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_sa_variable_.py +0 -31
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_turbulent_viscosity_ratio_sa_.py +0 -31
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras/init_turbulent_viscosity_sa_.py +0 -31
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence/spalart_allmaras_initialization_.py +0 -25
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid/initialization/turbulence_initialization_.py +0 -69
- luminarycloud/params/param_wrappers/simulation_param/physics/fluid_.py +0 -438
- luminarycloud-0.13.0.dist-info/RECORD +0 -487
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/adaptive_mesh_refinement/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/basic/gravity/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/entity_relationships/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/__init__.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/boussinesq_approximation/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/material_model/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/thermal_conductivity_model/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/material/fluid/viscosity_model/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/frame_transforms/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/motion_data/motion_type/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/__init__.py +3 -3
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/__init__.py +8 -8
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/outlet/outlet_strategy/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/energy/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/boundary_conditions/wall/momentum/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/solution_controls/pseudo_time_step_method/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/spatial_discretization/convective_scheme_order/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/__init__.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/des_formulation/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/komega_sst/constants/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/spalart_allmaras/constants/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/fluid/turbulence/sub_grid_scale_model/__init__.py +2 -2
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/__init__.py +4 -4
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/boundary_conditions/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/heat_source/heat_source_type/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/initialization/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/heat/solution_controls/heat_relaxation_method/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/periodic_pair/periodicity_type/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/physics/solution_controls/linear_solver_type/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/compute_statistics/__init__.py +0 -0
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_marching/__init__.py +1 -1
- luminarycloud/params/{param_wrappers/simulation_param → simulation}/time/time_step_ramp/__init__.py +1 -1
- {luminarycloud-0.13.0.dist-info → luminarycloud-0.14.0.dist-info}/WHEEL +0 -0
luminarycloud/_helpers/cond.py
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
# type: ignore
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from
|
|
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
|
|
53
|
+
class ContextFrame(Mapping[K, V]):
|
|
53
54
|
"""
|
|
54
|
-
A utility class which implements a Mapping (i.e. dict) interface as a
|
|
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
|
|
57
|
-
|
|
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
|
-
|
|
61
|
-
|
|
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.
|
|
65
|
-
self.
|
|
66
|
+
self.__id = uuid4()
|
|
67
|
+
self.__current_frame = dict()
|
|
68
|
+
self.__parent_frames = []
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
102
|
-
|
|
105
|
+
def __iter__(self) -> Iterator[tuple[type[K], type[V]]]:
|
|
106
|
+
raise NotImplementedError
|
|
103
107
|
|
|
104
|
-
def
|
|
105
|
-
|
|
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
|
-
|
|
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.
|
|
129
|
-
|
|
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
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
|
144
|
-
"map" fields
|
|
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
|
-
|
|
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
|
-
|
|
154
|
-
|
|
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
|
-
|
|
157
|
-
|
|
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
|
|
258
|
+
def _prune_helper(self, root_node: Node) -> dict[str, Any]:
|
|
160
259
|
"""
|
|
161
|
-
Prunes the tree, using
|
|
260
|
+
Prunes the tree, using nodes to resolve conds.
|
|
162
261
|
"""
|
|
163
262
|
pruned_tree = dict()
|
|
164
|
-
for
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
pruned_tree[
|
|
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
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
282
|
+
pruned_tree[name] = [self._prune_helper(n) for n in node.children]
|
|
186
283
|
else:
|
|
187
|
-
pruned_value = self.
|
|
188
|
-
if len(pruned_value) > 0:
|
|
189
|
-
pruned_tree[
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
if link
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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.
|
|
257
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
382
|
+
node = context[name]
|
|
290
383
|
if node is None:
|
|
291
|
-
|
|
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(
|
|
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 =
|
|
391
|
+
node = context[tag]
|
|
298
392
|
if node is None:
|
|
299
|
-
|
|
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 =
|
|
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:
|
|
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:
|
|
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
|
|