* TankCalc

## TankCalc #version#

A comprehensive storage tank analyzer.

Copyright © 2015, Paul Lutus -- Message Page

TankCalc is released under the GPL: http://www.gnu.org/licenses/gpl.html

Visit the TankCalc Home Page for more information and to be sure you have the latest version.

For formatting reasons, users may want to temporarily make the TankCalc program frame larger to properly read these instructions.

Introduction | History/Methods | Usage | Disclaimer

Introduction

> Please be sure to read the disclaimer at the bottom of this page.

> TankCalc is the most recent in a series of programs and mathematical methods I have written to compute partial volumes in storage tanks. TankCalc's present embodiment is as a Java application because this maximizes the number of places the program can successfully run. And this is the only reason it's written in Java -- if it were possible to write a fast, native-language version of TankCalc that would run on a lot of different systems and would not become hopelessly outdated in five years, I would write it in a faster language. But the advantage of Java is that it isn't going away, older Java programs like my own Arachnophilia (fourteen years and counting) still function as intended and are still widely used, and there are Java runtime engines for a lot of different environments, many more than for other languages.

> One drawback to Java is that it isn't blazingly fast, and TankCalc, essentially a numerical integrator, requires speed. But this is a secondary consideration to being able to write an application that will run virtually anywhere, now and in the future.

> NOTE: For detailed information about tank measuring issues, and to compute tank shapes not explicitly covered by TankCalc, visit Volumes in Depth. Also, if you cannot acquire accurate dimensions for your tank, this geometric modeling method may not work for you -- I recommend that you visit my tank profiling page instead.

> I will have more to say, and in greater detail, about TankCalc's past and present, but first let's deal with access and downloading issues.

History/Methods

> Figure 1

> Some years ago I wrote a Calculus tutorial, and in the tutorial I posed a sample problem in three-dimensional integration -- how to compute the partial volume of a commonly seen storage tank mounted horizontally (see figure 1). Pretty quickly I started receiving inquiries from people in the storage business, asking for more information -- how about a tank without any end caps? How about a tank with caps that weren't spherical, but elliptical?

> So I wrote an application in JavaScript (code that can be embedded in a Web page) that satisfied some of my correspondents for a while. Then I started getting more complicated requests -- what about a tank that has one kind of cap on one end, and another kind of cap on the other? What about a tank that is standing vertically?

> Closed-form solutions

> I had been hoping to use what are called "closed-form" equations for all the cases that came to my attention -- equations that are relatively simple and that produce a volume for given inputs without any fuss. Equations that provide the volume of a full tank are quite simple, but equations that accommodate partial volumes are reasonably simple as well, as long as the tank is level.

> Figure 2

> For these variables:

> - L, cylinder length
> - R, cylinder radius and major ellipse radius
> - r, minor ellipse radius
> - y, content height
> - v, partial volume (the result)

> We have these closed-form partial-volume solutions for a horizontal tank:

> > For the half-ellipses at each end of the tank (they can be treated as one spheroid), with major radius R and minor radius r, bisected by content height y:

> > > (1)

> > For the central cylindrical section, with cylinder length L and cylinder radius R, bisected by content height y, we have:

> > > (2)

> Equations (1) and (2) are combined to acquire a volume for a content height measurement represented by y. This relatively simple solution works well for a range of tank types -- cylinders, (set r to zero), spheres (set L to zero), through a range of common tank types with varying end-cap radii.

> As this horizontal solution became widely known, I received some requests for variations, starting with an obvious one -- a tank as in Figure 2, but mounted vertically. For that case, the following equations must be applied by zones (using the same variable names as above):

> > For the bottom and top of a vertical tank, for provided values for R and r as described above, and content bisector y, with numerical ranges of 0 <= y <= r, and L+r <= y <= L+2r (with some technical adjustments of the range of y and of the resulting volume for the top ellipse):

> > > (3)

