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