|
1 | 1 | from enum import Enum |
2 | | -from typing import Optional, Tuple, List |
| 2 | +from typing import Optional, Tuple, List, Union |
3 | 3 | from pydantic import BaseModel, PrivateAttr |
4 | 4 |
|
5 | 5 |
|
@@ -27,80 +27,81 @@ class TankFluids(BaseModel): |
27 | 27 | density: float |
28 | 28 |
|
29 | 29 |
|
| 30 | +class InterpolationMethods(str, Enum): |
| 31 | + LINEAR: str = "LINEAR" |
| 32 | + SPLINE: str = "SPLINE" |
| 33 | + AKIMA: str = "AKIMA" |
| 34 | + |
| 35 | + |
30 | 36 | class MotorTank(BaseModel): |
31 | 37 | # Required parameters |
32 | | - geometry: List[Tuple[Tuple[float, float], float]] = [ |
33 | | - ((0.0, 5.0), 1.0), |
34 | | - ((5.0, 10.0), 2.0), |
35 | | - ] |
36 | | - gas: TankFluids = TankFluids(name="GAS", density=100) |
37 | | - liquid: TankFluids = TankFluids(name="LIQUID", density=1000) |
38 | | - flux_time: Tuple[float, float] = (0.0, 3.9) |
39 | | - position: float = 1.0 |
40 | | - discretize: int = 100 |
| 38 | + geometry: List[Tuple[Tuple[float, float], float]] |
| 39 | + gas: TankFluids |
| 40 | + liquid: TankFluids |
| 41 | + flux_time: Tuple[float, float] |
| 42 | + position: float |
| 43 | + discretize: int |
41 | 44 |
|
42 | 45 | # Level based tank parameters |
43 | | - liquid_height: Optional[float] = 0.5 |
| 46 | + liquid_height: Optional[float] |
44 | 47 |
|
45 | 48 | # Mass based tank parameters |
46 | | - liquid_mass: Optional[float] = 5.0 |
47 | | - gas_mass: Optional[float] = 0.1 |
| 49 | + liquid_mass: Optional[float] |
| 50 | + gas_mass: Optional[float] |
48 | 51 |
|
49 | 52 | # Mass flow based tank parameters |
50 | | - gas_mass_flow_rate_in: Optional[float] = 0.0 |
51 | | - gas_mass_flow_rate_out: Optional[float] = 0.1 |
52 | | - liquid_mass_flow_rate_in: Optional[float] = 0.0 |
53 | | - liquid_mass_flow_rate_out: Optional[float] = 1 |
54 | | - initial_liquid_mass: Optional[float] = 5.0 |
55 | | - initial_gas_mass: Optional[float] = 0.4 |
| 53 | + gas_mass_flow_rate_in: Optional[float] |
| 54 | + gas_mass_flow_rate_out: Optional[float] |
| 55 | + liquid_mass_flow_rate_in: Optional[float] |
| 56 | + liquid_mass_flow_rate_out: Optional[float] |
| 57 | + initial_liquid_mass: Optional[float] |
| 58 | + initial_gas_mass: Optional[float] |
56 | 59 |
|
57 | 60 | # Ullage based tank parameters |
58 | | - ullage: Optional[float] = 0.1 |
| 61 | + ullage: Optional[float] |
59 | 62 |
|
60 | 63 | # Optional parameters |
61 | | - name: Optional[str] = "Tank" |
| 64 | + name: Optional[str] |
62 | 65 |
|
63 | 66 | # Computed parameters |
64 | 67 | tank_kind: TankKinds = TankKinds.MASS_FLOW |
65 | 68 |
|
66 | 69 |
|
67 | 70 | class Motor(BaseModel): |
68 | 71 | # Required parameters |
69 | | - thrust_source: List[List[float]] = [[0.0, 0.0], [1.0, 1.0]] |
70 | | - burn_time: float = 3.9 |
71 | | - nozzle_radius: float = 0.033 |
72 | | - dry_mass: float = 1.815 |
73 | | - dry_inertia: Tuple[float, float, float] = (0.125, 0.125, 0.002) |
74 | | - center_of_dry_mass_position: float = 0.317 |
| 72 | + thrust_source: List[List[float]] |
| 73 | + burn_time: float |
| 74 | + nozzle_radius: float |
| 75 | + dry_mass: float |
| 76 | + dry_inertia: Tuple[float, float, float] |
| 77 | + center_of_dry_mass_position: float |
75 | 78 |
|
76 | 79 | # Generic motor parameters |
77 | | - chamber_radius: Optional[float] = 0.033 |
78 | | - chamber_height: Optional[float] = 0.1 |
79 | | - chamber_position: Optional[float] = 0.0 |
80 | | - propellant_initial_mass: Optional[float] = 1.0 |
81 | | - nozzle_position: Optional[float] = 0.0 |
| 80 | + chamber_radius: Optional[float] = None |
| 81 | + chamber_height: Optional[float] = None |
| 82 | + chamber_position: Optional[float] = None |
| 83 | + propellant_initial_mass: Optional[float] = None |
| 84 | + nozzle_position: Optional[float] = None |
82 | 85 |
|
83 | 86 | # Liquid motor parameters |
84 | | - tanks: Optional[List[MotorTank]] = [MotorTank()] |
| 87 | + tanks: Optional[List[MotorTank]] = None |
85 | 88 |
|
86 | 89 | # Solid motor parameters |
87 | | - grain_number: Optional[int] = 5 |
88 | | - grain_density: Optional[float] = 1815 |
89 | | - grain_outer_radius: Optional[float] = 0.033 |
90 | | - grain_initial_inner_radius: Optional[float] = 0.015 |
91 | | - grain_initial_height: Optional[float] = 0.12 |
92 | | - grains_center_of_mass_position: Optional[float] = -0.85704 |
93 | | - grain_separation: Optional[float] = 0.005 |
| 90 | + grain_number: Optional[int] = None |
| 91 | + grain_density: Optional[float] = None |
| 92 | + grain_outer_radius: Optional[float] = None |
| 93 | + grain_initial_inner_radius: Optional[float] = None |
| 94 | + grain_initial_height: Optional[float] = None |
| 95 | + grains_center_of_mass_position: Optional[float] = None |
| 96 | + grain_separation: Optional[float] = None |
94 | 97 |
|
95 | 98 | # Hybrid motor parameters |
96 | | - throat_radius: Optional[float] = 0.011 |
| 99 | + throat_radius: Optional[float] = None |
97 | 100 |
|
98 | 101 | # Optional parameters |
99 | | - interpolation_method: Optional[str] = "linear" |
100 | | - coordinate_system_orientation: Optional[CoordinateSystemOrientation] = ( |
101 | | - CoordinateSystemOrientation.NOZZLE_TO_COMBUSTION_CHAMBER |
102 | | - ) |
103 | | - reshape_thrust_curve: Optional[bool] = False |
| 102 | + interpolation_method: Optional[InterpolationMethods] = None |
| 103 | + coordinate_system_orientation: Optional[CoordinateSystemOrientation] = None |
| 104 | + reshape_thrust_curve: Optional[Union[bool, tuple]] = None |
104 | 105 |
|
105 | 106 | # Computed parameters |
106 | 107 | _motor_kind: MotorKinds = PrivateAttr(default=MotorKinds.SOLID) |
|
0 commit comments