function mechanical_mobility              {  air     nitrogen }
 {velocity/force} (GasMass         {amu}, { 28.96    28.02    }
 {  (m/s) / fN  }  Polarizability  {nm3}, {  0.00171  0.00174 }
 {   1e12 CGS   }  VisCon1         {nm},  {  0.3036   0.2996  }
  {JAS26, 1995}    VisCon2         {K},   { 44       40       }
  {pp. 459-475}    VisCon3,               {  0.8      0.7     }
{corrected 2011}   Pressure        {mb},
                   Temperature     {K},
                   ParticleDensity {g cm-3, for cluster ions typically 2.08},
                   ParticleCharge  {e, for cluster ions 1},
                   MassDiameter    {nm} : real) : real;
 {NB: Multiply with 1.6022 to get electrical mobility of
      a single charged cluster or particle in cm2V-1s-1}

  function Omega11 (x : real) : real; {*(1,1)*(T*) for (*-4) potential}
    var p, q : real;                  {and elastic-specular collisions}
    begin
      if x > 1 then Omega11 := 1 + 0.106 / x + 0.263 / exp ((4/3) * ln (x))
      else begin p := sqrt (x); q := sqrt (p);
        Omega11 := 1.4691 / p - 0.341 / q + 0.181 * x * q + 0.059 end;
    end;

  const a = 1.165; b = 0.48; c = 1.001; {the slip factor coefficients}
     // a = 1.2; b = 0.5; c = 1; {old version}
        ExtraDistance = 0.115 {nm}; TransitionDiameter = 2.48 {nm};
  var   GasDiameter, MeanVelocity, Viscosity, FreePath, DipolEffect,
        DeltaTemperature, CheckMark, ParticleMass, CollisionDistance,
        Kn, Omega, s, x, y : real;
  begin
    if MassDiameter < 0.2 then  // emergency exit
    begin mechanical_mobility := 1e99; exit; end;
    Viscosity {microPa s} := 0.02713 * sqrt (GasMass * Temperature) /
      sqr (VisCon1 * (1 + exp (VisCon3 * ln (VisCon2 / Temperature))));
    MeanVelocity {m/s} := 145.5 * sqrt (Temperature / GasMass);
    FreePath  {nm} := (166251 * Viscosity * Temperature) /
                      (GasMass * Pressure * MeanVelocity);
    ParticleMass {amu} := 315.3 * ParticleDensity *
                                  exp (3 * ln (MassDiameter));
    DeltaTemperature := Temperature;
    repeat
      CheckMark := DeltaTemperature;
      GasDiameter {nm} := VisCon1 *
        (1 + exp (VisCon3 * ln (VisCon2 / DeltaTemperature)));
      CollisionDistance {nm} := MassDiameter / 2 + ExtraDistance +
                                 GasDiameter / 2;
      DipolEffect := 8355 * sqr (ParticleCharge) * Polarizability /
                            sqr (sqr (CollisionDistance));
                           {NB: erratum (ParticleCharge) in JAS is corrected}
      DeltaTemperature := Temperature + DipolEffect;
    until abs (CheckMark - DeltaTemperature) < 0.01;
    if ParticleCharge = 0 then Omega := 1
                          else Omega := Omega11 (Temperature / DipolEffect);
    Kn := FreePath / CollisionDistance;
    if Kn < 0.03 {underflow safe} then y := 0 else y := exp (- c / Kn);
                 {NB! erratum in JAS (y := 1) corrected!}
    x := (273.15 / DeltaTemperature) *
         exp (3 * ln (TransitionDiameter / MassDiameter));
    if x > 30 {overflow safe} then s := 1
      else if x > 0.001
      then s := 1 + exp (x) * sqr (x / (exp (x) - 1)) * (2.25 / (a + b) - 1)
      else {underflow safe}  s := 1 + (2.25 / (a + b) - 1);
    mechanical_mobility := ((2.25 / (a + b)) / (Omega + s - 1))  *
                           sqrt (1 + GasMass / ParticleMass) *
                           (1 + Kn * (a + b * y)) /
                           (6 * PI * Viscosity * CollisionDistance);
  end;