> > And for the cylinder in the middle, for a provided value of R (cylinder radius) and with the numerical range of r <= y <= L+r

> > > (4)

> The vertical solution must be applied to the tank in increments -- bottom, middle, top -- and the result is the sum of all three, so this solution enters the region between equations and algorithms. This is not a problem, most modern technologists are comfortable writing algorithms as well as equations, even though most of us prefer one over the other.

> Variations on a theme

> But along with those who asked for a solution for a vertical tank, or a tank with some property like a cylinder with an elliptical cross-section (easily handled), I began to receive a number of requests for a partial-volume solution for tanks mounted at an angle. When I first heard this I thought, "At an angle? Surely this was an accident." But that only reveals my ignorance of the storage business, because as it turns out, there are excellent reasons to mount a tank at an angle. One, it's easier to clean a tank that is tilted because the crap ... uh, detritus, descends by gravity to a small region where it is easily scooped up. Two, in an aviation fuel tank it is important to have a zone where water can benignly collect and not easily mix with fuel being delivered to aircraft (water is denser than aviation fuel and tends to collect at the bottom of a storage tank).

> So there was a legitimate place for a mathematical treatment of an arbitrary tank with an arbitrary amount of tilt. But after some preliminary work I realized the solution wouldn't be closed-form (meaning it wouldn't be expressible in a simple equation like those above). Instead, I saw that some kind of numerical integration would be required -- a messy, algorithmic, approximate solution, not unlike the messy world whose problems it addressed.

> I ask that my readers not be disheartened by my use of the term "approximate" -- this is, after all, applied mathematics, not pure, and the problem to be solved is a practical one, where the point is to acquire reliable numerical results with known accuracy. And TankCalc has a fine-tuning dialog where you can choose accuracy and computing time options -- in general meaning more accuracy, more time. TankCalc's math engine has no practical constraint on a solution's accuracy, and in exchange, no practical constraint on how much time such a solution might require.

> In practical tests, and for the majority of everyday problems, TankCalc provides very accurate results very quickly. In the worst imaginable cases, for example by generating a table of intermediate values for every millimeter of a large tank, and while simultaneously using the time-consuming volume-to-height root finder mode, solutions can be very slow.

> Numerical Solutions

> In its present form, TankCalc represents a departure from all my past efforts to analyze storage tanks -- it is purely numerical. It doesn't rely on closed-form solutions for any but the preliminaries, and as a result, it can handle a large number of tank types and configurations:

> - Tanks with elliptical, conical, and sphere-section caps.
> - Tanks with one kind of cap on one end, and another kind of cap on the other end.
> - Tanks that are mounted horizontally, vertically or at any intermediate angle.
> - Tanks with any combination of the above properties.

> What I'm describing is a huge departure from my past efforts, which concentrated on relatively simple and fast solutions to a limited number of tank geometries. The new methods are slower, but can handle a much larger number of variations in tank type and orientation.

> The Details

> Figure 3 (equations 5,6,7)

> A numerical integrator relies on many repetitions of a comparatively simple mathematical operation, and numerical integration only exists in its present form because of cheap computer power. In TankCalc, the simple mathematical operation is to find the partial area of a circle (see figure 3), over and over again, along the axis of a storage tank.

> For a particular integration a y bisector level is chosen, usually representing a tank liquid content level, then the desired result is built up piecemeal for a sequence of r values and positions, each submitted to the equations shown in figure 3. For the LA (liquid area) equation, the area of successive circle sections (yellow color in figure 3) is summed to create a partial volume result for the tank at the chosen content height. Increasing the accuracy of the procedure is a simple matter of increasing the number of numerical integration steps submitted to the algorithm.

> In recent TankCalc versions, three tank properties are computed in this way:

> - LA (Liquid Area) (equation 5) is integrated to become LV (Liquid Volume).
> - LWL (Liquid Wetted Line) (equation 6) is integrated to become LWA (Liquid Wetted Area), the area of contact between the liquid and the tank wall.
> - LSL (Liquid Surface Line) (equation 7) is integrated to become LSA (Liquid Surface Area), the liquid's top surface, or liquid/gas interface.

