luminarycloud 0.22.2__py3-none-any.whl → 0.23.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- luminarycloud/__init__.py +9 -3
- luminarycloud/_client/client.py +1 -1
- luminarycloud/_client/retry_interceptor.py +13 -2
- 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/named_variable_set/named_variable_set_pb2.py +25 -3
- luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +30 -0
- 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 +155 -59
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +252 -22
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +102 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +36 -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 +405 -346
- luminarycloud/_proto/client/simulation_pb2.pyi +175 -21
- 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/lcstatus/details/geometry/geometry_pb2.py +256 -0
- luminarycloud/_proto/lcstatus/details/geometry/geometry_pb2.pyi +472 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +2 -2
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +102 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +36 -0
- luminarycloud/_proto/quantity/quantity_pb2.pyi +1 -1
- luminarycloud/enum/__init__.py +1 -0
- luminarycloud/enum/gpu_type.py +42 -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 +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +1 -1
- 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 +1 -1
- 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 +17 -0
- luminarycloud/physics_ai/architectures.py +130 -18
- luminarycloud/physics_ai/datasets.py +301 -0
- luminarycloud/physics_ai/training_jobs.py +50 -4
- luminarycloud/pipelines/__init__.py +16 -4
- luminarycloud/pipelines/api.py +192 -17
- luminarycloud/pipelines/arguments.py +8 -3
- luminarycloud/pipelines/core.py +296 -45
- luminarycloud/pipelines/flowables.py +138 -0
- luminarycloud/pipelines/stages.py +34 -55
- 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.2.dist-info → luminarycloud-0.23.0.dist-info}/METADATA +1 -1
- {luminarycloud-0.22.2.dist-info → luminarycloud-0.23.0.dist-info}/RECORD +266 -249
- luminarycloud/params/outputs/residual_output.py +0 -24
- /luminarycloud/params/{simulation/_lib.py → _lib.py} +0 -0
- {luminarycloud-0.22.2.dist-info → luminarycloud-0.23.0.dist-info}/WHEEL +0 -0
|
@@ -1,33 +1,9 @@
|
|
|
1
1
|
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
|
|
4
|
-
from .core import
|
|
4
|
+
from .core import StandardStage, StageInputs, StageOutputs
|
|
5
|
+
from .flowables import PipelineOutputGeometry, PipelineOutputMesh, PipelineOutputSimulation
|
|
5
6
|
from .parameters import BoolPipelineParameter, StringPipelineParameter, IntPipelineParameter
|
|
6
|
-
from ..meshing import MeshGenerationParams
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# Concrete PipelineOutput classes, i.e. the things that can "flow" in a Pipeline
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class PipelineOutputGeometry(PipelineOutput):
|
|
13
|
-
"""A representation of a Geometry in a Pipeline."""
|
|
14
|
-
|
|
15
|
-
pass
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class PipelineOutputMesh(PipelineOutput):
|
|
19
|
-
"""A representation of a Mesh in a Pipeline."""
|
|
20
|
-
|
|
21
|
-
pass
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class PipelineOutputSimulation(PipelineOutput):
|
|
25
|
-
"""A representation of a Simulation in a Pipeline."""
|
|
26
|
-
|
|
27
|
-
pass
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# Stages
|
|
31
7
|
|
|
32
8
|
|
|
33
9
|
@dataclass
|
|
@@ -39,7 +15,7 @@ class ReadGeometryOutputs(StageOutputs):
|
|
|
39
15
|
"""
|
|
40
16
|
|
|
41
17
|
|
|
42
|
-
class ReadGeometry(
|
|
18
|
+
class ReadGeometry(StandardStage[ReadGeometryOutputs]):
|
|
43
19
|
"""
|
|
44
20
|
Reads a Geometry into the Pipeline.
|
|
45
21
|
|
|
@@ -93,19 +69,19 @@ class ReadMeshOutputs(StageOutputs):
|
|
|
93
69
|
"""
|
|
94
70
|
|
|
95
71
|
|
|
96
|
-
class ReadMesh(
|
|
72
|
+
class ReadMesh(StandardStage[ReadMeshOutputs]):
|
|
97
73
|
"""
|
|
98
74
|
Reads a Mesh into the Pipeline.
|
|
99
75
|
|
|
76
|
+
Does not complete until the Mesh is ready for simulation. Fails if the meshing job completes
|
|
77
|
+
with errors.
|
|
78
|
+
|
|
100
79
|
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
101
80
|
|
|
102
81
|
Parameters
|
|
103
82
|
----------
|
|
104
83
|
mesh_id : str | StringPipelineParameter
|
|
105
84
|
The ID of the Mesh to retrieve.
|
|
106
|
-
wait_timeout_seconds : int | IntPipelineParameter | None
|
|
107
|
-
The number of seconds to wait for the Mesh to be ready. If None, defaults to 1800 seconds
|
|
108
|
-
(30 minutes).
|
|
109
85
|
|
|
110
86
|
Outputs
|
|
111
87
|
-------
|
|
@@ -118,57 +94,60 @@ class ReadMesh(Stage[ReadMeshOutputs]):
|
|
|
118
94
|
*,
|
|
119
95
|
stage_name: str | None = None,
|
|
120
96
|
mesh_id: str | StringPipelineParameter,
|
|
121
|
-
wait_timeout_seconds: int | IntPipelineParameter | None = None,
|
|
122
97
|
):
|
|
123
|
-
if wait_timeout_seconds is None:
|
|
124
|
-
wait_timeout_seconds = 30 * 60
|
|
125
98
|
super().__init__(
|
|
126
99
|
stage_name,
|
|
127
|
-
{"mesh_id": mesh_id
|
|
100
|
+
{"mesh_id": mesh_id},
|
|
128
101
|
StageInputs(self),
|
|
129
102
|
ReadMeshOutputs._instantiate_for(self),
|
|
130
103
|
)
|
|
131
104
|
|
|
132
105
|
|
|
133
106
|
@dataclass
|
|
134
|
-
class
|
|
135
|
-
|
|
136
|
-
"""
|
|
107
|
+
class WaitForMeshOutputs(StageOutputs):
|
|
108
|
+
mesh: PipelineOutputMesh
|
|
109
|
+
"""
|
|
110
|
+
The Mesh that will be waited for.
|
|
111
|
+
"""
|
|
137
112
|
|
|
138
113
|
|
|
139
|
-
|
|
140
|
-
class ModifyGeometry(Stage[ModifyGeometryOutputs]):
|
|
114
|
+
class WaitForMesh(StandardStage[WaitForMeshOutputs]):
|
|
141
115
|
"""
|
|
142
|
-
|
|
116
|
+
Waits for a Mesh to be ready.
|
|
117
|
+
|
|
118
|
+
This is useful if you have a more complicated meshing setup than the `Mesh` stage can handle.
|
|
119
|
+
|
|
120
|
+
For example, you can use a `RunScript` stage to call `lc.create_or_get_mesh()` with arbitrary
|
|
121
|
+
meshing parameters, then pass the resulting mesh to this stage to wait for it to be ready.
|
|
122
|
+
Mesh creation can take minutes to hours, and `RunScript` has a short timeout, so you can't wait
|
|
123
|
+
for it to complete in the `RunScript` stage, but `lc.create_or_get_mesh()` returns immediately
|
|
124
|
+
and mesh creation happens asynchronously, so you can wait for it to be ready in this stage.
|
|
143
125
|
|
|
144
126
|
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
145
127
|
|
|
146
128
|
Parameters
|
|
147
129
|
----------
|
|
148
|
-
|
|
149
|
-
The
|
|
150
|
-
geometry : PipelineOutputGeometry
|
|
151
|
-
The Geometry to modify.
|
|
130
|
+
mesh : PipelineOutputMesh
|
|
131
|
+
The Mesh to wait for.
|
|
152
132
|
|
|
153
133
|
Outputs
|
|
154
134
|
-------
|
|
155
|
-
|
|
156
|
-
The
|
|
135
|
+
mesh : PipelineOutputMesh
|
|
136
|
+
The same Mesh that was passed in as input. It will now be in a `COMPLETED` status, and ready
|
|
137
|
+
to be used in a Simulation.
|
|
157
138
|
"""
|
|
158
139
|
|
|
159
140
|
def __init__(
|
|
160
141
|
self,
|
|
161
142
|
*,
|
|
162
143
|
stage_name: str | None = None,
|
|
163
|
-
|
|
164
|
-
geometry: PipelineOutputGeometry,
|
|
144
|
+
mesh: PipelineOutputMesh,
|
|
165
145
|
):
|
|
166
|
-
raise NotImplementedError("ModifyGeometry is not implemented yet.")
|
|
167
146
|
super().__init__(
|
|
168
147
|
stage_name,
|
|
169
|
-
{
|
|
170
|
-
StageInputs(self,
|
|
171
|
-
|
|
148
|
+
{},
|
|
149
|
+
StageInputs(self, mesh=(PipelineOutputMesh, mesh)),
|
|
150
|
+
WaitForMeshOutputs._instantiate_for(self),
|
|
172
151
|
)
|
|
173
152
|
|
|
174
153
|
|
|
@@ -178,7 +157,7 @@ class MeshOutputs(StageOutputs):
|
|
|
178
157
|
"""The Mesh generated from the given Geometry."""
|
|
179
158
|
|
|
180
159
|
|
|
181
|
-
class Mesh(
|
|
160
|
+
class Mesh(StandardStage[MeshOutputs]):
|
|
182
161
|
"""
|
|
183
162
|
Generates a Mesh from a Geometry.
|
|
184
163
|
|
|
@@ -224,7 +203,7 @@ class SimulateOutputs(StageOutputs):
|
|
|
224
203
|
"""The Simulation."""
|
|
225
204
|
|
|
226
205
|
|
|
227
|
-
class Simulate(
|
|
206
|
+
class Simulate(StandardStage[SimulateOutputs]):
|
|
228
207
|
"""
|
|
229
208
|
Runs a Simulation.
|
|
230
209
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
import builtins
|
|
5
|
+
import inspect
|
|
6
|
+
import symtable
|
|
7
|
+
import textwrap
|
|
8
|
+
import types
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Callable, Iterable, Union
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
PROVIDED_GLOBALS = {"luminarycloud", "lc"}
|
|
14
|
+
ALL_ALLOWED_GLOBALS = set(dir(builtins)) | PROVIDED_GLOBALS
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class ValidatedFunction:
|
|
19
|
+
"""Result of validation."""
|
|
20
|
+
|
|
21
|
+
source: str
|
|
22
|
+
entrypoint: str
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class FunctionValidationError(ValueError):
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _param_name_set(fn_node: ast.FunctionDef | ast.AsyncFunctionDef) -> frozenset[str]:
|
|
30
|
+
"""
|
|
31
|
+
Return the set of parameter names for the function, excluding kwargs.
|
|
32
|
+
"""
|
|
33
|
+
a = fn_node.args
|
|
34
|
+
if a.posonlyargs:
|
|
35
|
+
raise FunctionValidationError("Positional-only arguments are not supported.")
|
|
36
|
+
if a.vararg:
|
|
37
|
+
raise FunctionValidationError("Variable-length arguments are not supported.")
|
|
38
|
+
return frozenset(x.arg for x in a.args)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def validate_portable_top_level_function(
|
|
42
|
+
fn: Callable | str,
|
|
43
|
+
*,
|
|
44
|
+
must_have_params: set[str],
|
|
45
|
+
can_have_params: set[str],
|
|
46
|
+
) -> ValidatedFunction:
|
|
47
|
+
"""
|
|
48
|
+
Validate that `fn` is a function which has no freevars and no globals beyond builtins, and
|
|
49
|
+
comports with the given must_have_params and can_have_params.
|
|
50
|
+
|
|
51
|
+
Raises FunctionValidationError on any violation.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
if isinstance(fn, str):
|
|
55
|
+
src = textwrap.dedent(fn)
|
|
56
|
+
else:
|
|
57
|
+
try:
|
|
58
|
+
source_lines, _ = inspect.getsourcelines(fn)
|
|
59
|
+
except (OSError, IOError, TypeError) as exc:
|
|
60
|
+
raise ValueError(f"Unable to retrieve source for function: {exc}") from exc
|
|
61
|
+
# Drop decorator lines (everything before the `def`)
|
|
62
|
+
for i, line in enumerate(source_lines):
|
|
63
|
+
if line.lstrip().startswith("def "):
|
|
64
|
+
source_lines = source_lines[i:]
|
|
65
|
+
break
|
|
66
|
+
src = textwrap.dedent("".join(source_lines))
|
|
67
|
+
if not src.endswith("\n"):
|
|
68
|
+
src += "\n"
|
|
69
|
+
parsed = ast.parse(src, filename="<string>", mode="exec")
|
|
70
|
+
body = parsed.body
|
|
71
|
+
|
|
72
|
+
if len(body) != 1 or not isinstance(body[0], ast.FunctionDef):
|
|
73
|
+
found = [type(n).__name__ for n in body]
|
|
74
|
+
raise FunctionValidationError(
|
|
75
|
+
"Code must contain exactly one top-level function definition and nothing else at the top level. "
|
|
76
|
+
f"Found top-level items: {found}"
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
fn_node = body[0]
|
|
80
|
+
fn_name = fn_node.name
|
|
81
|
+
|
|
82
|
+
actual_params = _param_name_set(fn_node)
|
|
83
|
+
|
|
84
|
+
if actual_params - can_have_params != must_have_params:
|
|
85
|
+
raise FunctionValidationError(
|
|
86
|
+
f"Parameter mismatch for function {fn_name!r}.\n"
|
|
87
|
+
f"Your function takes: {sorted(actual_params)}\n"
|
|
88
|
+
f"It must take all stage inputs and params: {sorted(must_have_params)}\n"
|
|
89
|
+
f"It can also take these implicit params: {sorted(can_have_params)}\n"
|
|
90
|
+
f"Your function's extra params are: {sorted(actual_params - must_have_params - can_have_params)}\n"
|
|
91
|
+
f"Your function's missing params are: {sorted(must_have_params - actual_params)}"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
st = symtable.symtable(src, filename="<string>", compile_type="exec")
|
|
95
|
+
|
|
96
|
+
# Find the function's symbol table (top-level child)
|
|
97
|
+
fn_st = None
|
|
98
|
+
for child in st.get_children():
|
|
99
|
+
if child.get_type() == "function" and child.get_name() == fn_name:
|
|
100
|
+
fn_st = child
|
|
101
|
+
break
|
|
102
|
+
if fn_st is None:
|
|
103
|
+
# This should not happen given the AST check, but keep it explicit.
|
|
104
|
+
raise FunctionValidationError(f"Could not locate symbol table for {fn_name!r}")
|
|
105
|
+
|
|
106
|
+
freevars = [s.get_name() for s in fn_st.get_symbols() if s.is_free()]
|
|
107
|
+
if freevars:
|
|
108
|
+
raise FunctionValidationError(
|
|
109
|
+
f"Function {fn_name!r} closes over nonlocals/free variables: {sorted(set(freevars))}"
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
globals_used = [s.get_name() for s in fn_st.get_symbols() if s.is_global()]
|
|
113
|
+
disallowed_globals = sorted({g for g in globals_used if g not in ALL_ALLOWED_GLOBALS})
|
|
114
|
+
|
|
115
|
+
if disallowed_globals:
|
|
116
|
+
raise FunctionValidationError(
|
|
117
|
+
"RunScript functions must not rely on non-local variables, including imports. All "
|
|
118
|
+
f"modules your script needs (except {', '.join(PROVIDED_GLOBALS)}) must be imported in "
|
|
119
|
+
f"the function body. Found non-local variables: {', '.join(disallowed_globals)}"
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return ValidatedFunction(source=src, entrypoint=fn_name)
|
luminarycloud/project.py
CHANGED
|
@@ -30,7 +30,6 @@ from ._helpers import (
|
|
|
30
30
|
list_inference_jobs,
|
|
31
31
|
SurfaceForInference,
|
|
32
32
|
)
|
|
33
|
-
from ._helpers.warnings import deprecated
|
|
34
33
|
from ._proto.api.v0.luminarycloud.geometry import geometry_pb2 as geometrypb
|
|
35
34
|
from ._proto.api.v0.luminarycloud.mesh import mesh_pb2 as meshpb
|
|
36
35
|
from ._proto.api.v0.luminarycloud.named_variable_set import (
|
|
@@ -833,19 +832,6 @@ def get_project(
|
|
|
833
832
|
return Project(res.project)
|
|
834
833
|
|
|
835
834
|
|
|
836
|
-
@deprecated("Use iterate_projects() instead.", "0.10.1")
|
|
837
|
-
def list_projects() -> list[Project]:
|
|
838
|
-
"""
|
|
839
|
-
List projects accessible by the user.
|
|
840
|
-
|
|
841
|
-
.. deprecated:: 0.10.1
|
|
842
|
-
`list_projects()` will be removed in v0.11.0, it is replaced by
|
|
843
|
-
`iterate_projects()` because the latter provides a more efficient
|
|
844
|
-
way to fetch projects.
|
|
845
|
-
"""
|
|
846
|
-
return list(iterate_projects())
|
|
847
|
-
|
|
848
|
-
|
|
849
835
|
class ProjectIterator(PaginationIterator[Project]):
|
|
850
836
|
"""Iterator class for projects that provides length hint."""
|
|
851
837
|
|
luminarycloud/simulation.py
CHANGED
|
@@ -6,7 +6,6 @@ from typing import Optional
|
|
|
6
6
|
from ._client import get_default_client
|
|
7
7
|
from ._helpers._timestamp_to_datetime import timestamp_to_datetime
|
|
8
8
|
from ._helpers._wait_for_simulation import wait_for_simulation
|
|
9
|
-
from ._helpers.warnings import deprecated
|
|
10
9
|
from ._proto.api.v0.luminarycloud.common import common_pb2 as commonpb
|
|
11
10
|
from ._proto.api.v0.luminarycloud.simulation import simulation_pb2 as simulationpb
|
|
12
11
|
from ._proto.api.v0.luminarycloud.solution import solution_pb2 as solutionpb
|
|
@@ -16,14 +15,14 @@ from ._wrapper import ProtoWrapper, ProtoWrapperBase
|
|
|
16
15
|
from .enum import (
|
|
17
16
|
AveragingType,
|
|
18
17
|
CalculationType,
|
|
18
|
+
MomentConventionType,
|
|
19
19
|
QuantityType,
|
|
20
20
|
ResidualNormalization,
|
|
21
|
-
MomentConventionType,
|
|
22
21
|
SimulationStatus,
|
|
23
22
|
Vector3Component,
|
|
24
23
|
)
|
|
24
|
+
from .outputs import ForceOutputDefinition, SurfaceAverageOutputDefinition
|
|
25
25
|
from .outputs.stopping_conditions import StoppingConditionStatusResult
|
|
26
|
-
from .simulation_param import SimulationParam
|
|
27
26
|
from .reference_values import ReferenceValues
|
|
28
27
|
from .simulation_param import SimulationParam
|
|
29
28
|
from .solution import Solution
|
|
@@ -74,7 +73,7 @@ class Simulation(ProtoWrapperBase):
|
|
|
74
73
|
def update(
|
|
75
74
|
self,
|
|
76
75
|
*,
|
|
77
|
-
name: str = None,
|
|
76
|
+
name: Optional[str] = None,
|
|
78
77
|
) -> None:
|
|
79
78
|
"""
|
|
80
79
|
Update/Edit simulation attributes.
|
|
@@ -184,7 +183,7 @@ class Simulation(ProtoWrapperBase):
|
|
|
184
183
|
quantity_type: QuantityType,
|
|
185
184
|
surface_ids: list[str],
|
|
186
185
|
*,
|
|
187
|
-
reference_values: ReferenceValues = None,
|
|
186
|
+
reference_values: Optional[ReferenceValues] = None,
|
|
188
187
|
calculation_type: CalculationType = CalculationType.AGGREGATE,
|
|
189
188
|
frame_id: str = "",
|
|
190
189
|
force_direction: Optional[Vector3Like] = None,
|
|
@@ -279,6 +278,44 @@ class Simulation(ProtoWrapperBase):
|
|
|
279
278
|
res = get_default_client().GetSimulationSurfaceQuantityOutput(req)
|
|
280
279
|
return _DownloadedTextFile(res.csv_file)
|
|
281
280
|
|
|
281
|
+
def download_output_from_definition(
|
|
282
|
+
self,
|
|
283
|
+
output_definition: ForceOutputDefinition | SurfaceAverageOutputDefinition,
|
|
284
|
+
*,
|
|
285
|
+
reference_values: Optional[ReferenceValues] = None,
|
|
286
|
+
):
|
|
287
|
+
"""
|
|
288
|
+
Downloads surface outputs (e.g. lift, drag, ...) in csv format based on an output
|
|
289
|
+
definition.
|
|
290
|
+
|
|
291
|
+
Unless `reference_values` is explicitly passed, the Simulation's reference values -- i.e.
|
|
292
|
+
the ones specified when the Simulation was created -- will be used for computing
|
|
293
|
+
non-dimensional output quantities. While the Luminary Cloud UI lets you update the reference
|
|
294
|
+
values on a Simulation result after it has run, those updates only affect the output
|
|
295
|
+
calculations seen in the UI, they have no effect on the ones retrieved by this method.
|
|
296
|
+
|
|
297
|
+
Parameters
|
|
298
|
+
----------
|
|
299
|
+
output_definition : ForceOutputDefinition | SurfaceAverageOutputDefinition
|
|
300
|
+
Output definition
|
|
301
|
+
|
|
302
|
+
Other Parameters
|
|
303
|
+
----------------
|
|
304
|
+
reference_values : ReferenceValues, optional
|
|
305
|
+
Reference values used for computing forces, moments, and other non-dimensional output
|
|
306
|
+
quantities. If not provided, the simulation's reference values will be used, i.e., the
|
|
307
|
+
ones specified when the simulation was created.
|
|
308
|
+
"""
|
|
309
|
+
req = simulationpb.GetSimulationOutputFromDefinitionRequest(
|
|
310
|
+
id=self.id,
|
|
311
|
+
output_definition=output_definition._to_proto(),
|
|
312
|
+
reference_values=(
|
|
313
|
+
reference_values._to_proto() if reference_values else ReferenceValues()._to_proto()
|
|
314
|
+
),
|
|
315
|
+
)
|
|
316
|
+
res = get_default_client().GetSimulationOutputFromDefinition(req)
|
|
317
|
+
return _DownloadedTextFile(res.csv_file)
|
|
318
|
+
|
|
282
319
|
def delete(self) -> None:
|
|
283
320
|
"""
|
|
284
321
|
Delete the simulation.
|
|
@@ -349,12 +386,6 @@ class Simulation(ProtoWrapperBase):
|
|
|
349
386
|
res = get_default_client().GetStoppingConditionStatus(req)
|
|
350
387
|
return StoppingConditionStatusResult._from_proto(res)
|
|
351
388
|
|
|
352
|
-
@deprecated(
|
|
353
|
-
"Use get_parameters() instead. This method will be removed in a future release.",
|
|
354
|
-
)
|
|
355
|
-
def get_simulation_param(self) -> SimulationParam:
|
|
356
|
-
return self.get_parameters()
|
|
357
|
-
|
|
358
389
|
# This is used by the assistant for the SDK Code shown in the Results tab.
|
|
359
390
|
def _to_code(self) -> str:
|
|
360
391
|
return f"""# This code shows how to modify the parameters of the current simulation to create a new one.
|
|
@@ -247,63 +247,6 @@ class SimulationParam(_SimulationParam):
|
|
|
247
247
|
)
|
|
248
248
|
)
|
|
249
249
|
|
|
250
|
-
def configure_adjoint_surface_output(
|
|
251
|
-
self,
|
|
252
|
-
quantity_type: QuantityType,
|
|
253
|
-
surface_ids: list[str],
|
|
254
|
-
*,
|
|
255
|
-
reference_values: ReferenceValues = None,
|
|
256
|
-
frame_id: str = "",
|
|
257
|
-
force_direction: Optional[Vector3Like] = None,
|
|
258
|
-
moment_center: Optional[Vector3Like] = None,
|
|
259
|
-
moment_convention_type: MomentConventionType = MomentConventionType.BODY_FRAME,
|
|
260
|
-
averaging_type: AveragingType = AveragingType.UNSPECIFIED,
|
|
261
|
-
) -> None:
|
|
262
|
-
"""
|
|
263
|
-
Helper to configure the surface output differentiated by the adjoint solver.
|
|
264
|
-
See Simulation.download_surface_output() for details on the input parameters.
|
|
265
|
-
|
|
266
|
-
.. warning:: This feature is experimental and may change or be removed without notice.
|
|
267
|
-
"""
|
|
268
|
-
self.adjoint = self.adjoint or Adjoint()
|
|
269
|
-
self.adjoint._output = outputpb.Output()
|
|
270
|
-
self.adjoint._output.quantity = quantity_type.value
|
|
271
|
-
self.adjoint._output.in_surfaces.extend(surface_ids)
|
|
272
|
-
self.adjoint._output.frame_id = frame_id
|
|
273
|
-
if QuantityType._is_average(quantity_type):
|
|
274
|
-
if averaging_type == AveragingType.UNSPECIFIED:
|
|
275
|
-
self.adjoint._output.surface_average_properties.averaging_type = (
|
|
276
|
-
SpaceAveragingType.NO_AVERAGING.value
|
|
277
|
-
)
|
|
278
|
-
elif averaging_type == AveragingType.AREA:
|
|
279
|
-
self.adjoint._output.surface_average_properties.averaging_type = (
|
|
280
|
-
SpaceAveragingType.AREA.value
|
|
281
|
-
)
|
|
282
|
-
elif averaging_type == AveragingType.MASS_FLOW:
|
|
283
|
-
self.adjoint._output.surface_average_properties.averaging_type = (
|
|
284
|
-
SpaceAveragingType.MASS_FLOW.value
|
|
285
|
-
)
|
|
286
|
-
elif QuantityType._is_force(quantity_type):
|
|
287
|
-
self.adjoint._output.force_properties.CopyFrom(
|
|
288
|
-
outputpb.ForceProperties(
|
|
289
|
-
force_dir_type=(
|
|
290
|
-
outputpb.FORCE_DIRECTION_BODY_ORIENTATION_AND_FLOW_DIR
|
|
291
|
-
if quantity_type._has_tag(quantityoptspb.TAG_AUTO_DIRECTION)
|
|
292
|
-
else outputpb.FORCE_DIRECTION_CUSTOM
|
|
293
|
-
),
|
|
294
|
-
force_direction=(
|
|
295
|
-
_to_vector3_ad_proto(force_direction) if force_direction else None
|
|
296
|
-
),
|
|
297
|
-
moment_center=_to_vector3_ad_proto(moment_center) if moment_center else None,
|
|
298
|
-
moment_convention_type=moment_convention_type.value,
|
|
299
|
-
)
|
|
300
|
-
)
|
|
301
|
-
else:
|
|
302
|
-
raise ValueError("Invalid QuantityType.")
|
|
303
|
-
|
|
304
|
-
if reference_values is not None:
|
|
305
|
-
self.reference_values = reference_values
|
|
306
|
-
|
|
307
250
|
def __repr__(self) -> str:
|
|
308
251
|
return pformat(vars(self), compact=True, sort_dicts=True)
|
|
309
252
|
|
|
@@ -334,11 +277,6 @@ from luminarycloud import outputs, SimulationParam, EntityIdentifier
|
|
|
334
277
|
code += self._to_code_helper("obj", hide_defaults, use_tmp_objs).replace(
|
|
335
278
|
"luminarycloud.simulation_param.SimulationParam()", "luminarycloud.SimulationParam()", 1
|
|
336
279
|
)
|
|
337
|
-
if self.adjoint.primal_simulation_id != "":
|
|
338
|
-
code += """
|
|
339
|
-
# TODO(USER): Select appropriate parameters to configure the adjoint output.
|
|
340
|
-
obj.configure_adjoint_output("...")
|
|
341
|
-
"""
|
|
342
280
|
return code
|
|
343
281
|
|
|
344
282
|
def find_parameter(self, parameter: str) -> None:
|
|
@@ -8,7 +8,6 @@ from difflib import Differ
|
|
|
8
8
|
from .enum import (
|
|
9
9
|
TableType,
|
|
10
10
|
)
|
|
11
|
-
from ._helpers.warnings import deprecated
|
|
12
11
|
from ._client import get_default_client
|
|
13
12
|
from ._helpers._simulation_params_from_json import simulation_params_from_json_path
|
|
14
13
|
from ._helpers._timestamp_to_datetime import timestamp_to_datetime
|
|
@@ -180,15 +179,6 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
180
179
|
"""
|
|
181
180
|
return SimulationParam.from_proto(self._proto.parameters)
|
|
182
181
|
|
|
183
|
-
@deprecated(
|
|
184
|
-
"Use get_parameters() instead. This method will be removed in a future release.",
|
|
185
|
-
)
|
|
186
|
-
def get_simulation_param(self) -> SimulationParam:
|
|
187
|
-
"""
|
|
188
|
-
Returns a copy of the simulation parameters associated with this template.
|
|
189
|
-
"""
|
|
190
|
-
return self.get_parameters()
|
|
191
|
-
|
|
192
182
|
def list_tables(
|
|
193
183
|
self,
|
|
194
184
|
table_type: Optional[TableType] = None,
|
|
@@ -490,7 +480,7 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
490
480
|
code += "\n\n\n"
|
|
491
481
|
code += '# Create a new simulation template or modify the one that is synced with the UI "Setup" tab.\n'
|
|
492
482
|
code += f'project = luminarycloud.get_project("{self.project_id}")\n'
|
|
493
|
-
escaped_name = self.name.replace(
|
|
483
|
+
escaped_name = self.name.replace("\\", "\\\\").replace('"', '\\"')
|
|
494
484
|
code += f'template = project.create_simulation_template(name="{escaped_name}")\n'
|
|
495
485
|
code += '# TODO(USER): To modify the "Setup" template, uncomment the line below and comment out the line above.\n'
|
|
496
486
|
code += "# template = project.list_simulation_templates()[0] # Setup template\n\n"
|
luminarycloud/types/adfloat.py
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import warnings
|
|
1
2
|
from abc import ABCMeta
|
|
2
|
-
from
|
|
3
|
+
from functools import total_ordering
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
3
6
|
from .._proto.base.base_pb2 import AdFloatType, ExpressionType, FirstOrderAdType, SecondOrderAdType
|
|
4
7
|
|
|
5
8
|
|
|
@@ -9,13 +12,14 @@ class AdFloat(float, metaclass=ABCMeta):
|
|
|
9
12
|
pass
|
|
10
13
|
|
|
11
14
|
|
|
15
|
+
@total_ordering
|
|
12
16
|
class FirstOrderAdFloat(AdFloat):
|
|
13
17
|
"""An immutable float with first order adjoints/tangents attached."""
|
|
14
18
|
|
|
15
19
|
_tangent: tuple[float, ...]
|
|
16
20
|
_adjoint: tuple[float, ...]
|
|
17
21
|
|
|
18
|
-
def __new__(cls
|
|
22
|
+
def __new__(cls, value: float, *_: Any) -> "FirstOrderAdFloat":
|
|
19
23
|
return super().__new__(cls, value)
|
|
20
24
|
|
|
21
25
|
def __init__(self, value: float, tangent: tuple[float, ...], adjoint: tuple[float, ...]):
|
|
@@ -45,6 +49,11 @@ class FirstOrderAdFloat(AdFloat):
|
|
|
45
49
|
and self.adjoint == other.adjoint
|
|
46
50
|
)
|
|
47
51
|
|
|
52
|
+
def __lt__(self, other: Any) -> bool:
|
|
53
|
+
if not isinstance(other, LcFloat):
|
|
54
|
+
return NotImplemented
|
|
55
|
+
return _lcfloat_to_float(self) < _lcfloat_to_float(other)
|
|
56
|
+
|
|
48
57
|
@staticmethod
|
|
49
58
|
def _from_proto(proto: FirstOrderAdType) -> "FirstOrderAdFloat":
|
|
50
59
|
return FirstOrderAdFloat(
|
|
@@ -54,6 +63,7 @@ class FirstOrderAdFloat(AdFloat):
|
|
|
54
63
|
)
|
|
55
64
|
|
|
56
65
|
|
|
66
|
+
@total_ordering
|
|
57
67
|
class SecondOrderAdFloat(AdFloat):
|
|
58
68
|
"""An immutable float with second order adjoints/tangents attached."""
|
|
59
69
|
|
|
@@ -101,6 +111,11 @@ class SecondOrderAdFloat(AdFloat):
|
|
|
101
111
|
and self._adjoint == other._adjoint
|
|
102
112
|
)
|
|
103
113
|
|
|
114
|
+
def __lt__(self, other: Any) -> bool:
|
|
115
|
+
if not isinstance(other, LcFloat):
|
|
116
|
+
return NotImplemented
|
|
117
|
+
return _lcfloat_to_float(self) < _lcfloat_to_float(other)
|
|
118
|
+
|
|
104
119
|
@staticmethod
|
|
105
120
|
def _from_proto(proto: SecondOrderAdType) -> "SecondOrderAdFloat":
|
|
106
121
|
return SecondOrderAdFloat(
|
|
@@ -110,6 +125,7 @@ class SecondOrderAdFloat(AdFloat):
|
|
|
110
125
|
)
|
|
111
126
|
|
|
112
127
|
|
|
128
|
+
@total_ordering
|
|
113
129
|
class Expression:
|
|
114
130
|
"""An expression or value that can be evaluated or used in evaluations."""
|
|
115
131
|
|
|
@@ -119,6 +135,8 @@ class Expression:
|
|
|
119
135
|
def __init__(self, expression: str):
|
|
120
136
|
if not expression:
|
|
121
137
|
raise ValueError("Expression cannot be empty")
|
|
138
|
+
# TODO(LC-26796) either evaluate here or in `_to_proto`
|
|
139
|
+
# (or add a separate method to evaluate, but then `Expression` would no longer be immutable)
|
|
122
140
|
self._value = 0.0
|
|
123
141
|
self._expression = expression
|
|
124
142
|
|
|
@@ -145,11 +163,22 @@ class Expression:
|
|
|
145
163
|
return False
|
|
146
164
|
return self._value == other._value and self._expression == other._expression
|
|
147
165
|
|
|
148
|
-
def
|
|
166
|
+
def __lt__(self, other: Any) -> bool:
|
|
167
|
+
if not isinstance(other, LcFloat):
|
|
168
|
+
return NotImplemented
|
|
169
|
+
return _lcfloat_to_float(self) < _lcfloat_to_float(other)
|
|
170
|
+
|
|
171
|
+
def __float__(self) -> float:
|
|
172
|
+
return self._value
|
|
173
|
+
|
|
174
|
+
def __repr__(self) -> str:
|
|
175
|
+
return self._to_code()
|
|
176
|
+
|
|
177
|
+
def _to_code(self, *args: Any) -> str:
|
|
149
178
|
return f"Expression({self._expression.__repr__()})"
|
|
150
179
|
|
|
151
180
|
|
|
152
|
-
LcFloat =
|
|
181
|
+
LcFloat = float | FirstOrderAdFloat | SecondOrderAdFloat | Expression
|
|
153
182
|
|
|
154
183
|
|
|
155
184
|
def _to_ad_proto(value: LcFloat) -> AdFloatType:
|
|
@@ -190,3 +219,18 @@ def _from_ad_proto(proto: AdFloatType) -> LcFloat:
|
|
|
190
219
|
return 0.0
|
|
191
220
|
|
|
192
221
|
raise ValueError("Invalid AdFloatType proto")
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _lcfloat_to_float(value: LcFloat) -> float:
|
|
225
|
+
if isinstance(value, AdFloat):
|
|
226
|
+
return float(value)
|
|
227
|
+
if isinstance(value, Expression):
|
|
228
|
+
# TODO(LC-26796) evaluate expressions
|
|
229
|
+
warnings.warn(
|
|
230
|
+
"Attempted to convert Expression to float; result may be unexpected. "
|
|
231
|
+
"This behavior will be improved in a later release.",
|
|
232
|
+
category=UserWarning,
|
|
233
|
+
stacklevel=2,
|
|
234
|
+
)
|
|
235
|
+
return value.value
|
|
236
|
+
return value
|
luminarycloud/types/matrix3.py
CHANGED
|
@@ -15,9 +15,9 @@ class Matrix3:
|
|
|
15
15
|
|
|
16
16
|
def _to_proto(self) -> basepb.Matrix3:
|
|
17
17
|
return basepb.Matrix3(
|
|
18
|
-
a=
|
|
19
|
-
b=
|
|
20
|
-
c=
|
|
18
|
+
a=self.a._to_base_proto(),
|
|
19
|
+
b=self.b._to_base_proto(),
|
|
20
|
+
c=self.c._to_base_proto(),
|
|
21
21
|
)
|
|
22
22
|
|
|
23
23
|
def _to_ad_proto(self) -> basepb.AdMatrix3:
|
|
@@ -28,11 +28,11 @@ class Matrix3:
|
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
def _from_proto(self, proto: basepb.Matrix3) -> None:
|
|
31
|
-
self.a
|
|
32
|
-
self.b
|
|
33
|
-
self.c
|
|
31
|
+
self.a._from_base_proto(proto.a)
|
|
32
|
+
self.b._from_base_proto(proto.b)
|
|
33
|
+
self.c._from_base_proto(proto.c)
|
|
34
34
|
|
|
35
35
|
def _from_ad_proto(self, proto: basepb.AdMatrix3) -> None:
|
|
36
|
-
self.a
|
|
37
|
-
self.b
|
|
38
|
-
self.c
|
|
36
|
+
self.a._from_ad_proto(proto.a)
|
|
37
|
+
self.b._from_ad_proto(proto.b)
|
|
38
|
+
self.c._from_ad_proto(proto.c)
|