System in Analysis

The complete example code is available here.
The mechanical powertrain to be studied is the one described in the 7 - Worm and Helical Gears example.
We want to apply an external load torque picked from a file.

External Load Torque Analysis

The external load torque data are stored in a file named 'external_torque_data.csv' in the 'data' folder; we have to open this file:

import os
import pandas as pd

ext_torque_data = pd.read_csv(os.path.join('data', 'external_torque_data.csv'))

print(ext_torque_data)
     angular position (deg)  external torque (mNm)
0                       0.0                  800.0
1                       1.0                  740.0
2                       2.0                  680.0
3                       3.0                  620.0
4                       4.0                  560.0
..                      ...                    ...
176                   176.0                 1540.0
177                   177.0                 1780.0
178                   178.0                 2020.0
179                   179.0                 2260.0
180                   180.0                 2500.0

We can see that the file contains two columns: one for the angular position of the last gear, in deg, and the other one for the applied external torque, in mNm. The file contains 181 rows, one for each degree from 0 deg up to 180 deg.
We can plot this data in order to have a better understanding of the applied external torque:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

ax.plot(
    ext_torque_data['angular position (deg)'],
    ext_torque_data['external torque (mNm)']
)

ax.set_xlabel('angular position (deg)')
ax.set_ylabel('external torque (mNm)')

plt.show()

The external load starts from 800 mNm and decreases up to a base level at 200 mNm. Then, it gradually increases up to 1200 mNm, where stays constant up to 90 deg, after which it quickly decreases to the base level. Finally, it increases faster and faster as the angular position approaches to 180 deg.

Model Set Up

We have to use an interpolation function to model the external load torque:

from scipy.interpolate import interp1d

ext_torque_func = interp1d(
    x=ext_torque_data['angular position (deg)'],
    y=ext_torque_data['external torque (mNm)'],
    fill_value='extrapolate'
)

This interpolation function accept values in deg and returns values in mNm.
Moreover, this interpolation function can accept values outside the 0 deg - 180 deg interval provided by data, so we can compute the external load torque even if the last gear angular position is outside this range.
Now we can set the external load:

def ext_torque(time, angular_position, angular_speed):
    return Torque(
        value=ext_torque_func(angular_position.to('deg').value).take(0),
        unit='mNm'
    )

gear_4.external_torque = ext_torque

In order to grasp the external torque pattern, we use a fine time discretization in the solver:

solver = Solver(powertrain=powertrain)
solver.run(
    time_discretization=TimeInterval(0.01, 'sec'),
    simulation_time=TimeInterval(8, 'sec'))

The remaining set-ups of the model stay the same.

Results Analysis

We can get a snapshot of the system at a particular time of interest:

powertrain.snapshot(
    target_time=Time(8, 'sec'),
    angular_position_unit='deg',
    torque_unit='mNm',
    driving_torque_unit='mNm',
    load_torque_unit='mNm'
)
Mechanical Powertrain Status at Time = 8 sec
            angular position (deg)  angular speed (rad/s)  angular acceleration (rad/s^2)  torque (mNm)  driving torque (mNm)  load torque (mNm) tangential force (N)  pwm
motor                197248.535916                    0.0                             0.0    -20.256702             10.000000          30.256702                       1.0
flywheel             197248.535916                    0.0                             0.0    -20.256702             10.000000          30.256702
worm gear            197248.535916                    0.0                             0.0    -20.256702             10.000000          30.256702
worm wheel             3944.970718                    0.0                             0.0   -274.395658            135.459195         409.854853
gear 1                 3944.970718                    0.0                             0.0   -274.395658            135.459195         409.854853
gear 2                  788.994144                    0.0                             0.0  -1234.780461            609.566378        1844.346839
gear 3                  788.994144                    0.0                             0.0  -1234.780461            609.566378        1844.346839           245.912912
gear 4                  197.248536                    0.0                             0.0  -4445.209659           2194.438961        6639.648620

We can get a more general view of the system by plotting the time variables and focus the plot only on interesting elements and variables. Also, we can specify a more convenient unit to use when plotting torques:

powertrain.plot(
    figsize=(8, 8),
    elements=['motor', 'gear 3', 'gear 4'],
    angular_position_unit='deg',
    torque_unit='mNm',
    variables=[
        'angular position',
        'angular speed',
        'angular acceleration',
        'driving torque',
        'load torque',
        'torque',
        'tangential force'
    ]
)

We can see that the tangential force on the gear 3 follows the same pattern of the applied external torque. There is only a slight difference at the beginning, when the angular position of the system is not linear with respect to the time, and at the end, when the external load torque is so high that the motor cannot push forward anymore.
The load torque of each powertrain’s element follow the same pattern.
We can see from the snapshot and from the plot that the gear 4‘s angular position is more than 197 deg. Even if this angular position is outside the 0 deg - 180 deg provided by the data in the file, the defined interpolation function ext_torque_func is still able to compute the external load torque, which is more than 6600 mNm.