> All the above results are provided in TankCalc's output data table for each liquid level of interest.

> Figure 4 -- the TankCalc numerical strategy

> For those who understand Calculus, what is going on will be obvious. For others, the key idea of numerical integration is to create a difficult result in two dimensions by way of an easy operation in one, or (as in this case) to create an otherwise impractical result in three dimensions by way of a manageable operation in two. The reason for this specific procedure is that there is no feasible way to solve a tilted storage tank problem directly in three dimensions, but there are trivial ways to represent a precursor system (figure 3) in two dimensions, then build a model in three dimensions by summing many such two-dimensional disks (figure 4).

> TankCalc has a way to check its own work. In its normal mode of operation, TankCalc creates a table of volumes correlated with sensor heights (and the option to create the opposite -- a table of heights for volumes -- but not so quickly), but the first thing TankCalc does is compute the total volume of the tank, a result that can be gotten immediately, in closed form, with an arbitrary degree of accuracy. After the table generation is complete, the user can compare the closed-form result, a result known to be correct, with the final table result, which should represent the volume of a full tank, but computed using the numerical engine just described. This is a sanity check, a way to know the program is describing the same tank the user specified in the entries.

> Summary

> To summarize, the mathematical methods used in TankCalc are perfectly reliable, the user can get any degree of accuracy he is willing to wait for (and results of good accuracy are available very quickly), and TankCalc accepts a detailed tank description that meets most field requirements -- any degree of tilt, many options, even a way to check its own work.

> In the next section we will show a typical path from a list of tank dimensions to a table of partial volume results.

Usage

> The main TankCalc display has five option tabs across the bottom:

> - Input
> - Compute
> - Model in 3D
> - Graphic Help
> - Text Help

> Normally the user enters a tank description at the Input tab, then segues over to the Compute tab to acquire some practical results.

> Input -- describe the tank

> > NOTE: TankCalc remembers a user's choices and entries -- all of them. This is a convenience for those who may have to interrupt work on a particular problem and come back to it later. TankCalc saves the user's choices in a file located at (user directory)/.TankCalc/TankCalc.ini.

> > Input Units

> > It's always a good first step, before making any other entries, to choose appropriate input and output units (toward the bottom of the input panel). TankCalc supports a wide variety of entry and display units, and the user is not obliged to be consistent about the choice of units, e.g. one may choose inputs in millimeters and outputs in gallons.

> > Mouse and Keyboard Actions

> > Most TankCalc input fields respond to the mouse wheel and arrow keys. In most cases the user can hover the mouse cursor over an input field, then spin the mouse wheel to change its value -- or click the field, then use the arrow keys to change value. The following actions apply to most numeric input fields:

> > > Action | Result
> > > Mouse wheel | Value increased/decreased by 1
> > > up/down arrow keys | Value increased/decreased by 1
> > > Page Up/Page Down keys | Value increased/decreased by 10
> > > Home/End keys | Value increased/decreased by 100

> > The following actions apply to the graphic display panels:

> > > Action | Result
> > > Mouse wheel | Zoom in/out
> > > Mouse drag | Rotate image vertically or horizontally
> > > Shift key + Mouse drag | Translate image vertically or horizontally
> > > Right/left arrow keys (may have to click the panel first) | Translate right/left (X axis)
> > > Up/down arrow keys | Translate up/down (Y axis)
> > > Home/End keys | Translate in/out (Z axis)

> > Many of the above mouse and keyboard actions can be changed with the following modifier keystrokes:

> > > Action | Result
> > > Above actions accompanied by Shift key | Amount of change divided by 10
> > > Above actions accompanied by Alt key | Amount of change divided by 100
> > > Above actions accompanied by both Shift and Alt keys | Amount of change divided by 1000

