|
| 1 | +.. _ringclustermotor: |
| 2 | + |
| 3 | +RingClusterMotor Class Usage |
| 4 | +============================ |
| 5 | + |
| 6 | +Here we explore different features of the ``RingClusterMotor`` class. |
| 7 | + |
| 8 | +``RingClusterMotor`` models a ring (annular) configuration of ``N`` identical |
| 9 | +motors arranged symmetrically around a circular perimeter of a given radius, |
| 10 | +with no central motor along the rocket's longitudinal axis. It is a thin |
| 11 | +wrapper around a single, already-defined motor: all thrust-, mass- and |
| 12 | +inertia-related quantities are derived automatically from that base motor, |
| 13 | +its ``number`` of copies and their ``radius`` from the rocket's central axis. |
| 14 | + |
| 15 | +Key Assumptions |
| 16 | +--------------- |
| 17 | + |
| 18 | +- ``number`` must be an integer ``>= 2``; |
| 19 | +- ``radius`` must be non-negative; |
| 20 | +- The base motor is currently expected to be a ``SolidMotor``, since |
| 21 | + ``RingClusterMotor`` reuses its grain properties directly; |
| 22 | +- Motors are assumed identical and evenly spaced around the ring |
| 23 | + (``360 / number`` degrees apart); |
| 24 | +- The transverse inertia (``I11``/``I22``) contribution of each motor is |
| 25 | + computed explicitly via the parallel axis (Steiner) theorem for every |
| 26 | + angular position, which keeps the result accurate even for the |
| 27 | + asymmetric ``number=2`` case. |
| 28 | + |
| 29 | +Creating a Ring Cluster Motor |
| 30 | +------------------------------ |
| 31 | + |
| 32 | +To define a ``RingClusterMotor``, we first need a fully defined base motor |
| 33 | +(typically a ``SolidMotor``), then wrap it with the number of motors in the |
| 34 | +cluster and their radial distance from the rocket's central axis: |
| 35 | + |
| 36 | +.. jupyter-execute:: |
| 37 | + |
| 38 | + from rocketpy import SolidMotor, RingClusterMotor |
| 39 | + |
| 40 | + base_motor = SolidMotor( |
| 41 | + thrust_source="../data/motors/cesaroni/Cesaroni_M1670.eng", |
| 42 | + dry_mass=1.815, |
| 43 | + dry_inertia=(0.125, 0.125, 0.002), |
| 44 | + nozzle_radius=33 / 1000, |
| 45 | + grain_number=5, |
| 46 | + grain_density=1815, |
| 47 | + grain_outer_radius=33 / 1000, |
| 48 | + grain_initial_inner_radius=15 / 1000, |
| 49 | + grain_initial_height=120 / 1000, |
| 50 | + grain_separation=5 / 1000, |
| 51 | + grains_center_of_mass_position=0.397, |
| 52 | + center_of_dry_mass_position=0.317, |
| 53 | + nozzle_position=0, |
| 54 | + burn_time=3.9, |
| 55 | + throat_radius=11 / 1000, |
| 56 | + coordinate_system_orientation="nozzle_to_combustion_chamber", |
| 57 | + ) |
| 58 | + |
| 59 | + cluster_motor = RingClusterMotor( |
| 60 | + motor=base_motor, |
| 61 | + number=4, |
| 62 | + radius=0.1, |
| 63 | + ) |
| 64 | + |
| 65 | + # Print the cluster (and underlying single-motor) information |
| 66 | + cluster_motor.info() |
| 67 | + |
| 68 | +.. note:: |
| 69 | + |
| 70 | + ``RingClusterMotor`` does not read a thrust curve file directly. Instead, |
| 71 | + it scales the ``thrust``, ``dry_mass``, ``propellant_mass`` and inertia |
| 72 | + properties of the ``motor`` passed in by ``number``, so any changes to |
| 73 | + ``base_motor`` must be made before it is wrapped. |
| 74 | + |
| 75 | +Since a ``RingClusterMotor`` is a ``Motor`` like any other, it can be attached |
| 76 | +to a ``Rocket`` with :meth:`Rocket.add_motor` exactly like a ``SolidMotor``, |
| 77 | +``HybridMotor`` or ``LiquidMotor`` would be. |
| 78 | + |
| 79 | +Visualizing the Cluster Layout |
| 80 | +------------------------------- |
| 81 | + |
| 82 | +The ``draw_cluster_layout`` method plots the position of each motor around |
| 83 | +the ring, which is useful to double-check the ``number`` and ``radius`` |
| 84 | +parameters before running a simulation: |
| 85 | + |
| 86 | +.. jupyter-execute:: |
| 87 | + |
| 88 | + cluster_motor.draw_cluster_layout(rocket_radius=0.15) |
| 89 | + |
| 90 | +.. tip:: |
| 91 | + |
| 92 | + Passing ``rocket_radius`` draws the rocket's outer tube as a dashed |
| 93 | + circle, which helps confirm that the motors fit inside the airframe. |
0 commit comments