The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Tribology::Lubricant - Data type that represents a Lubricant class.


This class, given technical data based on lubricant TDS/PDS documents assists in calculation of various Rheologic characteristics of the lubricant. Such as:

  • V-T behavior (m()) using Ubbelohde-Walter equation

  • Calculate viscosity at a given temperature ( visc() ) when any of two calibration points are known

  • Calculate viscosity index using ASTM D2270's A and B procedures ( vi() )

  • Lookup L and H constants of the lubricant using ASTM D2270 Table and using linear interoplation whenever neccessary ( LH() )


    require Tribology::Lubricant;

    # We already have viscosity at 40C and 100C. 
    my $lub = Tribology::Lubricant->new({
        label   => "Naphthenic spindle oil",
        visc40  => 30,
        visc100 => 100

    # Viscosity @ 50C:
    my $visc50 = $lub->visc(50);

    # Viscosity index (VI)
    my $vi = $lub->vi;

    # Viscosity-temperature constant:
    my $vtc = $lub->vtc;

    # m-value, aka V-T behavior coefficient
    my $m = $lub->m;

    # To draw the V-T (hyperbolic) graph of this particular lubricant we can generate data-points, say, from -20 to +100:

    my @data_points;
    for my $T(-20..100) {
        push @data_points, [$T, $lub->visc($T)];

    # Now you may pass @data_points to either GDGrap(Perl) or Highcharts(JS).  


Constructor. Following attributes (all optional) can be passed:


Arbitrary label of the lubricant. Used in graph data or report tables, charts

visc40, visc100

Viscosity @ 40 and 100 degrees Celcius.


Viscosity index of the lubricant.


Specific gravity of the lubricant at a given temperature point. Must be passed a hashref of Temprature-Density values. Density must be in kg/cm3.

IMPORTANT visc40 and visc100 are just convenience attributes, since they are most widely given in product TDSs. If you don't have calibration points at these temperatures IGNORE these attributes. Instead, create empty constructor, set the calibration values you already have using visc() method. Such as:

    my $lubricant = Tribology::Lubricant->new({label => "Hypothetical lubricant"});
    $lubricant->visc(50, 80);
    $lubricant->visc(100, 5.23);


Returns and/or sets label of the lubricant

visc($T, $cst)

Given temperature ($T) in celcius returns kinematic viscosity in cst. If such value was not given to the constructor it attempts to calculate this number using Ubbelohde-Walter equation. For this to be possible at least two calibration points must be given to new() or two calibration points must be set using two-argument syntax of visc().

If second argument is passed sets the viscosity point and returns the value $cst as is.

# 1.10 (eni), bo'yi ( 2.27 )


Heart of the Ubbelohde-Walter equation. This is the coeffient that characterises V-T behavior of oils. It's a double-logarithmic V-T graph slope. It requires at least two calibration points be present, or must be calculatable to work. Otherwise it throws error (croaks).


Returns L and H values for the given lubricant. For this method to work lubricant's viscosity @ 100C must be known or calculatable.


Returns viscosity index of the lubricant, if such is possible. Remember, for this to be possible calibration points at 40C and 100C must be available or calculatble. If it's impossible, it returns undef and writes a warning to STDERR. When checking for error you must check for undef at return.


Returns VTC - viscosity-temperature constant used in Ubbelohde-Walter equation to better differentiate V-T behavior when the influence of temperature is low. This constant must be used to accurately (or properly) calculate m. To calculate this value properly we need to have calibration points at 40C and 100C. If either of these points are missing vtc() defaults to 0.8.


Based on the m constant or vi attempts to guess if current instance represents a mineral oil.



Given temperature in celcius converts it to Kelvin


Given temperature in Kelvin converts it to celcius


Returns all known calibration points to the lubricant as array reference. If $limit is given limits the result set to that many points. The points are guaranteed to be in ascending order by temperature. All temperature points are converted to Kelvin, since that's what all internal formulas rely on.


Uses algorithm described in 5. Procedure A section of ASTM D2270. When you use vi() it invokes either method accordingly.


Uses algorithm described in 6. Procedure B section of ASTM D2270. When you use vi() it invokes either method accordingly.


Lubricants and Lubrication, Second Edition by Wiley-VCH