> > Variable Names

> > It's a good idea to become familiar with TankCalc's variable names (see figure 5) and which spatial dimensions they occupy. TankCalc evaluates a tank in three independent zones -- a left end cap, a central cylindrical section, and a right end cap. Any of these sections are optional and may be eliminated by entering a zero for one of its dimensions, but all of them are available for the description of a complex tank type. Here is a description breakdown:

> > Figure 5
> > - The single variable that is shared by all the sections is R, the tank's overall radius. R increases the tank's size in the Y (vertical) and Z (depth) dimensions. A tank with a zero R entry will not have a volume, regardless of the other entries.
> > - The left and right end caps are fully (and separately) described:
> >   - with a dimensional variable r that describes the reach of the end cap along the X (horizontal) dimension. To eliminate an end cap, to make that end of the tank flat, enter zero for r.
> >   - with a specifier for whether the end cap is elliptical, conical or spherical (see below).
> > - The central cylindrical section is identified solely by its length L, which extends along the X (horizontal) dimension). To eliminate the cylindrical section, to describe a tank entirely in terms of its end caps, enter zero for L.

> > Each of these options has an associated, immediately available, full-volume equation that TankCalc computes and displays upon receiving a user entry (the user presses keyboard "Enter" to commit a dimensional entry and see the result):

> > > Description | Specified by | # | Full-Volume Equation
> > > Central cylindrical section | R (cylinder radius/major ellipse radius) and L (cylinder length) | (8) |
> > > Elliptical End Cap | R (cylindrical radius/major ellipse radius) and r (minor ellipse radius) | (9) |
> > > Conical End Cap | R (cylindrical radius/major ellipse radius) and r (minor ellipse radius) | (10) |
> > > Spherical End Cap | R (cylindrical radius/major ellipse radius) and r (minor ellipse radius) | (11) |

> > Figure 6

> > Spherical End Caps

> > The meaning of the r variable entries for elliptical and conical end caps should be self-evident -- smaller entries produce proportionally smaller horizontal extensions and correspondingly smaller volumes, and a zero entry specifies a flat tank end. But because of the special properties of spherical end caps, entries for them behave differently and merit a detailed explanation.

> > A spherical end cap represents a section of a sphere (a slice, if you will) with certain properties. The spherical section's area is given above, but there is an unseen variable that controls its properties -- spherical end caps have a major radius of their own (not to be confused with R, the cylinder's major radius) with the label mr. For any given minor radius r, TankCalc constructs a major radius using this equation:

> > > (12)

> > But if the user enters a large value for r, TankCalc assumes it is actually meant to represent mr, and constructs r like this:

> > > (13)

> > For simplicity's sake, TankCalc has a single entry for the radius of a spherical end cap, but the user is free to enter either r or mr, and TankCalc will work out the user's meaning. The computed r and mr values are included as part of the table listing to be descibed below, so the user can determine what decision TankCalc made.

> > Conical End Caps

> > A special entry mode is available for the r field while defining conical end caps. In this case, instead of entering the height of the cone, one may enter the angle in degrees of the cone's side with respect to its base, and TankCalc will convert this to a height for you. To signal this special entry mode, add a "d" to your angle entry to the r field. Or the user may prefer to enter a slope percentage rather than an angle, in which case the entry should end with "%". There are circumstances where a conical end cap's angle or slope are known but its height is not -- these features answer that need.

> > Tank Orientation

> > The user also specifies the tank's orientation -- horizontal, vertical or tilted at an angle between 0 and 90 degrees. Obviously few real-world tanks will have extreme deviations from horizontal or vertical, but the option of setting arbitrary angles proved useful during testing, and based on my past experience, someone, somewhere will have a tank requiring every available TankCalc option.

> > The "Tank Angle Degrees" entry field has a special option -- to enter a slope percentage instead of an angle, add the character "%" to your entry, and TankCalc will perform the conversion from slope to angle, which by the way is:

