luminarycloud 0.22.3__py3-none-any.whl → 0.23.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 +9 -3
- luminarycloud/_client/client.py +1 -1
- luminarycloud/_helpers/_code_representation.py +1 -0
- luminarycloud/_helpers/_create_simulation.py +5 -1
- luminarycloud/_helpers/proto_decorator.py +46 -38
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +214 -137
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +152 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +103 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +40 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +137 -63
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +166 -6
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +68 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +24 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +94 -71
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +46 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py +35 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi +16 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +25 -3
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +32 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +68 -21
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +119 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/client/simulation_pb2.py +409 -348
- luminarycloud/_proto/client/simulation_pb2.pyi +188 -27
- luminarycloud/_proto/clusterconfig/clusterconfig_pb2.py +273 -0
- luminarycloud/_proto/clusterconfig/clusterconfig_pb2.pyi +808 -0
- luminarycloud/_proto/geometry/geometry_pb2.pyi +1 -1
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +2 -2
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +68 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +24 -0
- luminarycloud/enum/__init__.py +1 -0
- luminarycloud/enum/gpu_type.py +47 -7
- luminarycloud/enum/vis_enums.py +18 -0
- luminarycloud/geometry.py +81 -0
- luminarycloud/geometry_contacts.py +222 -0
- luminarycloud/meshing/mesh_generation_params.py +4 -4
- luminarycloud/meshing/sizing_strategy/__init__.py +0 -1
- luminarycloud/meshing/sizing_strategy/sizing_strategies.py +0 -20
- luminarycloud/params/geometry/shapes.py +137 -31
- luminarycloud/params/outputs/__init__.py +0 -2
- luminarycloud/params/outputs/output.py +17 -5
- luminarycloud/params/simulation/__init__.py +2 -0
- luminarycloud/params/simulation/adaptive_mesh_refinement/active_region_.py +1 -1
- luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +1 -1
- luminarycloud/params/simulation/adaptive_mesh_refinement_.py +1 -1
- luminarycloud/params/simulation/adjoint_.py +8 -5
- luminarycloud/params/simulation/basic/gravity/gravity_off_.py +1 -1
- luminarycloud/params/simulation/basic/gravity/gravity_on_.py +1 -1
- luminarycloud/params/simulation/basic/gravity_.py +1 -1
- luminarycloud/params/simulation/body_frame_.py +1 -1
- luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +1 -1
- luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +1 -1
- luminarycloud/params/simulation/entity_relationships_.py +1 -1
- luminarycloud/params/simulation/general_.py +1 -1
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +1 -1
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +1 -1
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +1 -1
- luminarycloud/params/simulation/material/fluid/material_model/__init__.py +2 -0
- luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +1 -1
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +1 -1
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +1 -1
- luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/__init__.py +2 -0
- luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/real_gas_coolprop_.py +43 -0
- luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/real_gas_polynomial_.py +53 -0
- luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend_.py +29 -0
- luminarycloud/params/simulation/material/fluid/material_model_.py +1 -1
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +1 -1
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +1 -1
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +1 -1
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +1 -1
- luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +1 -1
- luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +1 -1
- luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +1 -1
- luminarycloud/params/simulation/material/fluid/viscosity_model_.py +1 -1
- luminarycloud/params/simulation/material/material_fluid_.py +78 -2
- luminarycloud/params/simulation/material/material_solid_.py +1 -1
- luminarycloud/params/simulation/material_entity_.py +1 -1
- luminarycloud/params/simulation/monitor_plane_.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms_.py +1 -1
- luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +1 -1
- luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +1 -1
- luminarycloud/params/simulation/motion_data/motion_type_.py +1 -1
- luminarycloud/params/simulation/motion_data_.py +1 -1
- luminarycloud/params/simulation/multi_physics_coupling_options_.py +1 -1
- luminarycloud/params/simulation/nonlinear_control/__init__.py +1 -0
- luminarycloud/params/simulation/nonlinear_control/nonlinear_control_system_.py +48 -0
- luminarycloud/params/simulation/nonlinear_control_.py +61 -0
- luminarycloud/params/simulation/output_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type_.py +1 -1
- luminarycloud/params/simulation/particle_group_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/initialization/__init__.py +1 -0
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +14 -1
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_initialization_per_zone_.py +48 -0
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +14 -1
- luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_auto_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +3 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +3 -3
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +5 -3
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence_.py +1 -1
- luminarycloud/params/simulation/physics/fluid_.py +1 -1
- luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +1 -1
- luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +1 -1
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +1 -1
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +1 -1
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +1 -1
- luminarycloud/params/simulation/physics/heat/heat_source_.py +1 -1
- luminarycloud/params/simulation/physics/heat/initialization/__init__.py +1 -0
- luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +1 -1
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values/__init__.py +1 -0
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values/heat_initialization_per_zone_.py +40 -0
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +14 -1
- luminarycloud/params/simulation/physics/heat/initialization_heat_.py +1 -1
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +1 -1
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +1 -1
- luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +1 -1
- luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +1 -1
- luminarycloud/params/simulation/physics/heat_.py +1 -1
- luminarycloud/params/simulation/physics/periodic_pair_.py +5 -1
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +1 -1
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +1 -1
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +1 -1
- luminarycloud/params/simulation/physics_.py +1 -1
- luminarycloud/params/simulation/simulation_param_.py +8 -1
- luminarycloud/params/simulation/sliding_interfaces_.py +1 -1
- luminarycloud/params/simulation/surface_name_.py +1 -1
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +1 -1
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +1 -1
- luminarycloud/params/simulation/time/compute_statistics_.py +1 -1
- luminarycloud/params/simulation/time/time_marching/time_explicit_.py +1 -1
- luminarycloud/params/simulation/time/time_marching/time_implicit_.py +1 -1
- luminarycloud/params/simulation/time/time_marching_.py +1 -1
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +1 -1
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +1 -1
- luminarycloud/params/simulation/time/time_step_ramp_.py +1 -1
- luminarycloud/params/simulation/time_.py +1 -1
- luminarycloud/params/simulation/volume_entity_.py +1 -1
- luminarycloud/physics_ai/__init__.py +9 -0
- luminarycloud/physics_ai/architectures.py +129 -17
- luminarycloud/physics_ai/datasets.py +66 -11
- luminarycloud/physics_ai/training_jobs.py +50 -4
- luminarycloud/pipelines/__init__.py +5 -4
- luminarycloud/pipelines/api.py +148 -34
- luminarycloud/pipelines/arguments.py +8 -3
- luminarycloud/pipelines/core.py +10 -72
- luminarycloud/pipelines/stages.py +28 -25
- luminarycloud/pipelines/user_code_validation.py +122 -0
- luminarycloud/project.py +0 -14
- luminarycloud/simulation.py +42 -11
- luminarycloud/simulation_param.py +0 -62
- luminarycloud/simulation_template.py +1 -11
- luminarycloud/types/adfloat.py +48 -4
- luminarycloud/types/matrix3.py +9 -9
- luminarycloud/types/vector3.py +52 -23
- luminarycloud/vis/__init__.py +3 -0
- luminarycloud/vis/visualization.py +88 -0
- luminarycloud/volume_selection.py +29 -17
- {luminarycloud-0.22.3.dist-info → luminarycloud-0.23.1.dist-info}/METADATA +1 -1
- {luminarycloud-0.22.3.dist-info → luminarycloud-0.23.1.dist-info}/RECORD +257 -244
- luminarycloud/params/outputs/residual_output.py +0 -24
- /luminarycloud/params/{simulation/_lib.py → _lib.py} +0 -0
- {luminarycloud-0.22.3.dist-info → luminarycloud-0.23.1.dist-info}/WHEEL +0 -0
|
@@ -435,7 +435,7 @@ class Pattern(google.protobuf.message.Message):
|
|
|
435
435
|
def rotation(self) -> luminarycloud._proto.cad.transformation_pb2.Rotation:
|
|
436
436
|
"""Rotation transformation."""
|
|
437
437
|
full: builtins.bool
|
|
438
|
-
"""Whether it's a full rotation: invalidates the
|
|
438
|
+
"""Whether it's a full rotation: invalidates the angle in 'rotation'."""
|
|
439
439
|
def __init__(
|
|
440
440
|
self,
|
|
441
441
|
*,
|
|
@@ -16,7 +16,7 @@ from luminarycloud._proto.api.v0.luminarycloud.physics_ai import physics_ai_pb2
|
|
|
16
16
|
from luminarycloud._proto.ratelimit import ratelimit_pb2 as proto_dot_ratelimit_dot_ratelimit__pb2
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n=proto/physicsaitrainingservice/physicsaitrainingservice.proto\x12\'luminary.proto.physicsaitrainingservice\x1a\x36proto/api/v0/luminarycloud/physics_ai/physics_ai.proto\x1a\x1fproto/ratelimit/ratelimit.proto2\
|
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n=proto/physicsaitrainingservice/physicsaitrainingservice.proto\x12\'luminary.proto.physicsaitrainingservice\x1a\x36proto/api/v0/luminarycloud/physics_ai/physics_ai.proto\x1a\x1fproto/ratelimit/ratelimit.proto2\x8b\x08\n\x18PhysicsAiTrainingService\x12\x9e\x01\n\rCreateDataset\x12\x44.luminary.proto.api.v0.luminarycloud.physics_ai.CreateDatasetRequest\x1a\x45.luminary.proto.api.v0.luminarycloud.physics_ai.CreateDatasetResponse\"\x00\x12\x9b\x01\n\x0cListDatasets\x12\x43.luminary.proto.api.v0.luminarycloud.physics_ai.ListDatasetsRequest\x1a\x44.luminary.proto.api.v0.luminarycloud.physics_ai.ListDatasetsResponse\"\x00\x12\xb4\x01\n\x11SubmitTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobResponse\"\n\x8a\xb5\x18\x06\x08\x05\x12\x02\x08\x01\x12\xaa\x01\n\x11\x43\x61ncelTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobResponse\"\x00\x12\xa1\x01\n\x0eGetTrainingJob\x12\x45.luminary.proto.api.v0.luminarycloud.physics_ai.GetTrainingJobRequest\x1a\x46.luminary.proto.api.v0.luminarycloud.physics_ai.GetTrainingJobResponse\"\x00\x12\xa7\x01\n\x10ListTrainingJobs\x12G.luminary.proto.api.v0.luminarycloud.physics_ai.ListTrainingJobsRequest\x1aH.luminary.proto.api.v0.luminarycloud.physics_ai.ListTrainingJobsResponse\"\x00\x42\x37Z5luminarycloud.com/core/proto/physicsaitrainingserviceb\x06proto3')
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
@@ -28,5 +28,5 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
28
28
|
_PHYSICSAITRAININGSERVICE.methods_by_name['SubmitTrainingJob']._options = None
|
|
29
29
|
_PHYSICSAITRAININGSERVICE.methods_by_name['SubmitTrainingJob']._serialized_options = b'\212\265\030\006\010\005\022\002\010\001'
|
|
30
30
|
_PHYSICSAITRAININGSERVICE._serialized_start=196
|
|
31
|
-
_PHYSICSAITRAININGSERVICE._serialized_end=
|
|
31
|
+
_PHYSICSAITRAININGSERVICE._serialized_end=1231
|
|
32
32
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -35,6 +35,16 @@ class PhysicsAiTrainingServiceStub(object):
|
|
|
35
35
|
request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CancelTrainingJobRequest.SerializeToString,
|
|
36
36
|
response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CancelTrainingJobResponse.FromString,
|
|
37
37
|
)
|
|
38
|
+
self.GetTrainingJob = channel.unary_unary(
|
|
39
|
+
'/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/GetTrainingJob',
|
|
40
|
+
request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobRequest.SerializeToString,
|
|
41
|
+
response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobResponse.FromString,
|
|
42
|
+
)
|
|
43
|
+
self.ListTrainingJobs = channel.unary_unary(
|
|
44
|
+
'/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/ListTrainingJobs',
|
|
45
|
+
request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsRequest.SerializeToString,
|
|
46
|
+
response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsResponse.FromString,
|
|
47
|
+
)
|
|
38
48
|
|
|
39
49
|
|
|
40
50
|
class PhysicsAiTrainingServiceServicer(object):
|
|
@@ -69,6 +79,20 @@ class PhysicsAiTrainingServiceServicer(object):
|
|
|
69
79
|
context.set_details('Method not implemented!')
|
|
70
80
|
raise NotImplementedError('Method not implemented!')
|
|
71
81
|
|
|
82
|
+
def GetTrainingJob(self, request, context):
|
|
83
|
+
"""Get a physics AI training job by ID
|
|
84
|
+
"""
|
|
85
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
86
|
+
context.set_details('Method not implemented!')
|
|
87
|
+
raise NotImplementedError('Method not implemented!')
|
|
88
|
+
|
|
89
|
+
def ListTrainingJobs(self, request, context):
|
|
90
|
+
"""List physics AI training jobs for the current user
|
|
91
|
+
"""
|
|
92
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
93
|
+
context.set_details('Method not implemented!')
|
|
94
|
+
raise NotImplementedError('Method not implemented!')
|
|
95
|
+
|
|
72
96
|
|
|
73
97
|
def add_PhysicsAiTrainingServiceServicer_to_server(servicer, server):
|
|
74
98
|
rpc_method_handlers = {
|
|
@@ -92,6 +116,16 @@ def add_PhysicsAiTrainingServiceServicer_to_server(servicer, server):
|
|
|
92
116
|
request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CancelTrainingJobRequest.FromString,
|
|
93
117
|
response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CancelTrainingJobResponse.SerializeToString,
|
|
94
118
|
),
|
|
119
|
+
'GetTrainingJob': grpc.unary_unary_rpc_method_handler(
|
|
120
|
+
servicer.GetTrainingJob,
|
|
121
|
+
request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobRequest.FromString,
|
|
122
|
+
response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobResponse.SerializeToString,
|
|
123
|
+
),
|
|
124
|
+
'ListTrainingJobs': grpc.unary_unary_rpc_method_handler(
|
|
125
|
+
servicer.ListTrainingJobs,
|
|
126
|
+
request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsRequest.FromString,
|
|
127
|
+
response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsResponse.SerializeToString,
|
|
128
|
+
),
|
|
95
129
|
}
|
|
96
130
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
97
131
|
'luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService', rpc_method_handlers)
|
|
@@ -170,3 +204,37 @@ class PhysicsAiTrainingService(object):
|
|
|
170
204
|
proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CancelTrainingJobResponse.FromString,
|
|
171
205
|
options, channel_credentials,
|
|
172
206
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
207
|
+
|
|
208
|
+
@staticmethod
|
|
209
|
+
def GetTrainingJob(request,
|
|
210
|
+
target,
|
|
211
|
+
options=(),
|
|
212
|
+
channel_credentials=None,
|
|
213
|
+
call_credentials=None,
|
|
214
|
+
insecure=False,
|
|
215
|
+
compression=None,
|
|
216
|
+
wait_for_ready=None,
|
|
217
|
+
timeout=None,
|
|
218
|
+
metadata=None):
|
|
219
|
+
return grpc.experimental.unary_unary(request, target, '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/GetTrainingJob',
|
|
220
|
+
proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobRequest.SerializeToString,
|
|
221
|
+
proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.GetTrainingJobResponse.FromString,
|
|
222
|
+
options, channel_credentials,
|
|
223
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
224
|
+
|
|
225
|
+
@staticmethod
|
|
226
|
+
def ListTrainingJobs(request,
|
|
227
|
+
target,
|
|
228
|
+
options=(),
|
|
229
|
+
channel_credentials=None,
|
|
230
|
+
call_credentials=None,
|
|
231
|
+
insecure=False,
|
|
232
|
+
compression=None,
|
|
233
|
+
wait_for_ready=None,
|
|
234
|
+
timeout=None,
|
|
235
|
+
metadata=None):
|
|
236
|
+
return grpc.experimental.unary_unary(request, target, '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/ListTrainingJobs',
|
|
237
|
+
proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsRequest.SerializeToString,
|
|
238
|
+
proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListTrainingJobsResponse.FromString,
|
|
239
|
+
options, channel_credentials,
|
|
240
|
+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
|
@@ -30,6 +30,16 @@ class PhysicsAiTrainingServiceStub:
|
|
|
30
30
|
luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CancelTrainingJobResponse,
|
|
31
31
|
]
|
|
32
32
|
"""Cancel a physics AI training job"""
|
|
33
|
+
GetTrainingJob: grpc.UnaryUnaryMultiCallable[
|
|
34
|
+
luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.GetTrainingJobRequest,
|
|
35
|
+
luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.GetTrainingJobResponse,
|
|
36
|
+
]
|
|
37
|
+
"""Get a physics AI training job by ID"""
|
|
38
|
+
ListTrainingJobs: grpc.UnaryUnaryMultiCallable[
|
|
39
|
+
luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListTrainingJobsRequest,
|
|
40
|
+
luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListTrainingJobsResponse,
|
|
41
|
+
]
|
|
42
|
+
"""List physics AI training jobs for the current user"""
|
|
33
43
|
|
|
34
44
|
class PhysicsAiTrainingServiceServicer(metaclass=abc.ABCMeta):
|
|
35
45
|
"""PhysicsAiTrainingService provides training functionality for Physics AI"""
|
|
@@ -62,5 +72,19 @@ class PhysicsAiTrainingServiceServicer(metaclass=abc.ABCMeta):
|
|
|
62
72
|
context: grpc.ServicerContext,
|
|
63
73
|
) -> luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CancelTrainingJobResponse:
|
|
64
74
|
"""Cancel a physics AI training job"""
|
|
75
|
+
@abc.abstractmethod
|
|
76
|
+
def GetTrainingJob(
|
|
77
|
+
self,
|
|
78
|
+
request: luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.GetTrainingJobRequest,
|
|
79
|
+
context: grpc.ServicerContext,
|
|
80
|
+
) -> luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.GetTrainingJobResponse:
|
|
81
|
+
"""Get a physics AI training job by ID"""
|
|
82
|
+
@abc.abstractmethod
|
|
83
|
+
def ListTrainingJobs(
|
|
84
|
+
self,
|
|
85
|
+
request: luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListTrainingJobsRequest,
|
|
86
|
+
context: grpc.ServicerContext,
|
|
87
|
+
) -> luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListTrainingJobsResponse:
|
|
88
|
+
"""List physics AI training jobs for the current user"""
|
|
65
89
|
|
|
66
90
|
def add_PhysicsAiTrainingServiceServicer_to_server(servicer: PhysicsAiTrainingServiceServicer, server: grpc.Server) -> None: ...
|
luminarycloud/enum/__init__.py
CHANGED
luminarycloud/enum/gpu_type.py
CHANGED
|
@@ -1,14 +1,54 @@
|
|
|
1
|
-
from enum import
|
|
1
|
+
from enum import Enum
|
|
2
2
|
from .._proto.api.v0.luminarycloud.simulation import simulation_pb2 as simulationpb
|
|
3
|
+
from .._proto.clusterconfig import clusterconfig_pb2 as clusterconfigpb
|
|
3
4
|
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
# We don't inherit from StrEnum because that was added in Python 3.11, but we still want to support
|
|
7
|
+
# older versions. Inheriting from str and Enum gives us the StrEnum-like behavior we want.
|
|
8
|
+
class GPUType(str, Enum):
|
|
6
9
|
"""
|
|
7
10
|
Represents a GPU type.
|
|
8
11
|
"""
|
|
9
12
|
|
|
10
|
-
UNSPECIFIED =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
UNSPECIFIED = "unspecified"
|
|
14
|
+
CPU = "cpu"
|
|
15
|
+
T4 = "t4"
|
|
16
|
+
V100 = "v100"
|
|
17
|
+
A100 = "a100"
|
|
18
|
+
A100_80 = "a100_80"
|
|
19
|
+
H100 = "h100"
|
|
20
|
+
|
|
21
|
+
def __str__(self) -> str:
|
|
22
|
+
return self.value
|
|
23
|
+
|
|
24
|
+
def _to_sim_options_gpu_type(self) -> int:
|
|
25
|
+
if self == GPUType.UNSPECIFIED:
|
|
26
|
+
return simulationpb.SimulationOptions.GPU_TYPE_UNSPECIFIED
|
|
27
|
+
elif self == GPUType.T4:
|
|
28
|
+
return simulationpb.SimulationOptions.GPU_TYPE_T4
|
|
29
|
+
elif self == GPUType.V100:
|
|
30
|
+
return simulationpb.SimulationOptions.GPU_TYPE_V100
|
|
31
|
+
elif self == GPUType.A100:
|
|
32
|
+
return simulationpb.SimulationOptions.GPU_TYPE_A100
|
|
33
|
+
elif self == GPUType.H100:
|
|
34
|
+
return simulationpb.SimulationOptions.GPU_TYPE_H100
|
|
35
|
+
else:
|
|
36
|
+
raise ValueError(f"Invalid GPU type: {self.value}")
|
|
37
|
+
|
|
38
|
+
def _to_clusterconfig_gpu_type(self) -> int:
|
|
39
|
+
if self == GPUType.UNSPECIFIED:
|
|
40
|
+
return clusterconfigpb.GPUType.UNSPECIFIED
|
|
41
|
+
elif self == GPUType.CPU:
|
|
42
|
+
return clusterconfigpb.GPUType.CPU
|
|
43
|
+
elif self == GPUType.T4:
|
|
44
|
+
return clusterconfigpb.GPUType.T4
|
|
45
|
+
elif self == GPUType.V100:
|
|
46
|
+
return clusterconfigpb.GPUType.V100
|
|
47
|
+
elif self == GPUType.A100:
|
|
48
|
+
return clusterconfigpb.GPUType.A100
|
|
49
|
+
elif self == GPUType.A100_80:
|
|
50
|
+
return clusterconfigpb.GPUType.A100_80
|
|
51
|
+
elif self == GPUType.H100:
|
|
52
|
+
return clusterconfigpb.GPUType.H100
|
|
53
|
+
else:
|
|
54
|
+
raise ValueError(f"Invalid GPU type: {self.value}")
|
luminarycloud/enum/vis_enums.py
CHANGED
|
@@ -332,3 +332,21 @@ class FieldAssociation(IntEnum):
|
|
|
332
332
|
|
|
333
333
|
POINTS = 0
|
|
334
334
|
CELLS = 1
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class ExtremaType(IntEnum):
|
|
338
|
+
"""
|
|
339
|
+
An enum to specify whether to find minimum or maximum values in an extrema query.
|
|
340
|
+
|
|
341
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
342
|
+
|
|
343
|
+
Attributes
|
|
344
|
+
----------
|
|
345
|
+
MIN
|
|
346
|
+
Find the minimum values.
|
|
347
|
+
MAX
|
|
348
|
+
Find the maximum values.
|
|
349
|
+
"""
|
|
350
|
+
|
|
351
|
+
MIN = vis_pb2.EXTREMA_TYPE_MIN
|
|
352
|
+
MAX = vis_pb2.EXTREMA_TYPE_MAX
|
luminarycloud/geometry.py
CHANGED
|
@@ -10,6 +10,8 @@ from typing import Union, Sequence
|
|
|
10
10
|
from typing_extensions import TYPE_CHECKING
|
|
11
11
|
|
|
12
12
|
import luminarycloud as lc
|
|
13
|
+
from luminarycloud.exceptions import NotFoundError
|
|
14
|
+
from luminarycloud.geometry_contacts import get_geometry_contacts
|
|
13
15
|
|
|
14
16
|
from ._client import get_default_client
|
|
15
17
|
from ._helpers._timestamp_to_datetime import timestamp_to_datetime
|
|
@@ -30,6 +32,7 @@ from .named_variable_set import NamedVariableSet, get_named_variable_set
|
|
|
30
32
|
if TYPE_CHECKING:
|
|
31
33
|
from .project import Project
|
|
32
34
|
from .geometry_version import GeometryVersion, GeometryVersionIterator
|
|
35
|
+
from .geometry_contacts import GeometryContacts
|
|
33
36
|
|
|
34
37
|
|
|
35
38
|
@ProtoWrapper(geometrypb.Geometry)
|
|
@@ -681,6 +684,84 @@ class Geometry(ProtoWrapperBase):
|
|
|
681
684
|
res: geometrypb.GetGeometryResponse = get_default_client().GetGeometry(req)
|
|
682
685
|
self._proto = res.geometry
|
|
683
686
|
|
|
687
|
+
def compute_contacts(self) -> "GeometryContacts":
|
|
688
|
+
"""
|
|
689
|
+
Compute geometry contacts for this geometry.
|
|
690
|
+
|
|
691
|
+
This initiates an asynchronous computation to identify contact surfaces
|
|
692
|
+
between bodies in the geometry. Returns a GeometryContacts object immediately,
|
|
693
|
+
which can be used to wait for completion or check status.
|
|
694
|
+
|
|
695
|
+
Returns
|
|
696
|
+
-------
|
|
697
|
+
GeometryContacts
|
|
698
|
+
The contacts object. Initially found=False. Use .wait() to block until
|
|
699
|
+
computation completes, or .refresh() to check current status.
|
|
700
|
+
|
|
701
|
+
Examples
|
|
702
|
+
--------
|
|
703
|
+
>>> geometry = lc.get_geometry("geo-123")
|
|
704
|
+
>>> contacts = geometry.compute_contacts()
|
|
705
|
+
>>> contacts.wait() # Block until computation completes
|
|
706
|
+
>>> if not contacts.operation_error:
|
|
707
|
+
... for contact in contacts.contacts:
|
|
708
|
+
... print(f"Contact {contact.id}: faces {contact.side_a} vs {contact.side_b}")
|
|
709
|
+
|
|
710
|
+
Or poll asynchronously:
|
|
711
|
+
>>> contacts = geometry.compute_contacts()
|
|
712
|
+
>>> # Do other work...
|
|
713
|
+
>>> contacts.refresh()
|
|
714
|
+
>>> if contacts.found and not contacts.operation_error:
|
|
715
|
+
... print(f"Found {len(contacts.contacts)} contacts")
|
|
716
|
+
"""
|
|
717
|
+
|
|
718
|
+
latest_geometry_version = self.latest_version()
|
|
719
|
+
|
|
720
|
+
req = geometrypb.StartComputeGeometryContactsRequest(
|
|
721
|
+
geometry_id=self.id,
|
|
722
|
+
geometry_version_id=latest_geometry_version.id,
|
|
723
|
+
project_id=self.project_id,
|
|
724
|
+
)
|
|
725
|
+
get_default_client().StartComputeGeometryContacts(req)
|
|
726
|
+
|
|
727
|
+
# Return the GeometryContacts object immediately (found=False initially)
|
|
728
|
+
contacts = get_geometry_contacts(self.id, latest_geometry_version.id, self.project_id)
|
|
729
|
+
return contacts
|
|
730
|
+
|
|
731
|
+
def get_contacts(self) -> "GeometryContacts | None":
|
|
732
|
+
"""
|
|
733
|
+
Get the computed contacts for this geometry, if available.
|
|
734
|
+
|
|
735
|
+
Returns None if contacts have not been computed yet or not found.
|
|
736
|
+
|
|
737
|
+
Returns
|
|
738
|
+
-------
|
|
739
|
+
GeometryContacts | None
|
|
740
|
+
The computed contacts, or None if not found.
|
|
741
|
+
|
|
742
|
+
Raises
|
|
743
|
+
------
|
|
744
|
+
RpcError
|
|
745
|
+
If there is an error communicating with the API (other than NotFoundError).
|
|
746
|
+
|
|
747
|
+
Examples
|
|
748
|
+
--------
|
|
749
|
+
>>> geometry = lc.get_geometry("geo-123")
|
|
750
|
+
>>> contacts = geometry.get_contacts()
|
|
751
|
+
>>> if contacts and contacts.found and not contacts.operation_error:
|
|
752
|
+
... print(f"Found {len(contacts.contacts)} contacts")
|
|
753
|
+
"""
|
|
754
|
+
latest_geometry_version = self.latest_version()
|
|
755
|
+
|
|
756
|
+
try:
|
|
757
|
+
contacts = get_geometry_contacts(self.id, latest_geometry_version.id, self.project_id)
|
|
758
|
+
if contacts.found:
|
|
759
|
+
return contacts
|
|
760
|
+
return None
|
|
761
|
+
except NotFoundError:
|
|
762
|
+
# Contacts haven't been computed yet
|
|
763
|
+
return None
|
|
764
|
+
|
|
684
765
|
def to_code(self) -> str:
|
|
685
766
|
"""
|
|
686
767
|
Returns the python code that creates (from scratch) an identical geometry.
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Copyright 2026 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from time import sleep, time
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
import luminarycloud as lc
|
|
9
|
+
from luminarycloud.exceptions import SDKException, Timeout
|
|
10
|
+
|
|
11
|
+
from ._client import get_default_client
|
|
12
|
+
from ._proto.api.v0.luminarycloud.geometry import geometry_pb2 as geometrypb
|
|
13
|
+
from ._wrapper import ProtoWrapperBase
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from .geometry import Geometry
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class GeometryContactsError(SDKException):
|
|
22
|
+
"""Raised when geometry contacts computation fails."""
|
|
23
|
+
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def wait_for_geometry_contacts(
|
|
28
|
+
geometry_id: str,
|
|
29
|
+
geometry_version_id: str,
|
|
30
|
+
project_id: str,
|
|
31
|
+
*,
|
|
32
|
+
interval_seconds: float = 2,
|
|
33
|
+
timeout_seconds: float = float("inf"),
|
|
34
|
+
) -> GeometryContacts:
|
|
35
|
+
"""
|
|
36
|
+
Waits for geometry contacts computation to complete.
|
|
37
|
+
|
|
38
|
+
Polls the GetGeometryContacts RPC until the computation is found
|
|
39
|
+
and either succeeds or fails.
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
geometry_id: str
|
|
44
|
+
The geometry ID
|
|
45
|
+
geometry_version_id: str
|
|
46
|
+
The geometry version ID
|
|
47
|
+
project_id: str
|
|
48
|
+
The project ID
|
|
49
|
+
interval_seconds: float
|
|
50
|
+
Number of seconds between polls. Default is 2 seconds.
|
|
51
|
+
timeout_seconds: float
|
|
52
|
+
Number of seconds before the operation times out.
|
|
53
|
+
Default is infinity.
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
GeometryContacts
|
|
58
|
+
The computed geometry contacts.
|
|
59
|
+
|
|
60
|
+
Raises
|
|
61
|
+
------
|
|
62
|
+
Timeout
|
|
63
|
+
If the operation times out before completion.
|
|
64
|
+
"""
|
|
65
|
+
deadline = time() + timeout_seconds
|
|
66
|
+
while True:
|
|
67
|
+
if time() >= deadline:
|
|
68
|
+
raise Timeout("Timed out waiting for geometry contacts to be computed.")
|
|
69
|
+
|
|
70
|
+
response = get_geometry_contacts(geometry_id, geometry_version_id, project_id)
|
|
71
|
+
|
|
72
|
+
if response.found:
|
|
73
|
+
if response.operation_error:
|
|
74
|
+
raise GeometryContactsError(
|
|
75
|
+
f"Geometry contacts computation failed with error. Issues: {response.issues}"
|
|
76
|
+
)
|
|
77
|
+
return response
|
|
78
|
+
|
|
79
|
+
# not yet found/complete, continue polling
|
|
80
|
+
sleep(max(0, min(interval_seconds, deadline - time())))
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class Contact:
|
|
84
|
+
"""Represents a single contact between two surfaces."""
|
|
85
|
+
|
|
86
|
+
def __init__(self, id: str, side_a: list[str], side_b: list[str]):
|
|
87
|
+
self.id = id
|
|
88
|
+
self.side_a = side_a
|
|
89
|
+
self.side_b = side_b
|
|
90
|
+
|
|
91
|
+
def __repr__(self) -> str:
|
|
92
|
+
return f"Contact(id={self.id}, " f"side_a={self.side_a}, " f"side_b={self.side_b})"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class GeometryContacts(ProtoWrapperBase):
|
|
96
|
+
_proto: "geometrypb.GetGeometryContactsResponse"
|
|
97
|
+
|
|
98
|
+
def __init__(self, proto: "geometrypb.GetGeometryContactsResponse"):
|
|
99
|
+
self._proto = proto
|
|
100
|
+
self.geometry_id: str = ""
|
|
101
|
+
self.geometry_version_id: str = ""
|
|
102
|
+
self.project_id: str = ""
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def found(self) -> bool:
|
|
106
|
+
"""Whether the contacts computation was found."""
|
|
107
|
+
return self._proto.contacts.found
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def operation_error(self) -> bool:
|
|
111
|
+
"""Whether the contacts computation encountered an error."""
|
|
112
|
+
return self._proto.contacts.operation_error
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def contacts(self) -> list[Contact]:
|
|
116
|
+
"""List of computed contacts."""
|
|
117
|
+
return [
|
|
118
|
+
Contact(
|
|
119
|
+
id=c.id,
|
|
120
|
+
side_a=list(c.side_a),
|
|
121
|
+
side_b=list(c.side_b),
|
|
122
|
+
)
|
|
123
|
+
for c in self._proto.contacts.contacts
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def issues(self) -> list:
|
|
128
|
+
"""List of issues/warnings from the computation."""
|
|
129
|
+
return list(self._proto.contacts.issues)
|
|
130
|
+
|
|
131
|
+
def geometry(self) -> "Geometry":
|
|
132
|
+
"""Get the geometry these contacts are for."""
|
|
133
|
+
return lc.get_geometry(self.geometry_id)
|
|
134
|
+
|
|
135
|
+
def refresh(self) -> "GeometryContacts":
|
|
136
|
+
"""
|
|
137
|
+
Sync the GeometryContacts object with the backend.
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
GeometryContacts
|
|
142
|
+
Updated contacts consistent with the backend.
|
|
143
|
+
"""
|
|
144
|
+
self._proto = get_geometry_contacts(
|
|
145
|
+
self.geometry_id, self.geometry_version_id, self.project_id
|
|
146
|
+
)._proto
|
|
147
|
+
return self
|
|
148
|
+
|
|
149
|
+
def wait(
|
|
150
|
+
self,
|
|
151
|
+
*,
|
|
152
|
+
interval_seconds: float = 2,
|
|
153
|
+
timeout_seconds: float = float("inf"),
|
|
154
|
+
) -> bool:
|
|
155
|
+
"""
|
|
156
|
+
Wait until the geometry contacts computation has either completed or failed.
|
|
157
|
+
|
|
158
|
+
Mutates self with the final status and results.
|
|
159
|
+
|
|
160
|
+
Parameters
|
|
161
|
+
----------
|
|
162
|
+
interval_seconds : float, optional
|
|
163
|
+
Number of seconds between polls. Default is 2 seconds.
|
|
164
|
+
timeout_seconds : float, optional
|
|
165
|
+
Number of seconds before timeout.
|
|
166
|
+
|
|
167
|
+
Returns
|
|
168
|
+
-------
|
|
169
|
+
bool
|
|
170
|
+
True if computation completed without error, False if operation_error is True.
|
|
171
|
+
"""
|
|
172
|
+
computed_contacts = wait_for_geometry_contacts(
|
|
173
|
+
self.geometry_id,
|
|
174
|
+
self.geometry_version_id,
|
|
175
|
+
self.project_id,
|
|
176
|
+
interval_seconds=interval_seconds,
|
|
177
|
+
timeout_seconds=timeout_seconds,
|
|
178
|
+
)
|
|
179
|
+
# Update self with the final results
|
|
180
|
+
self._proto = computed_contacts._proto
|
|
181
|
+
return self.operation_error is False
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def get_geometry_contacts(
|
|
185
|
+
geometry_id: str,
|
|
186
|
+
geometry_version_id: str,
|
|
187
|
+
project_id: str,
|
|
188
|
+
) -> GeometryContacts:
|
|
189
|
+
"""
|
|
190
|
+
Get computed contacts for a specific geometry version.
|
|
191
|
+
|
|
192
|
+
Parameters
|
|
193
|
+
----------
|
|
194
|
+
geometry_id : str
|
|
195
|
+
The geometry ID
|
|
196
|
+
geometry_version_id : str
|
|
197
|
+
The geometry version ID
|
|
198
|
+
project_id : str
|
|
199
|
+
The project ID
|
|
200
|
+
|
|
201
|
+
Returns
|
|
202
|
+
-------
|
|
203
|
+
GeometryContacts
|
|
204
|
+
The contacts information (may indicate not found if not yet computed)
|
|
205
|
+
|
|
206
|
+
Examples
|
|
207
|
+
--------
|
|
208
|
+
>>> contacts = lc.get_geometry_contacts("geo-123", "gv-456")
|
|
209
|
+
>>> if contacts.found:
|
|
210
|
+
... print(f"Found {len(contacts.contacts)} contacts")
|
|
211
|
+
"""
|
|
212
|
+
req = geometrypb.GetGeometryContactsRequest(
|
|
213
|
+
geometry_id=geometry_id,
|
|
214
|
+
geometry_version_id=geometry_version_id,
|
|
215
|
+
project_id=project_id,
|
|
216
|
+
)
|
|
217
|
+
res = get_default_client().GetGeometryContacts(req)
|
|
218
|
+
contacts = GeometryContacts(res)
|
|
219
|
+
contacts.geometry_id = geometry_id
|
|
220
|
+
contacts.geometry_version_id = geometry_version_id
|
|
221
|
+
contacts.project_id = project_id
|
|
222
|
+
return contacts
|
|
@@ -15,7 +15,7 @@ from ..params.geometry import (
|
|
|
15
15
|
Volume,
|
|
16
16
|
)
|
|
17
17
|
from ..types import Vector3
|
|
18
|
-
from .sizing_strategy import MaxCount, Minimal,
|
|
18
|
+
from .sizing_strategy import MaxCount, Minimal, SizingStrategy, TargetCount
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
@dataclass(kw_only=True)
|
|
@@ -108,7 +108,7 @@ class RefinementRegion:
|
|
|
108
108
|
proto.h_limit = self.h_limit
|
|
109
109
|
if isinstance(self.shape, Sphere):
|
|
110
110
|
proto.sphere.center_float.CopyFrom(self.shape.center._to_base_proto())
|
|
111
|
-
proto.sphere.radius_float = self.shape.radius
|
|
111
|
+
proto.sphere.radius_float = float(self.shape.radius)
|
|
112
112
|
elif isinstance(self.shape, SphereShell):
|
|
113
113
|
proto.sphere_shell.center.CopyFrom(self.shape.center._to_base_proto())
|
|
114
114
|
proto.sphere_shell.radius = self.shape.radius
|
|
@@ -125,7 +125,7 @@ class RefinementRegion:
|
|
|
125
125
|
elif isinstance(self.shape, Cylinder):
|
|
126
126
|
proto.cylinder.start_float.CopyFrom(self.shape.start._to_base_proto())
|
|
127
127
|
proto.cylinder.end_float.CopyFrom(self.shape.end._to_base_proto())
|
|
128
|
-
proto.cylinder.radius_float = self.shape.radius
|
|
128
|
+
proto.cylinder.radius_float = float(self.shape.radius)
|
|
129
129
|
elif isinstance(self.shape, AnnularCylinder):
|
|
130
130
|
proto.annular_cylinder.start.CopyFrom(self.shape.start._to_base_proto())
|
|
131
131
|
proto.annular_cylinder.end.CopyFrom(self.shape.end._to_base_proto())
|
|
@@ -178,7 +178,7 @@ class MeshGenerationParams:
|
|
|
178
178
|
)
|
|
179
179
|
)
|
|
180
180
|
|
|
181
|
-
if isinstance(self.sizing_strategy,
|
|
181
|
+
if isinstance(self.sizing_strategy, Minimal):
|
|
182
182
|
proto.mesh_complexity_params.type = (
|
|
183
183
|
meshpb.MeshGenerationParams.MeshComplexityParams.ComplexityType.MIN
|
|
184
184
|
)
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
|
|
3
|
-
from luminarycloud._helpers.warnings.deprecated import deprecated
|
|
4
|
-
|
|
5
3
|
|
|
6
4
|
@dataclass
|
|
7
5
|
class SizingStrategy:
|
|
@@ -10,24 +8,6 @@ class SizingStrategy:
|
|
|
10
8
|
pass
|
|
11
9
|
|
|
12
10
|
|
|
13
|
-
@deprecated(
|
|
14
|
-
"Use luminarycloud.meshing.sizing_strategy.Minimal instead.",
|
|
15
|
-
"0.10.2",
|
|
16
|
-
)
|
|
17
|
-
@dataclass
|
|
18
|
-
class MinimalCount(SizingStrategy):
|
|
19
|
-
"""
|
|
20
|
-
Minimal sizing strategy parameters.
|
|
21
|
-
|
|
22
|
-
If this is used, all other meshing parameters are ignored.
|
|
23
|
-
|
|
24
|
-
.. deprecated:: 0.10.2
|
|
25
|
-
Use [`Minimal()`](#luminarycloud.meshing.sizing_strategy.Minimal) instead.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
pass
|
|
29
|
-
|
|
30
|
-
|
|
31
11
|
@dataclass
|
|
32
12
|
class Minimal(SizingStrategy):
|
|
33
13
|
"""
|