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

DESCRIPTION
   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()" )

SYNOPSIS
       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).

 new(\%attr)
   Constructor. Following attributes (all optional) can be passed:

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

   visc40, visc100
       Viscosity @ 40 and 100 degrees Celcius.

   vi  Viscosity index of the lubricant.

   density
       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);

 label($new_label)
   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 )

 m()
   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).

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

 vi()
   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.

 vtc()
   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.

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

INTERNALS
 __c2k($T)
   Given temperature in celcius converts it to Kelvin

 __k2c($T)
   Given temperature in Kelvin converts it to celcius

 __calibration_points($limit)
   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.

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

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

SEE ALSO
   Lubricants and Lubrication <http://www.amazon.com>, Second Edition by
   Wiley-VCH