> > > (14)

> > Scaling Factor

> > The scaling factor entry allows computation of a common tank type with an oval cross-section. Let's say we need to compute accurate partial volumes for such a tank -- for example, a tank that is 40 units in height but 60 units in width. For this tank, we would enter the tank's vertical radius (i.e. 20) for R and a scaling factor of 60/40 = 1.5. This feature only works well for tanks whose maximum (or minimum) width extends in the same plane as its contents.

> > Residual Volume

> > An entry for residual tank volume takes into account the fact that some tanks have unmeasured contents that may need to ba accounted for in a volume result. This entry can be positive or negative and can be used to accommodate circumstances where a sensor's data doesn't correlate very well with an abstract tank model.

> > Sensor Position

> > The next entries on the input panel specify a sensor bottom position in three dimensions. This option is present to produce agreement between TankCalc's table displays and data collected in the real world. The sensor X and Z entries specify a position along the bottom surface of the tank. The X entry is right-to-left (positive right), Z is forward-to-back (positive forward). Z entries follow the tank's cylindrical curvature, consequently Z axis entries create a corresponding Y increment. The Y entry ascends from the tank's bottom surface, to account for the case of a bottom plate below the sensor's lowest position.

> > There is one additional sensor specifier, available only for a tilted tank, and that is the orientation of the sensor path. The path can be specified as perpendicular to the tank's long axis ("X axis"), perpendicular to the tank's short axis ("Y Axis") or perpendicular to the surface of the contents, or the local vertical outside the tank itself. If these terms seem confusing, just look at the graphic display -- the magenta line is the current sensor axis. This setting may represent a small distinction for a tank with an inclination of a few degrees at most, but it's important in applications demanding the highest accuracy.

> > Tank Wall Thickness / Density

> > The optional wall thickness and density entries can be used to fully characterize the modeled tank. Wall thickness should be entered in the selected length units, and wall material density should be expressed in the standard density scheme in which water has a density of 1. Here is a table of common materials and their densities:

> > > Material | Density (water = 1)
> > > Copper | 8.3 - 9.0
> > > Steel | 8.03
> > > Iron | 7.8
> > > Aluminum | 2.7
> > > Magnesium | 1.7
> > > Fiberglass | 1.5
> > > Kerosene | 0.8
> > > Aviation Fuel / Gasoline | 0.7
> > > Propane | 0.51

> > Math Engine Tuning

> > The "Cylinder Integration Steps" and "End Cap Integration Steps" entries change the behavior of the TankCalc numerical integrator. The default settings should be satisfactory in nearly all cases, but if a greater degree of accuracy is required, these values may be increased as the expense of program running speed.

> > The "Root Finder Epsilon" entry changes the error bound of a numerical root finder used while calculating a sensor height for a given volume argument, the inverse of the normal table generation mode described below. Again, the default value should be satisfactory in nearly all cases. Decreasing this value increases the accuracy of the root finder but requires more running time.

> > Clipboard Operations

> > There are a number of ways to import and export tank descriptions and table data described below, but these methods require that TankCalc be run as a desktop application, not an applet in a Web page. There was a time when Java applets could access the system clipboard, but for security reasons this is no longer true.

> > Saving and Sharing Tank Descriptions

> > TankCalc has some simple ways to preserve what might be a laboriously created tank description. After entering and testing a description, the user can click the "Copy" button at the lower right of the data input panel and a description of the tank will be placed on the clipboard. The clipboard contents might look like this:

> > >     2|0|0|1.146|1032|448.1|0|16.658|0|2|228|2|228|0|5|10|3 (... etc.)

> > The text on the clipboard represents a complete tank description, and it can be saved in a plain-text document, shared with colleagues in e-mails, and archived for future use. Later, the description can be copied onto the clipboard again, and upon pressing the "Paste" button at the lower right of the input panel, the full description will be reëstablished in TankCalc.

