# Dave's Off-Road Gear Ratio and Tire Size RPM Calculator

Memorialized in 2018
 Note I heartily recommend using this Gear Ratio Calculator on 4lo.com]. It does exactly what mine used to do.

## Look at my old tool

I wrote this calculator in the early 2000s to help me figure out the ratio on my '77 K10 Silverado (35" tires and 8" lift, auto trans and NP205 transfer case).

For the interested, I don’t mind sharing my old PHP as long as you keep in mind that in terms of my development as a programmer, it was written back when dinosaurs roamed the earth:

```<?php
// You DON'T have this dependency - Darts was my homegrown caching template engine.
// But for this tool, it's not being used for anything that isn't dirt-simple in straight PHP.
require_once("darts.php");
\$title="Dave's Off-Road Gear Ratio and Tire Size RPM Calculator";
\$description="Calculates the engine RPM range for a vehicle given it's differential gear ratio and tire size.";

\$trans = "th350";
\$tcase = "none";
\$tire =  "35";
\$diff =  "3.7";
\$crawler = "1";

if(Darts::isWebData("go")){

\$trans   = Darts::webData("trans");
\$tcase   = Darts::webData("tcase");
\$tire    = floatval(Darts::webData("tire"));
\$diff    = floatval(Darts::webData("diff"));
\$crawler = floatval(Darts::webData("crawler"));

if(\$tire < 1){ \$tire = 1; }

\$results = true;

// transmissions
switch(\$trans)
{
case "th350":   \$transLo = 2.52; \$transHi = 1.00; break; //TH 350
case "th400":   \$transLo = 2.48; \$transHi = 1.00; break; //TH 400
case "th700r4": \$transLo = 3.06; \$transHi = 0.70; break; //TH 700R4
case "4l80e":   \$transLo = 3.10; \$transHi = 0.75; break; //4L80-E
case "al1000":  \$transLo = 3.10; \$transHi = 0.71; break; //Allison 1000
case "c4":      \$transLo = 2.46; \$transHi = 1.00; break; //C-4
case "c5":      \$transLo = 2.46; \$transHi = 1.00; break; //C-5
case "c6":      \$transLo = 2.46; \$transHi = 1.00; break; //C-6
case "aod":     \$transLo = 2.40; \$transHi = 0.67; break; //Ford AOD
case "tf727":   \$transLo = 2.45; \$transHi = 1.00; break; //TorqueFlite 727
case "amcsr4":  \$transLo = 4.07; \$transHi = 1.00; break; //AMC SR4
case "sm420":   \$transLo = 7.00; \$transHi = 1.00; break; //SM 420
case "sm465":   \$transLo = 6.55; \$transHi = 1.00; break; //SM 465
case "t176":    \$transLo = 3.52; \$transHi = 1.00; break; //T-176
case "t177":    \$transLo = 3.00; \$transHi = 1.00; break; //T-177
case "t178":    \$transLo = 3.00; \$transHi = 1.00; break; //T-178
case "nv3500":  \$transLo = 4.02; \$transHi = 0.73; break; //NV3500
case "nv4500":  \$transLo = 5.61; \$transHi = 0.73; break; //NV4500
case "zfs6650": \$transLo = 5.79; \$transHi = 0.76; break; //ZF S6-650
case "amcsr4":  \$transLo = 4.07; \$transHi = 1.00; break; //AMC SR4
default:   \$transLo = 2.52; \$transHi = 1.00; break; //TH 350
}

// transfer cases
switch(\$tcase)
{
case "none":      \$tcaseLo = 1.00; \$tcaseHi = 1.00; break; // no tcase
case "dana300":   \$tcaseLo = 2.62; \$tcaseHi = 1.00; break; //Dana 300
case "bw1356":    \$tcaseLo = 2.69; \$tcaseHi = 1.00; break; //Borg Warner 1356
case "dspicer18": \$tcaseLo = 2.46; \$tcaseHi = 1.00; break; //Dana Spicer 18
case "dspicer20": \$tcaseLo = 2.00; \$tcaseHi = 1.00; break; //Dana Spicer 20
case "np203":     \$tcaseLo = 2.00; \$tcaseHi = 1.00; break; //NP 203
case "np205":     \$tcaseLo = 1.98; \$tcaseHi = 1.00; break; //NP 205
case "np207":     \$tcaseLo = 2.61; \$tcaseHi = 1.00; break; //NP 207
case "np208":     \$tcaseLo = 2.61; \$tcaseHi = 1.00; break; //NP 208
case "np231":     \$tcaseLo = 2.72; \$tcaseHi = 1.00; break; //NP 231
default:      \$tcaseLo = 1.00; \$tcaseHi = 1.00; break; // no tcase
}

if(\$crawler == "1") \$crawler = 1.00;

\$crawl_ratio = round(\$transLo * \$tcaseLo * \$crawler * \$diff, 2);
\$crawl_table = makeTable(\$crawl_ratio, \$tire, 1, 10);

\$launch_ratio = round(\$transLo * \$tcaseHi * 1.00 * \$diff, 2);
\$launch_table = makeTable(\$launch_ratio, \$tire, 1, 15);

\$highway_ratio = round(\$transHi * \$tcaseHi * 1.00 * \$diff, 2);
\$highway_table = makeTable(\$highway_ratio, \$tire, 45, 90);
}

function makeTable(\$totalGears, \$tire, \$mphStart, \$mphEnd)
{
\$table = array();
for(\$i=\$mphStart; \$i<=\$mphEnd; \$i++)
{
// rpm = (mph x (gear ratio) x 336) / tire diameter
\$rpm = (\$i * \$totalGears * 336) / \$tire;
\$rpm = round(\$rpm);
\$minrpm = max(\$rpm, 500);  // 500 is about as low as an engine should get
\$percent = makePercent(\$minrpm, 500, 6000);
\$barsize = makeBar(\$percent, 350);
\$color = makeColor(\$percent);
array_push(\$table, array("mph"=> \$i, "rpm"=> \$rpm, "minrpm"=>\$minrpm, "barsize"=> \$barsize, "color"=>\$color));
}
return \$table;
}

function makePercent(\$num, \$low, \$high){
\$num -= \$low;
if(\$num/\$high > 1){
return 1;
}
return round(\$num/\$high, 2);
}

function makeBar(\$percent, \$max){
return round(\$max * \$percent, 0);
}

function makeColor(\$percent){
// mix between red and blue where blue = 0 and red = 1
\$red = round(255 * \$percent, 0);
\$blue = 255 - \$red;
return sprintf("%02X%02X%02X", \$red, 0, \$blue);
}```

