#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 08/21/2014
# ***************************************************************************
# * Copyright (C) 2014, Paul Lutus *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU General Public License as published by *
# * the Free Software Foundation; either version 2 of the License, or *
# * (at your option) any later version. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU General Public License for more details. *
# * *
# * You should have received a copy of the GNU General Public License *
# * along with this program; if not, write to the *
# * Free Software Foundation, Inc., *
# * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
# ***************************************************************************
from math import *
# BEGIN user-defined values
# tank radius
tr = 30
# top of sloped section
st = 30
# top of tank
tt = 70
# slope section integration steps
ssi = 100
# data table step size
tss = 1
# END user-defined values
# classic interpolation function
def ntrp(x,xa,xb,ya,yb):
return (x-xa) * (yb-ya) / (xb-xa) + ya
# liquid area equation
# from http://arachnoid.com/TankCalc/index.html figure 3
def la(y,r):
return r*r * acos(-y/r)+y*sqrt(r*r-y*y)
# compute partial volume for a provided y argument
def partial(y,r):
global st,ssi
# if y value is above the sloped section,
# provide 1/2 the volume of the sloped section
# plus the partial volume of the cylindrical section
if(y >= st):
# volume at y in cylindrical section
# includes 1/2 volume of sloped section
return pi * r*r * (y-st/2.0)
# else 0 <= y < st, need to
# integrate partial volume
# of sloped section
else:
v = 0
fssi = float(ssi)
for n in range(ssi+1):
x = n/fssi
q = y * x/st
yy = ntrp(q,0,1,-r,r)
v += la(yy,r)
return v * y/(fssi+1)
# print table column titles
s = '%12s %12s %12s' % ('Sensor','Volume','%')
print(s)
print('-' * len(s))
# old and new table line strings
ols = ""
ls = ""
# table accumulator
def accum(y):
global ols,ls
v = partial(y,tr)
ls = '%12.4f %12.4f %12.4f' % (y,v, 100.0*y/tt)
# don't print duplicate lines
if(ols != ls):
print(ls)
ols = ls
# generate table
y = 0
while(y <= tt):
accum(y)
y += tss
# accumulate a full height reading, added
# to the table only if it was missed
# by the preceding loop
accum(tt)