> > TankCalc will also accept a tank description, or a path to a file containing a tank description, as a program launch argument. This opens up additional possibilities. Users can:

> > 1. Provide an explicit tank description as a program argument:

> >    > java -jar TankCalcApp.jar '2|0|0|1.146|1032|448.1|0|16.658|0 (... etc.)' (notice the single quotes)

> > 2. Provide a path to a file containing a tank description:

> >    > java -jar TankCalcApp.jar /path-to-file/description.txt

> > 3. (preferred) Write a shell script and include a shell argument variable:

> >    > java -jar TankCalcApp.jar "%1"

> > The third option opens up the possiblity of creating tank description data files and opening TankCalc automatically with them, as is true for spreadhseets and word processing programs. Here are working examples of TankCalc launch scripts for Linux and Windows that can be used to associate TankCalc with any file type the user cares to use:

> > > Windows example (name this script "TankCalc.bat" and put it anywhere convenient):

> > > >     @echo off
> > > >     start javaw -jar "c:\Program Files\TankCalc\TankCalcApp.jar" "%1"

> > > Linux example (name this script "TankCalc," give it executable permissons, and put it in /usr/local/bin):

> > > >     #!/bin/sh
> > > >     java -jar /path-to-jarfile/TankCalcApp.jar "$1"

> > Having created one of these shell scripts, the user can create data files that contain tank descriptions, put them anywhere convenient, and associate the data files with TankCalc. Here is how this is done in Windows:

> > 1. Create a script named "TankCalc.bat" with the above Windows example content and place it anywhere convenient.
> > 2. Create some tank data files by copying tank descriptions (as explained above) and pasting them into plain-text files, one description per file.
> > 3. Give the data files a distinctive suffix that isn't already in use. I suggest ".tkc", which at the time of writing appears not to be in use, but any unused suffix will do.
> > 4. Put the data files anywhere convenient to the user.
> > 5. Open a file explorer and right-click one of the data files.
> > 6. Choose "Open With..." then "Browse."
> > 7. Browse to the location of the script you created in step (1) and select it.
> > 8. If all the steps were carried out correctly, TankCalc wil launch and show the tank description from the data file, and Windows will subsequently remember the data file's association with TankCalc.

> > A similar procedure creates the same outcome on Linux and Macintosh systems.

> Compute -- get some results

> > NOTE: Root finding is a mathematical procedure that is sometimes necessary but not particularly fast. TankCalc's root finder uses a binary search to locate a height for a volume argument, but to do so, it must perform a series of full tank integrations to produce test values for comparison with the user's entry (or a submitted value from the table generator). As a result of these issues, the height-from-volume mode is slower than the default of volume from height, sometimes very much slower.

> > On TankCalc's compute panel are options to acquire a single volume result or generate a table. There is also the option to get height from volume for both the single-result and table options. Height from volume is the reverse of the default computation direction, and because of the complexity of TankCalc's computations, this mode involves the use of something called a "root finder" (see sidebar). There may be circumstances where a table generation in the height-from-volume mode seems to take forever, and in this case, the user has the option to cancel the table generation.

> > Table Generation

> > After having specified a tank's dimensions and properties at the input panel, the user may create a table of intermediate volume values for sensor height readings by clicking one of the Data or Properties buttons.

> > Properties Table Generation

> > > This option creates a table of tank properties -- the tank's dimensions, full and empty weight, and other useful data. This table fully describes the tank based on the entries made at the input tab.

> > Data Table Generation

> > > Step Size

> > > > Before generating data tables, be sure to set an appropriate table step size on the Input tab. Smaller step sizes create longer, more detailed tables but such tables require more time to generate. Note that There are two step size entries, for the two table generation modes: Height -> Volume and Volume -> Height.

> > > Decimal Places

> > > > Also on the input tab is a selector for the number of decimal places to be displayed. The default is suitable for most uses, but the option exists to choose more -- possibly more than is meaningful in a mathematical sense.

> > > Normal table generation