The HTML input form (the user-interface portion of the calculator) below used my Darts template engine, but could easily be converted to straight PHP or HTML (without remembering the previous settings).

```<form action="[selfnameonly]#scroll-to-results" method="post">
<ol>
<li>
<input type="hidden" name="go" value="y">
<label for="trans">Transmission</label>
<select name="trans" id="trans">
<option [formoption trans is 'th350']  >TH 350</option>
<option [formoption trans is 'th400']  >TH 400</option>
<option [formoption trans is 'th700r4']>TH 700R4</option>
<option [formoption trans is '4l80e']  >4L80-E</option>
<option [formoption trans is 'al1000'] >Allison 1000</option>
<option [formoption trans is 'c4']     >C-4</option>
<option [formoption trans is 'c5']     >C-5</option>
<option [formoption trans is 'c6']     >C-6</option>
<option [formoption trans is 'aod']    >Ford AOD</option>
<option [formoption trans is 'tf727']  >TorqueFlite 727</option>
<option [formoption trans is 'amcsr4'] >AMC SR4</option>
<option [formoption trans is 'sm420']  >SM 420</option>
<option [formoption trans is 'sm465']  >SM 465</option>
<option [formoption trans is 't176']   >T-176</option>
<option [formoption trans is 't177']   >T-177</option>
<option [formoption trans is 't178']   >T-178</option>
<option [formoption trans is 'nv3500'] >NV3500</option>
<option [formoption trans is 'nv4500'] >NV4500</option>
<option [formoption trans is 'zfs6650']>ZF S6-650</option>
<option [formoption trans is 'amcsr4'] >AMC SR4</option>
</select>
</li>
<li>
<label for="tcase">Transfer Case</label>
<select name="tcase" id="tcase">
<option [formoption tcase is 'none']   >None</option>
<option [formoption tcase is 'dana300']>Dana 300</option>
<option [formoption tcase is 'bw1356'] >Borg Warner 1356</option>
<option [formoption tcase is 'dspicer18']>Dana Spicer 18</option>
<option [formoption tcase is 'dspicer20']>Dana Spicer 20</option>
<option [formoption tcase is 'np203']  >NP 203</option>
<option [formoption tcase is 'np205']  >NP 205</option>
<option [formoption tcase is 'np207']  >NP 207</option>
<option [formoption tcase is 'np208']  >NP 208</option>
<option [formoption tcase is 'np231']  >NP 231</option>
</select>
</li>
<li>
<label for="diff">Differential Ratio (default: 1:3.7)</label>
<input type="text" name="diff" id="diff" value="[diff]" size="4" maxlength="5">
</li>
<li>
<label for="crawler">Crawl/Crawler Box Ratio (default: 1:1, meaning no crawl box)</label>
<input type="text" name="crawler" id="crawler" value="[crawler]" size="3" maxlength="3">
</li>
<li>
<label for="tire">Tire Height (<a href="http://www.dakota-truck.net/TIRECALC/tirecalc.html">find yours</a>) (inches)</label>
<input type="text" name="tire" id="tire" value="[tire]" size="3" maxlength="3">
</li>
<li>
<input type="submit" value="Calculate">
</li>
</ol>
</form>```

