luminarycloud 0.14.0__py3-none-any.whl → 0.15.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 +8 -1
- luminarycloud/_client/client.py +9 -0
- luminarycloud/_client/logging_interceptor.py +25 -0
- luminarycloud/_client/tracing.py +13 -8
- luminarycloud/_helpers/__init__.py +2 -0
- luminarycloud/_helpers/_code_representation.py +135 -0
- luminarycloud/_helpers/_simulation_params_from_json.py +5 -1
- luminarycloud/_helpers/download.py +16 -0
- luminarycloud/_helpers/named_variables.py +25 -0
- luminarycloud/_helpers/upload.py +31 -11
- luminarycloud/_helpers/warnings/deprecated.py +8 -10
- luminarycloud/_helpers/warnings/experimental.py +4 -4
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +135 -110
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +82 -10
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +40 -40
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +8 -2
- luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.py +182 -0
- luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +260 -0
- luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.py +204 -0
- luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.pyi +75 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +94 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +145 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +104 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +42 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +25 -25
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -3
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.py +25 -3
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2.pyi +32 -0
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/solution/solution_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +162 -0
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +254 -0
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.py +203 -0
- luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2_grpc.pyi +74 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +157 -141
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +32 -4
- luminarycloud/_proto/cad/boolean_pb2.py +8 -8
- luminarycloud/_proto/cad/boolean_pb2.pyi +34 -4
- luminarycloud/_proto/client/simulation_pb2.py +304 -294
- luminarycloud/_proto/client/simulation_pb2.pyi +30 -1
- luminarycloud/_proto/geometry/geometry_pb2.py +58 -58
- luminarycloud/_proto/geometry/geometry_pb2.pyi +58 -11
- luminarycloud/_proto/hexmesh/hexmesh_pb2.py +42 -42
- luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +2 -2
- luminarycloud/_proto/output/reference_values_pb2.py +5 -5
- luminarycloud/_proto/parametricworker/parametricworker_pb2.py +31 -31
- luminarycloud/_proto/parametricworker/parametricworker_pb2.pyi +6 -4
- luminarycloud/_proto/quantity/quantity_pb2.py +4 -4
- luminarycloud/_proto/table/table_pb2.py +9 -8
- luminarycloud/_proto/table/table_pb2.pyi +7 -1
- luminarycloud/enum/__init__.py +2 -0
- luminarycloud/enum/geometry_status.py +28 -0
- luminarycloud/geometry.py +64 -32
- luminarycloud/geometry_version.py +2 -2
- luminarycloud/mesh.py +11 -4
- luminarycloud/meshing/__init__.py +1 -0
- luminarycloud/meshing/metadata/__init__.py +6 -0
- luminarycloud/meshing/metadata/mesh_metadata.py +57 -0
- luminarycloud/named_variable_set.py +121 -0
- luminarycloud/outputs/output_definitions.py +11 -10
- luminarycloud/params/enum/_enum_wrappers.py +77 -968
- luminarycloud/params/outputs/output.py +2 -1
- luminarycloud/params/simulation/__init__.py +16 -16
- luminarycloud/params/simulation/_lib.py +1 -67
- luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +3 -2
- luminarycloud/params/simulation/adaptive_mesh_refinement_.py +3 -2
- luminarycloud/params/simulation/adjoint_.py +4 -3
- luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -2
- luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -2
- luminarycloud/params/simulation/basic/gravity_.py +3 -2
- luminarycloud/params/simulation/body_frame_.py +3 -2
- luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +7 -6
- luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +7 -6
- luminarycloud/params/simulation/entity_relationships_.py +3 -2
- luminarycloud/params/simulation/general_.py +4 -3
- luminarycloud/params/simulation/material/fluid/__init__.py +4 -4
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -2
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +3 -2
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -2
- luminarycloud/params/simulation/material/fluid/material_model/__init__.py +1 -1
- luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +3 -2
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +3 -2
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +3 -2
- luminarycloud/params/simulation/material/fluid/material_model_.py +3 -2
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/__init__.py +2 -2
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +3 -2
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +3 -2
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +4 -3
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -2
- luminarycloud/params/simulation/material/fluid/viscosity_model/__init__.py +1 -1
- luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +3 -2
- luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +3 -2
- luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +4 -3
- luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -2
- luminarycloud/params/simulation/material/material_fluid_.py +7 -6
- luminarycloud/params/simulation/material/material_solid_.py +4 -3
- luminarycloud/params/simulation/material_entity_.py +9 -8
- luminarycloud/params/simulation/monitor_plane_.py +5 -4
- luminarycloud/params/simulation/motion_data/__init__.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms/__init__.py +1 -1
- luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +5 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +5 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +5 -4
- luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -2
- luminarycloud/params/simulation/motion_data/motion_type/__init__.py +1 -1
- luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +5 -4
- luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +5 -4
- luminarycloud/params/simulation/motion_data/motion_type_.py +3 -2
- luminarycloud/params/simulation/motion_data_.py +6 -5
- luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -2
- luminarycloud/params/simulation/output_.py +3 -2
- luminarycloud/params/simulation/particle_group/particle_group_type/__init__.py +1 -1
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +4 -3
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +4 -3
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -2
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +7 -6
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -2
- luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +5 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +5 -4
- luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -2
- luminarycloud/params/simulation/particle_group_.py +4 -3
- luminarycloud/params/simulation/physics/__init__.py +3 -3
- luminarycloud/params/simulation/physics/fluid/__init__.py +9 -9
- luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/__init__.py +5 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/__init__.py +3 -3
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +7 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +6 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +6 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +8 -7
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +6 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +7 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/initialization/__init__.py +2 -2
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +8 -7
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/__init__.py +2 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +8 -7
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -3
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +9 -8
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +4 -3
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -3
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +7 -6
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +5 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/__init__.py +2 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/__init__.py +1 -1
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +6 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +6 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/__init__.py +2 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -2
- luminarycloud/params/simulation/physics/fluid/turbulence_.py +6 -5
- luminarycloud/params/simulation/physics/fluid_.py +12 -13
- luminarycloud/params/simulation/physics/heat/__init__.py +4 -4
- luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -2
- luminarycloud/params/simulation/physics/heat/boundary_conditions/__init__.py +2 -2
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +5 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +5 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +5 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +5 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +5 -4
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/__init__.py +1 -1
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +3 -2
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -3
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -2
- luminarycloud/params/simulation/physics/heat/heat_source_.py +6 -5
- luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +5 -4
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +5 -4
- luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -2
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +4 -3
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -2
- luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +4 -3
- luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +3 -2
- luminarycloud/params/simulation/physics/heat_.py +9 -8
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/__init__.py +1 -1
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -2
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -2
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -2
- luminarycloud/params/simulation/physics/periodic_pair_.py +4 -3
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/__init__.py +1 -1
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -2
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +9 -8
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +3 -2
- luminarycloud/params/simulation/physics_.py +7 -6
- luminarycloud/params/simulation/simulation_param_.py +12 -13
- luminarycloud/params/simulation/sliding_interfaces_.py +8 -7
- luminarycloud/params/simulation/surface_name_.py +3 -2
- luminarycloud/params/simulation/time/__init__.py +2 -2
- luminarycloud/params/simulation/time/compute_statistics/__init__.py +1 -1
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -2
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -2
- luminarycloud/params/simulation/time/compute_statistics_.py +3 -2
- luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -2
- luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -2
- luminarycloud/params/simulation/time/time_marching_.py +3 -2
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -2
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +3 -2
- luminarycloud/params/simulation/time/time_step_ramp_.py +3 -2
- luminarycloud/params/simulation/time_.py +6 -5
- luminarycloud/params/simulation/volume_entity_.py +5 -4
- luminarycloud/physics_ai/__init__.py +8 -0
- luminarycloud/physics_ai/architectures.py +38 -0
- luminarycloud/physics_ai/models.py +42 -0
- luminarycloud/project.py +73 -21
- luminarycloud/reference_values.py +20 -3
- luminarycloud/simulation.py +8 -3
- luminarycloud/simulation_param.py +136 -29
- luminarycloud/simulation_template.py +84 -13
- luminarycloud/solution.py +17 -2
- luminarycloud/types/__init__.py +1 -0
- luminarycloud/types/adfloat.py +49 -19
- luminarycloud/types/ids.py +3 -0
- luminarycloud/vis/__init__.py +0 -3
- luminarycloud/vis/display.py +1 -0
- luminarycloud/vis/interactive_scene.py +47 -1
- luminarycloud/vis/visualization.py +57 -23
- luminarycloud/volume_selection.py +31 -19
- {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/METADATA +2 -2
- {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/RECORD +295 -274
- {luminarycloud-0.14.0.dist-info → luminarycloud-0.15.0.dist-info}/WHEEL +0 -0
|
@@ -9,6 +9,7 @@ from typing import Optional, TypeVar, cast
|
|
|
9
9
|
import luminarycloud.params.enum._enum_wrappers as enum
|
|
10
10
|
from luminarycloud._helpers._simulation_params_from_json import (
|
|
11
11
|
simulation_params_from_json_path,
|
|
12
|
+
simulation_params_from_json_dict,
|
|
12
13
|
)
|
|
13
14
|
from luminarycloud._helpers.warnings import experimental
|
|
14
15
|
from luminarycloud._proto.client import simulation_pb2 as clientpb
|
|
@@ -46,7 +47,29 @@ logger = getLogger(__name__)
|
|
|
46
47
|
|
|
47
48
|
@dataclass(kw_only=True, repr=False)
|
|
48
49
|
class SimulationParam(_SimulationParam):
|
|
49
|
-
"""
|
|
50
|
+
"""
|
|
51
|
+
Solver configuration parameters that support multi-physics simulations.
|
|
52
|
+
|
|
53
|
+
The structure of these parameters is related to the decision tree of selecting different models,
|
|
54
|
+
boundary conditions, etc. for the simulation.
|
|
55
|
+
Most of these choices are made by picking one class for a given field over a number of
|
|
56
|
+
alternatives. For example:
|
|
57
|
+
|
|
58
|
+
>>> import luminarycloud.params.simulation as sim_params
|
|
59
|
+
>>> params = SimulationParam()
|
|
60
|
+
>>> params.physics[0].fluid.turbulence = sim_params.physics.fluid.turbulence.KomegaSst()
|
|
61
|
+
>>> params.physics[0].fluid.turbulence = sim_params.physics.fluid.turbulence.SpalartAllmaras()
|
|
62
|
+
|
|
63
|
+
The alternatives are listed in the documentation of each field (turbulence in this case), and
|
|
64
|
+
the (sub)module that provides them is always named after the field.
|
|
65
|
+
Therefore, even without consulting the documentation, it is possible to list the alternatives
|
|
66
|
+
using Python's ``dir`` function, in this case:
|
|
67
|
+
|
|
68
|
+
>>> dir(sim_params.physics.fluid.turbulence)
|
|
69
|
+
|
|
70
|
+
The alternative classes have different fields, which may again have their own alternative
|
|
71
|
+
classes thereby repeating the pattern and creating the tree structure.
|
|
72
|
+
"""
|
|
50
73
|
|
|
51
74
|
reference_values: ReferenceValues = field(default_factory=ReferenceValues)
|
|
52
75
|
"Reference values for outputs and stopping conditions."
|
|
@@ -56,30 +79,67 @@ class SimulationParam(_SimulationParam):
|
|
|
56
79
|
|
|
57
80
|
def _to_proto(self) -> clientpb.SimulationParam:
|
|
58
81
|
_proto = super()._to_proto()
|
|
59
|
-
|
|
60
|
-
if self.reference_values.reference_value_type == ReferenceValuesType.FARFIELD_VALUES:
|
|
61
|
-
raise ValueError(
|
|
62
|
-
"ReferenceValuesType.FARFIELD_VALUES cannot be used in SimulationParam yet."
|
|
63
|
-
)
|
|
64
|
-
self.reference_values._to_proto_common(_proto.reference_values)
|
|
82
|
+
_proto.reference_values.CopyFrom(self.reference_values._to_client_proto())
|
|
65
83
|
return _proto
|
|
66
84
|
|
|
67
85
|
@classmethod
|
|
68
86
|
def from_proto(self, proto: clientpb.SimulationParam) -> "SimulationParam":
|
|
69
87
|
_wrapper = cast(SimulationParam, super().from_proto(proto))
|
|
70
|
-
|
|
71
|
-
_wrapper.basic is not None and _wrapper.basic.time == enum.FlowBehavior.TRANSIENT
|
|
72
|
-
)
|
|
73
|
-
_wrapper.reference_values._from_proto_common(proto.reference_values)
|
|
88
|
+
_wrapper.reference_values._from_client_proto(proto.reference_values)
|
|
74
89
|
return _wrapper
|
|
75
90
|
|
|
76
91
|
@classmethod
|
|
77
|
-
def from_json(cls,
|
|
78
|
-
|
|
92
|
+
def from_json(cls, source: PathLike | dict) -> "SimulationParam":
|
|
93
|
+
if isinstance(source, PathLike):
|
|
94
|
+
return cls.from_proto(simulation_params_from_json_path(source))
|
|
95
|
+
else:
|
|
96
|
+
return cls.from_proto(simulation_params_from_json_dict(source))
|
|
79
97
|
|
|
80
98
|
def assign_material(self, material: MaterialEntity, volume: Volume | str) -> None:
|
|
81
99
|
"""
|
|
82
|
-
Assigns a material entity to a volume
|
|
100
|
+
Assigns a material entity to a volume.
|
|
101
|
+
|
|
102
|
+
This method links a material entity to a specific volume in the simulation domain.
|
|
103
|
+
If the volume or material entity has not been added to the simulation parameters yet,
|
|
104
|
+
they will be added automatically.
|
|
105
|
+
|
|
106
|
+
Parameters
|
|
107
|
+
----------
|
|
108
|
+
material : MaterialEntity
|
|
109
|
+
The material entity to assign to the volume. This is typically created using
|
|
110
|
+
lc.params.simulation.MaterialEntity.
|
|
111
|
+
volume : Volume | str
|
|
112
|
+
The volume to assign the material to. Can be a Volume object or a string
|
|
113
|
+
representing the volume ID.
|
|
114
|
+
|
|
115
|
+
Examples
|
|
116
|
+
--------
|
|
117
|
+
Using volumes from list_tags():
|
|
118
|
+
|
|
119
|
+
>>> # Get the fluid volume from tags
|
|
120
|
+
>>> tags = geometry.list_tags()
|
|
121
|
+
>>> # Assume the fluid volume is tagged with "Fluid"
|
|
122
|
+
>>> fluid_volume_tag_name = "Fluid"
|
|
123
|
+
>>> fluid_tag = next(
|
|
124
|
+
... (tag for tag in tags if tag.name == fluid_volume_tag_name and tag.volumes), None
|
|
125
|
+
... )
|
|
126
|
+
>>> if fluid_tag:
|
|
127
|
+
... # Assume we want to assign the material to the first volume in the tag
|
|
128
|
+
... for fluid_volume in fluid_tag.volumes:
|
|
129
|
+
... simulation_param.assign_material(material, fluid_volume)
|
|
130
|
+
>>> else:
|
|
131
|
+
... raise ValueError("No fluid volume found")
|
|
132
|
+
|
|
133
|
+
Using volumes from list_entities():
|
|
134
|
+
|
|
135
|
+
>>> # Get the fluid volume from list_entities()
|
|
136
|
+
>>> surfaces, volumes = geometry.list_entities()
|
|
137
|
+
>>> if volumes:
|
|
138
|
+
... # Assume we want to assign the material to the first volume in the list
|
|
139
|
+
... fluid_volume_to_assign = volumes[0]
|
|
140
|
+
... simulation_param.assign_material(material, fluid_volume_to_assign)
|
|
141
|
+
>>> else:
|
|
142
|
+
... raise ValueError("No fluid volume found")
|
|
83
143
|
"""
|
|
84
144
|
volume_identifier = EntityIdentifier()
|
|
85
145
|
if isinstance(volume, str):
|
|
@@ -112,7 +172,49 @@ class SimulationParam(_SimulationParam):
|
|
|
112
172
|
|
|
113
173
|
def assign_physics(self, physics: Physics, volume: Volume | str) -> None:
|
|
114
174
|
"""
|
|
115
|
-
Assigns a physics entity to a volume
|
|
175
|
+
Assigns a physics entity to a volume.
|
|
176
|
+
|
|
177
|
+
This method links a physics entity to a specific volume in the simulation domain.
|
|
178
|
+
If the volume or physics entity has not been added to the simulation parameters yet,
|
|
179
|
+
they will be added automatically.
|
|
180
|
+
|
|
181
|
+
Parameters
|
|
182
|
+
----------
|
|
183
|
+
physics : Physics
|
|
184
|
+
The physics entity to assign to the volume. This is typically created using
|
|
185
|
+
lc.params.simulation.Physics.
|
|
186
|
+
volume : Volume | str
|
|
187
|
+
The volume to assign the physics to. Can be a Volume object or a string
|
|
188
|
+
representing the volume ID.
|
|
189
|
+
|
|
190
|
+
Examples
|
|
191
|
+
--------
|
|
192
|
+
Using volumes from list_tags():
|
|
193
|
+
|
|
194
|
+
>>> # Get the fluid volume from tags
|
|
195
|
+
>>> tags = geometry.list_tags()
|
|
196
|
+
>>> # Assume the fluid volume is tagged with "Fluid"
|
|
197
|
+
>>> fluid_volume_tag_name = "Fluid"
|
|
198
|
+
>>> fluid_tag = next(
|
|
199
|
+
... (tag for tag in tags if tag.name == fluid_volume_tag_name and tag.volumes), None
|
|
200
|
+
... )
|
|
201
|
+
>>> if fluid_tag:
|
|
202
|
+
... # Assume we want to assign the physics to the first volume in the tag
|
|
203
|
+
... for fluid_volume in fluid_tag.volumes:
|
|
204
|
+
... simulation_param.assign_physics(physics, fluid_volume)
|
|
205
|
+
>>> else:
|
|
206
|
+
... raise ValueError("No fluid volume found")
|
|
207
|
+
|
|
208
|
+
Using volumes from list_entities():
|
|
209
|
+
|
|
210
|
+
>>> # Get the fluid volume from list_entities()
|
|
211
|
+
>>> surfaces, volumes = geometry.list_entities()
|
|
212
|
+
>>> if volumes:
|
|
213
|
+
... # Assume we want to assign the physics to the first volume in the list
|
|
214
|
+
... fluid_volume_to_assign = volumes[0]
|
|
215
|
+
... simulation_param.assign_physics(physics, fluid_volume_to_assign)
|
|
216
|
+
>>> else:
|
|
217
|
+
... raise ValueError("No fluid volume found")
|
|
116
218
|
"""
|
|
117
219
|
if isinstance(volume, str):
|
|
118
220
|
volume_identifier = EntityIdentifier(id=volume)
|
|
@@ -206,16 +308,17 @@ class SimulationParam(_SimulationParam):
|
|
|
206
308
|
def __repr__(self) -> str:
|
|
207
309
|
return pformat(vars(self), compact=True, sort_dicts=True)
|
|
208
310
|
|
|
209
|
-
def to_code(self) -> str:
|
|
311
|
+
def to_code(self, hide_defaults: bool = True) -> str:
|
|
210
312
|
"""
|
|
211
313
|
Returns the python code that generates an identical SimulationParam object.
|
|
212
|
-
This is a verbose representation
|
|
213
|
-
|
|
314
|
+
This is a verbose representation that does not make use of helper functions like
|
|
315
|
+
assign_material and assign_physics.
|
|
316
|
+
Parameters with default values are omitted by default, with hide_defaults=False, code will
|
|
317
|
+
also be generated for those parameters.
|
|
214
318
|
"""
|
|
215
319
|
code = """## NOTE: This is a verbose representation of a SimulationParam object as the
|
|
216
320
|
## code that creates an identical object. The verbosity is intended to facilitate
|
|
217
|
-
## the discovery of available parameters.
|
|
218
|
-
## (e.g. for material properties) some lines of this representation become redundant.
|
|
321
|
+
## the discovery of available parameters.
|
|
219
322
|
import luminarycloud
|
|
220
323
|
from luminarycloud import *
|
|
221
324
|
from luminarycloud.types import Vector3
|
|
@@ -224,16 +327,20 @@ from luminarycloud.params.enum import *
|
|
|
224
327
|
from luminarycloud.params import simulation as params
|
|
225
328
|
|
|
226
329
|
|
|
227
|
-
obj = SimulationParam()
|
|
228
330
|
"""
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
331
|
+
return code + self._to_code_helper("obj", hide_defaults).replace(
|
|
332
|
+
"luminarycloud.simulation_param.SimulationParam()", "SimulationParam()", 1
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
def find_parameter(self, parameter: str) -> None:
|
|
336
|
+
"""
|
|
337
|
+
Searches the full output of "to_code()" for occurrences of "parameter" and prints the lines
|
|
338
|
+
with matches. This is a helper function to assist users in finding, for example, how to
|
|
339
|
+
change farfield conditions, material properties, etc.
|
|
340
|
+
"""
|
|
341
|
+
for i, line in enumerate(self.to_code(False).split("\n")):
|
|
342
|
+
if parameter.lower() in line.lower():
|
|
343
|
+
print(f"line {i}: {line}")
|
|
237
344
|
|
|
238
345
|
|
|
239
346
|
T = TypeVar("T")
|
|
@@ -8,7 +8,7 @@ from difflib import Differ
|
|
|
8
8
|
from .enum import (
|
|
9
9
|
TableType,
|
|
10
10
|
)
|
|
11
|
-
from ._helpers.warnings import experimental
|
|
11
|
+
from ._helpers.warnings import experimental, deprecated
|
|
12
12
|
from ._client import get_default_client
|
|
13
13
|
from ._helpers._simulation_params_from_json import simulation_params_from_json_path
|
|
14
14
|
from ._helpers._timestamp_to_datetime import timestamp_to_datetime
|
|
@@ -60,8 +60,6 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
60
60
|
"Simulation template ID."
|
|
61
61
|
name: str
|
|
62
62
|
"Simulation name."
|
|
63
|
-
parameters: clientpb.SimulationParam
|
|
64
|
-
"Simulation description."
|
|
65
63
|
|
|
66
64
|
_proto: simtemplatepb.SimulationTemplate
|
|
67
65
|
|
|
@@ -77,7 +75,7 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
77
75
|
self,
|
|
78
76
|
*,
|
|
79
77
|
name: Optional[str] = None,
|
|
80
|
-
parameters: Optional[
|
|
78
|
+
parameters: Optional[SimulationParam | PathLike] = None,
|
|
81
79
|
) -> None:
|
|
82
80
|
"""
|
|
83
81
|
Update simulation template.
|
|
@@ -92,6 +90,17 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
92
90
|
changes applied by the backend (server), for example due to presets. Any differences
|
|
93
91
|
between input and result are printed on screen.
|
|
94
92
|
"""
|
|
93
|
+
return self._update(name=name, parameters=parameters)
|
|
94
|
+
|
|
95
|
+
def _update(
|
|
96
|
+
self,
|
|
97
|
+
*,
|
|
98
|
+
name: Optional[str] = None,
|
|
99
|
+
parameters: Optional[SimulationParam | clientpb.SimulationParam | PathLike] = None,
|
|
100
|
+
) -> None:
|
|
101
|
+
"""
|
|
102
|
+
Update simulation template. See `update()` for more details.
|
|
103
|
+
"""
|
|
95
104
|
req = simtemplatepb.UpdateSimulationTemplateRequest(id=self.id)
|
|
96
105
|
|
|
97
106
|
if name is not None:
|
|
@@ -110,12 +119,14 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
110
119
|
# Table references are manipulated via the simulation template, hence we need to persist
|
|
111
120
|
# them when we update the parameters.
|
|
112
121
|
param_proto.table_references.clear()
|
|
113
|
-
for k, v in self.parameters.table_references.items():
|
|
122
|
+
for k, v in self._proto.parameters.table_references.items():
|
|
114
123
|
param_proto.table_references[k].CopyFrom(v)
|
|
115
124
|
|
|
116
125
|
req.parameters.CopyFrom(param_proto)
|
|
117
126
|
|
|
118
|
-
res =
|
|
127
|
+
res: simtemplatepb.UpdateSimulationTemplateResponse = (
|
|
128
|
+
get_default_client().UpdateSimulationTemplate(req)
|
|
129
|
+
)
|
|
119
130
|
self._proto = res.simulation_template
|
|
120
131
|
|
|
121
132
|
def print_diff(
|
|
@@ -134,11 +145,11 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
134
145
|
# Show any inconsistency after the update and update the input argument.
|
|
135
146
|
if isinstance(parameters, SimulationParam):
|
|
136
147
|
old_param = deepcopy(parameters)
|
|
137
|
-
parameters._from_proto(self.parameters)
|
|
148
|
+
parameters._from_proto(self._proto.parameters)
|
|
138
149
|
print_diff(old_param, parameters)
|
|
139
150
|
elif isinstance(parameters, clientpb.SimulationParam):
|
|
140
|
-
print_diff(parameters, self.parameters)
|
|
141
|
-
parameters.CopyFrom(self.parameters)
|
|
151
|
+
print_diff(parameters, self._proto.parameters)
|
|
152
|
+
parameters.CopyFrom(self._proto.parameters)
|
|
142
153
|
|
|
143
154
|
def delete(self) -> None:
|
|
144
155
|
"""
|
|
@@ -147,12 +158,17 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
147
158
|
req = simtemplatepb.DeleteSimulationTemplateRequest(id=self.id)
|
|
148
159
|
get_default_client().DeleteSimulationTemplate(req)
|
|
149
160
|
|
|
161
|
+
def get_parameters(self) -> SimulationParam:
|
|
162
|
+
return self.get_simulation_param()
|
|
163
|
+
|
|
164
|
+
@deprecated(
|
|
165
|
+
"Use get_parameters() instead. This method will be removed in a future release.",
|
|
166
|
+
)
|
|
150
167
|
def get_simulation_param(self) -> SimulationParam:
|
|
151
168
|
"""
|
|
152
|
-
Returns the simulation parameters associated with this template
|
|
153
|
-
the parameters.
|
|
169
|
+
Returns a copy of the simulation parameters associated with this template.
|
|
154
170
|
"""
|
|
155
|
-
return SimulationParam.from_proto(self.parameters)
|
|
171
|
+
return SimulationParam.from_proto(self._proto.parameters)
|
|
156
172
|
|
|
157
173
|
def list_tables(
|
|
158
174
|
self,
|
|
@@ -172,7 +188,7 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
172
188
|
List of tables.
|
|
173
189
|
"""
|
|
174
190
|
res: list[RectilinearTable] = []
|
|
175
|
-
for id, metadata in self.parameters.table_references.items():
|
|
191
|
+
for id, metadata in self._proto.parameters.table_references.items():
|
|
176
192
|
if table_type is None or table_type.value == metadata.table_type:
|
|
177
193
|
res.append(
|
|
178
194
|
RectilinearTable(
|
|
@@ -442,6 +458,61 @@ class SimulationTemplate(ProtoWrapperBase):
|
|
|
442
458
|
self.id, max_iterations, max_physical_time, max_inner_iterations, stop_on_any
|
|
443
459
|
)
|
|
444
460
|
|
|
461
|
+
def to_code(self, hide_defaults: bool = True) -> str:
|
|
462
|
+
"""
|
|
463
|
+
Returns the python code that generates an identical SimulationTemplate object.
|
|
464
|
+
By default parameters with default values are omitted, this change be changed with
|
|
465
|
+
hide_defaults=False.
|
|
466
|
+
"""
|
|
467
|
+
param_code = self.get_simulation_param().to_code(hide_defaults)
|
|
468
|
+
code, param_code = param_code.split("\n\n\n")
|
|
469
|
+
|
|
470
|
+
# Modify the header note included by SimulationParam.to_code.
|
|
471
|
+
code = code.replace("SimulationParam", "SimulationTemplate")
|
|
472
|
+
code += "\n\n\n"
|
|
473
|
+
code += '# Create a new simulation template or modify the "Setup" template.\n'
|
|
474
|
+
code += 'project = get_project("...")\n'
|
|
475
|
+
code += f"# template = project.create_simulation_template(name={self.name})\n"
|
|
476
|
+
code += "template = project.list_simulation_templates()[0]\n\n"
|
|
477
|
+
|
|
478
|
+
code += "# Define the simulation parameters.\n"
|
|
479
|
+
code += param_code
|
|
480
|
+
code += "\n# Update the simulation template with the parameters.\n"
|
|
481
|
+
code += "template.update(parameters=obj)\n\n"
|
|
482
|
+
|
|
483
|
+
code += "# Define the outputs for monitoring simulations.\n"
|
|
484
|
+
code += "# This assumes the outputs do not exist yet, to modify an exiting output use\n"
|
|
485
|
+
code += "# update_output_definition instead of create_output_definition, the former\n"
|
|
486
|
+
code += "# requires the definition ID, that is obtained from list_output_definitions.\n"
|
|
487
|
+
output_definitions = self.list_output_definitions()
|
|
488
|
+
for i, definition in enumerate(output_definitions):
|
|
489
|
+
if i == 0:
|
|
490
|
+
code += "outputs = []\n"
|
|
491
|
+
output_code = definition._to_code_helper("new_output", hide_defaults)
|
|
492
|
+
for line in output_code.split("\n"):
|
|
493
|
+
# Omit ID because we are generating for create_output_definition.
|
|
494
|
+
if line and not line.startswith("new_output.id"):
|
|
495
|
+
code += f"{line}\n"
|
|
496
|
+
code += "outputs.append(template.create_output_definition(new_output))\n\n"
|
|
497
|
+
|
|
498
|
+
code += "# Define the basic and output-based stopping conditions.\n"
|
|
499
|
+
gsc = self.get_general_stopping_conditions()
|
|
500
|
+
code += f"template.update_general_stopping_conditions({gsc.max_iterations}, "
|
|
501
|
+
code += f"{gsc.max_physical_time}, {gsc.max_inner_iterations}, {gsc.stop_on_any})\n"
|
|
502
|
+
|
|
503
|
+
for i, sc in enumerate(self.list_stopping_conditions()):
|
|
504
|
+
if i == 0:
|
|
505
|
+
code += "\n# Output-based conditions require the ID of the associated output.\n"
|
|
506
|
+
# Find the old output to use the new ID created by create_output_definition.
|
|
507
|
+
for j, od in enumerate(output_definitions):
|
|
508
|
+
if sc.output_definition_id == od.id:
|
|
509
|
+
code += f"template.create_or_update_stopping_condition(outputs[{j}].id, "
|
|
510
|
+
code += f"{sc.threshold}, {sc.start_at_iteration}, {sc.averaging_iterations}, "
|
|
511
|
+
code += f"{sc.iterations_to_consider})\n"
|
|
512
|
+
break
|
|
513
|
+
|
|
514
|
+
return code
|
|
515
|
+
|
|
445
516
|
|
|
446
517
|
def get_simulation_template(id: SimulationTemplateID) -> SimulationTemplate:
|
|
447
518
|
"""
|
luminarycloud/solution.py
CHANGED
|
@@ -6,11 +6,13 @@ from os import PathLike
|
|
|
6
6
|
import luminarycloud as lc
|
|
7
7
|
|
|
8
8
|
from ._client import get_default_client
|
|
9
|
+
from ._helpers.warnings import experimental
|
|
9
10
|
from ._helpers.download import (
|
|
10
11
|
download_surface_solution,
|
|
11
12
|
download_volume_solution,
|
|
12
13
|
download_surface_deformation_template,
|
|
13
14
|
download_surface_sensitivity_data,
|
|
15
|
+
download_parameter_sensitivity_data,
|
|
14
16
|
)
|
|
15
17
|
from ._helpers.file_chunk_stream import FileChunkStream
|
|
16
18
|
from ._proto.api.v0.luminarycloud.solution import solution_pb2 as solutionpb
|
|
@@ -131,7 +133,7 @@ class Solution(ProtoWrapperBase):
|
|
|
131
133
|
Project.set_surface_deformation to create simulations with volume mesh morphing.
|
|
132
134
|
"""
|
|
133
135
|
stream = download_surface_deformation_template(get_default_client(), self.id)
|
|
134
|
-
|
|
136
|
+
_handle_surface_data_stream(stream, dst)
|
|
135
137
|
|
|
136
138
|
def download_surface_sensitivity_data(self, dst: Optional[PathLike] = None) -> None:
|
|
137
139
|
"""
|
|
@@ -142,4 +144,17 @@ class Solution(ProtoWrapperBase):
|
|
|
142
144
|
The IDs of the sensitivity data are consistent with the node IDs of the surface deformation.
|
|
143
145
|
"""
|
|
144
146
|
stream = download_surface_sensitivity_data(get_default_client(), self.id)
|
|
145
|
-
|
|
147
|
+
_handle_surface_data_stream(stream, dst)
|
|
148
|
+
|
|
149
|
+
@experimental
|
|
150
|
+
def download_parameter_sensitivity_data(self, dst: Optional[PathLike] = None) -> None:
|
|
151
|
+
"""
|
|
152
|
+
Download the parameter sensitivity data associated with an adjoint solution into the
|
|
153
|
+
destination file or into a default-named file. The data consists of parameter names and
|
|
154
|
+
sensitivity values (d "adjoint output" / d "SimulationParam parameter").
|
|
155
|
+
|
|
156
|
+
NOTE: This is a very experimental feature, likely to change in the future in favor of
|
|
157
|
+
including the sensitivities in a SimulationParam object directly.
|
|
158
|
+
"""
|
|
159
|
+
stream = download_parameter_sensitivity_data(get_default_client(), self.id)
|
|
160
|
+
_handle_surface_data_stream(stream, dst)
|
luminarycloud/types/__init__.py
CHANGED
luminarycloud/types/adfloat.py
CHANGED
|
@@ -1,19 +1,40 @@
|
|
|
1
|
+
from abc import ABCMeta
|
|
1
2
|
from typing import Any
|
|
2
3
|
from .._proto.base.base_pb2 import AdFloatType, FirstOrderAdType, SecondOrderAdType
|
|
3
4
|
|
|
4
5
|
|
|
5
|
-
class
|
|
6
|
+
class AdFloat(float, metaclass=ABCMeta):
|
|
7
|
+
"""An immutable float with adjoints/tangents"""
|
|
8
|
+
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class FirstOrderAdFloat(AdFloat):
|
|
6
13
|
"""An immutable float with first order adjoints/tangents attached."""
|
|
7
14
|
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
_tangent: tuple[float, ...]
|
|
16
|
+
_adjoint: tuple[float, ...]
|
|
10
17
|
|
|
11
18
|
def __new__(cls: type["FirstOrderAdFloat"], value: float, *_: Any) -> "FirstOrderAdFloat":
|
|
12
19
|
return super().__new__(cls, value)
|
|
13
20
|
|
|
14
21
|
def __init__(self, value: float, tangent: tuple[float, ...], adjoint: tuple[float, ...]):
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
if isinstance(value, AdFloat):
|
|
23
|
+
raise ValueError("Value cannot be an AdFloat")
|
|
24
|
+
if any(isinstance(t, AdFloat) for t in tangent):
|
|
25
|
+
raise ValueError("Tangent cannot be an AdFloat")
|
|
26
|
+
if any(isinstance(a, AdFloat) for a in adjoint):
|
|
27
|
+
raise ValueError("Adjoint cannot be an AdFloat")
|
|
28
|
+
self._tangent = tuple(float(t) for t in tangent)
|
|
29
|
+
self._adjoint = tuple(float(a) for a in adjoint)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def tangent(self) -> tuple[float, ...]:
|
|
33
|
+
return self._tangent
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def adjoint(self) -> tuple[float, ...]:
|
|
37
|
+
return self._adjoint
|
|
17
38
|
|
|
18
39
|
@staticmethod
|
|
19
40
|
def _from_proto(proto: FirstOrderAdType) -> "FirstOrderAdFloat":
|
|
@@ -24,12 +45,12 @@ class FirstOrderAdFloat(float):
|
|
|
24
45
|
)
|
|
25
46
|
|
|
26
47
|
|
|
27
|
-
class SecondOrderAdFloat(
|
|
48
|
+
class SecondOrderAdFloat(AdFloat):
|
|
28
49
|
"""An immutable float with second order adjoints/tangents attached."""
|
|
29
50
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
51
|
+
_value: FirstOrderAdFloat
|
|
52
|
+
_tangent: tuple[FirstOrderAdFloat, ...]
|
|
53
|
+
_adjoint: tuple[FirstOrderAdFloat, ...]
|
|
33
54
|
|
|
34
55
|
def __new__(cls, value: FirstOrderAdFloat, *_: Any) -> "SecondOrderAdFloat":
|
|
35
56
|
return super().__new__(cls, value)
|
|
@@ -42,16 +63,25 @@ class SecondOrderAdFloat(float):
|
|
|
42
63
|
):
|
|
43
64
|
if not isinstance(value, FirstOrderAdFloat):
|
|
44
65
|
raise TypeError("Value must be a FirstOrderAdFloat")
|
|
45
|
-
for t in tangent:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
66
|
+
if any(not isinstance(t, FirstOrderAdFloat) for t in tangent):
|
|
67
|
+
raise TypeError("Tangent must be a tuple of FirstOrderAdFloat")
|
|
68
|
+
if any(not isinstance(a, FirstOrderAdFloat) for a in adjoint):
|
|
69
|
+
raise TypeError("Adjoint must be a tuple of FirstOrderAdFloat")
|
|
70
|
+
self._value = value
|
|
71
|
+
self._tangent = tangent
|
|
72
|
+
self._adjoint = adjoint
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def value(self) -> FirstOrderAdFloat:
|
|
76
|
+
return self._value
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def tangent(self) -> tuple[FirstOrderAdFloat, ...]:
|
|
80
|
+
return self._tangent
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def adjoint(self) -> tuple[FirstOrderAdFloat, ...]:
|
|
84
|
+
return self._adjoint
|
|
55
85
|
|
|
56
86
|
@staticmethod
|
|
57
87
|
def _from_proto(proto: SecondOrderAdType) -> "SecondOrderAdFloat":
|
luminarycloud/types/ids.py
CHANGED
|
@@ -8,3 +8,6 @@ SimulationID = NewType("SimulationID", str)
|
|
|
8
8
|
SolutionID = NewType("SolutionID", str)
|
|
9
9
|
SimulationTemplateID = NewType("SimulationTemplateID", str)
|
|
10
10
|
GeometryFeatureID = NewType("GeometryFeatureID", str)
|
|
11
|
+
NamedVariableSetID = NewType("NamedVariableSetID", str)
|
|
12
|
+
PhysicsAiArchitectureID = NewType("PhysicsAiArchitectureID", str)
|
|
13
|
+
PhysicsAiModelID = NewType("PhysicsAiModelID", str)
|
luminarycloud/vis/__init__.py
CHANGED
luminarycloud/vis/display.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from .display import DisplayAttributes
|
|
2
|
-
from .filters import SurfaceStreamlines, Filter
|
|
2
|
+
from .filters import SurfaceStreamlines, Filter, SurfaceLIC
|
|
3
3
|
from .._client import get_default_client
|
|
4
4
|
from ..enum.vis_enums import EntityType, SceneMode
|
|
5
5
|
from typing import TYPE_CHECKING, cast
|
|
@@ -15,6 +15,9 @@ except ImportError:
|
|
|
15
15
|
lcj = None
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
_SOURCE_FILTER_ID = "___LC_SOURCE_FILTER___"
|
|
19
|
+
|
|
20
|
+
|
|
18
21
|
class InteractiveScene:
|
|
19
22
|
"""
|
|
20
23
|
The InteractiveScene acts as the bridge between the the Scene and
|
|
@@ -39,6 +42,9 @@ class InteractiveScene:
|
|
|
39
42
|
self.widget._ipython_display_()
|
|
40
43
|
|
|
41
44
|
def set_scene(self, scene: "Scene") -> None:
|
|
45
|
+
# Import here to avoid circular import issue
|
|
46
|
+
from .visualization import LookAtCamera
|
|
47
|
+
|
|
42
48
|
# Display the initial scene we've been given
|
|
43
49
|
# Submit request for the render data URLs we need
|
|
44
50
|
req = vis_pb2.GetRenderDataUrlsRequest()
|
|
@@ -67,6 +73,12 @@ class InteractiveScene:
|
|
|
67
73
|
bad_ids = scene._validate_surfaces_and_tags(streamlines._surface_names)
|
|
68
74
|
if len(bad_ids) != 0:
|
|
69
75
|
raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
|
|
76
|
+
if isinstance(filter, SurfaceLIC):
|
|
77
|
+
# Validate surfaces names
|
|
78
|
+
lic = cast(SurfaceLIC, filter)
|
|
79
|
+
bad_ids = scene._validate_surfaces_and_tags(lic._surface_names)
|
|
80
|
+
if len(bad_ids) != 0:
|
|
81
|
+
raise ValueError(f"SurfaceStreamlines has invalid surfaces: {bad_ids}")
|
|
70
82
|
|
|
71
83
|
if isinstance(filter, Filter):
|
|
72
84
|
vis_filter: vis_pb2.Filter = filter._to_proto()
|
|
@@ -85,6 +97,27 @@ class InteractiveScene:
|
|
|
85
97
|
# is moved there.
|
|
86
98
|
self.widget.set_workspace_state(scene, resp)
|
|
87
99
|
|
|
100
|
+
# Sync display attributes and visibilities for surfaces
|
|
101
|
+
self.set_display_attributes(_SOURCE_FILTER_ID, scene.global_display_attrs)
|
|
102
|
+
for s, v in scene._surface_visibilities.items():
|
|
103
|
+
self.set_surface_visibility(s, v)
|
|
104
|
+
|
|
105
|
+
for f in scene._filters:
|
|
106
|
+
self.set_display_attributes(f.id, f.display_attrs)
|
|
107
|
+
|
|
108
|
+
# Find and apply the first look at camera, if any, in the scene
|
|
109
|
+
set_camera = False
|
|
110
|
+
for c in scene._cameras:
|
|
111
|
+
if not isinstance(c, LookAtCamera):
|
|
112
|
+
continue
|
|
113
|
+
set_camera = True
|
|
114
|
+
self.set_camera(c)
|
|
115
|
+
|
|
116
|
+
# If we don't have an initial camera to use, reset the camera after loading
|
|
117
|
+
# the workspace state
|
|
118
|
+
if not set_camera:
|
|
119
|
+
self.reset_camera()
|
|
120
|
+
|
|
88
121
|
def set_surface_visibility(self, surface_id: str, visible: bool) -> None:
|
|
89
122
|
self.widget.set_surface_visibility(surface_id, visible)
|
|
90
123
|
|
|
@@ -97,6 +130,12 @@ class InteractiveScene:
|
|
|
97
130
|
def reset_camera(self) -> None:
|
|
98
131
|
self.widget.reset_camera()
|
|
99
132
|
|
|
133
|
+
def set_camera(self, camera: "LookAtCamera") -> None:
|
|
134
|
+
self.widget.camera_pan = [camera.pan_x, camera.pan_y]
|
|
135
|
+
self.widget.camera_position = [camera.position[0], camera.position[1], camera.position[2]]
|
|
136
|
+
self.widget.camera_look_at = [camera.look_at[0], camera.look_at[1], camera.look_at[2]]
|
|
137
|
+
self.widget.camera_up = [camera.up[0], camera.up[1], camera.up[2]]
|
|
138
|
+
|
|
100
139
|
def get_camera(self) -> "LookAtCamera":
|
|
101
140
|
# Import here to avoid circular import issue
|
|
102
141
|
from .visualization import LookAtCamera
|
|
@@ -105,4 +144,11 @@ class InteractiveScene:
|
|
|
105
144
|
camera.position = self.widget.camera_position
|
|
106
145
|
camera.look_at = self.widget.camera_look_at
|
|
107
146
|
camera.up = self.widget.camera_up
|
|
147
|
+
# Immediately after creation, the widget's camera_pan is empty, so avoid going out of bounds
|
|
148
|
+
# and report 0 which is what it would be anyway
|
|
149
|
+
camera.pan_x = self.widget.camera_pan[0] if self.widget.camera_pan else 0
|
|
150
|
+
camera.pan_y = self.widget.camera_pan[1] if self.widget.camera_pan else 0
|
|
108
151
|
return camera
|
|
152
|
+
|
|
153
|
+
def set_triad_visible(self, visible: bool) -> None:
|
|
154
|
+
self.widget.set_triad_visible(visible)
|