> > > > To create a normal data table, press the "Height -> Volume" button. This creates a table that correlates fixed sensor heights with partial volumes.

> > > Inverse table generation

> > > > The user may choose to generate a table that lists sensor heights for volume arguments, the reverse of the default generation mode. This mode is much slower than the default, due to a requirement to seek numerical values using a root finder approach. To select this mode, click the "Volume -> Height" button. If this table generation mode proves too slow, simply press the "Cancel" button, then increase the table step size.

> > > Output Options

> > > > The tables described above may be copied to the system clipboard in these three formats:

> > > > - HTML, suitable for inclusion in a Web page.
> > > > - TSV (tab-separated values), suitable for inclusion in a database or spreadsheet.
> > > > - Plain text, a simple table for direct printing.

> > > > These table format choices are selected using the appropriate copy button -- choose the button that shows the desired table format.

> > > Single Result

> > > > The single entry window accepts entries expressed in the currently selected input units and produces results in the currently selected output units. The table generator follows the same rules -- a table's left-hand column is expressed in the chosen input units, and the right-hand column in the chosen output units. The single result option is normally used after table generation, so the desired data mode (i.e. Height -> Volume or the reverse) has been selected.

> Model in 3D -- View and interact with the tank being modeled

> > Figure 7 (click for 3D)

> > TankCalc includes a 3D modeler to help in visualizing the tank being analyzed. By offering a 3D picture, this feature assures that the entered description corresponds to reality -- and by poviding a view with depth, this feature helps with orientation and sensor placement.

> > To see how this works, click figure 7 and grab a pair of anaglyphic glasses (). The 3D modeler functions in both color and anaglyphic 3D mode, and allows the user to spin and scale the image in a quick, intuitive way with mouse gestures.

> > The 3D modeler is an invaluable aid for sensor placement and orientation. TankCalc performs some subtle mode shifts, for example at a 45 degree tank tilt it switches its origin point for sensor placement from the bottom center of the tank's cylinder to the center of the left end cap. Without the advantage of the 3D modeler, issues like this would be very difficult to sort out. Also the meaning of the sensor X, Y and Z placement entries change meaning depending on the tank's orientation, but the perspective view -- and in particular the 3D anaglyphic view that allows the user to see inside the tank -- helps sort the geometry out.

> > The truth is, if I hadn't added the 3D modeler to TankCalc, I would never have resolved the sensor placement geometry, and the modeler clarified several issues that had been difficult to visualize without a graphic guide. I think the user will find this tool very useful.

> Graphic Help -- tutorial images

> > This panel contains a graphic viewer for some bundled images that may help orient a new TankCalc user. The content of the images is similar to what is presented here, but in greatly abbreviated form.

> Text Help -- help document

> > This panel contains a searchable copy of the help page. Users are advised to always go to the online help page for the most recent content.

User Inquiries

> If you have a question about TankCalc that might prove useful to others, post it here and I will add it to the user inquiry archive.

> - Archive of user inquiries

Bug Reports

> TankCalc users are invited to submit bug reports to my message page. Please be sure what you are reporting is a bug, not a misunderstanding of the program.

Disclaimer

> I apologize for the strict legalese below, but this program's calculations may be used to design and maintain fuel tanks and the possibilities for litigation have not escaped my attention. Sorry.

> Disclaimer of Warranty

> > The computations provided by TankCalc are provided on an "as-is" basis, without warranty of any kind, including without limitation the warranties of merchantability, fitness for a particular purpose and non-infringement. The entire risk as to the quality and performance of the computations is borne by you. Should the results prove to be in error, you assume the entire cost of any required service and repair, and any consequential damage.

> Limitation of Liability

> > As customary in the computer business, you are solely responsible for any loss of profit or any other commercial damage, including but not limited to special, incidental, consequential or other damages. This disclaimer specifically disclaims all other warranties, expressed or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose, related to defects in the computed results or the documentation.