And finally, here’s how the results were displayed. You can see that the Darts template engine was being used again, but conversion to straight PHP is not a problem.

```[ifset results]
<a name="scroll-to-results"></a>
<h2>Results</h2>

<table>
<tr><td colspan="2">
<h3>Crawling</h3>
<p>This is a slow offroading scenario.
Here we have the transmission in low gear (1:[transLo]),
the transfer case (if any) in low (1:[tcaseLo]),
and the crawl box (if any) engaged (1:[crawler]).
The total gear ratio is <strong>1:[crawl_ratio]</strong>.</p>
</td></tr>
<tr><th>MPH</th><th>RPM</th></tr>
[loop crawl_table as t]
<tr>
<td>[t.mph]</td>
<td style="width: 400px;">
<div style="float: left; margin-right: 10px;">[t.rpm]</div>
<div style="float: left; width: [t.barsize]px; background-color: #[t.color]">&nbsp;</div>
</td>
</tr>
[end]

<tr><td colspan="2">
<h3>Launching</h3>
<p>This is normal street driving starting from a standstill.
Here we have the transmission in low gear (1:[transLo]),
the transfer case (if any) in high (1:[tcaseHi]),
and the crawl box (if any) disengaged.
The total gear ratio is <strong>1:[launch_ratio]</strong>.</p>
</td></tr>
<tr><th>MPH</th><th>RPM</th></tr>
[loop launch_table as t]
<tr>
<td>[t.mph]</td>
<td>
<div style="float: left; margin-right: 10px;">[t.rpm]</div>
<div style="float: left; width: [t.barsize]px; background-color: #[t.color]">&nbsp;</div>
</td>
</tr>
[end]

<tr><td colspan="2">
<h3>Flat Out</h3>
<p>Assuming you can legally do so, here is your vehicle at high speeds.
Here we have the transmission in top gear (1:[transHi]),
the transfer case (if any) in high (1:[tcaseHi]),
and the crawl box (if any) disengaged.
The total gear ratio is <strong>1:[highway_ratio]</strong>.</p>
</td></tr>
<tr><th>MPH</th><th>RPM</th></tr>
[loop highway_table as t]
<tr>
<td>[t.mph]</td>
<td>
<div style="float: left; margin-right: 10px;">[t.rpm]</div>
<div style="float: left; width: [t.barsize]px; background-color: #[t.color]">&nbsp;</div>
</td>
</tr>
[end]
</table>

<p>Note: Not all transmissions or transfer cases with the same designation or part number will have the same gear ratios. Tires are not usually the exact height listed.</p>
[end]```

If you’ve read this far, thanks for the trip down programming memory lane.

Beep boop.