Updated 2017-03-09 23:32:45 by gold

## Introduction edit

gold Here is some eTCL starter code for calculating volume of ancient Sumerian clay bowls. The impetus for these calculations was checking bowl volumes in some excavation reports and modern replicas. In modern terms, the bowl volume can calculated from the volume of a truncated cone. Most of the testcases involve replicas or models, using assumptions and rules of thumb.

In the Sumerian coefficient lists on clay tablets, there are coefficients which were used in determining the amount of materials and the daily work rates of the workers. In most cases, the math problem is how the coefficient was used in estimating materials and work rates. One difficulty is determining the effective power of the coefficient in base 60. For example, 20 could represent either 20*3600,20,20/60, 20/3600, or even 1/20. The basic dimensions of geometric figures, merchant payments, and final tallies were presented in the Sumerian accounts on clay tablets, but sometimes the calculations were left off the tablet, broken off, or garbled. At least one approach for the modern reader and using modern terminology is to develop the implied algebraic equations from the Sumerian numbers. Then the eTCL calculator can be run over a number of testcases to validate the algebraic equations.

### Testcases Section

In planning any software, it is advisable to gather a number of testcases to check the results of the program. The math for the testcases can be checked by pasting statements in the TCL console. Aside from the TCL calculator display, when one presses the report button on the calculator, one will have console show access to the capacity functions (subroutines).

#### Testcase 1

Testcase 1
quantity etc units value
testcase number 1
bowl rim diameter mm 155.
bowl base diameter mm 80.
bowl height mm 73.
bowl thickness meters 1000.
side surface mm*mm 30294.5565
total surface mm*mm 54190.2956
volume milliliters 818.4437
bowl volume over standard volume 0.8184

#### Testcase 2

 testcase number 2 bowl rim diameter mm 100. bowl base diameter mm 100. bowl height mm 100. bowl thickness meters 1000. side surface mm*mm 31415.9265 total surface mm*mm 47123.889 volume milliliters 785.3981 bowl volume over standard volume 0.7853

#### Testcase 3

Testcase 3
quantity etc units value
testcase number 3
bowl rim diameter mm 145.
bowl base diameter mm 60.
bowl height mm 50.
bowl thickness meters 1000.
side surface mm*mm 21131.1609
total surface mm*mm 40471.5907
volume milliliters 436.223
bowl volume over standard volume 0.4362

### References:

• Cities of the Ancient World: [1]
• Goulder, Jill. "Administrators' bread: Uruk bevel-rim bowl". Antiquity 84 (324): 351 -362[2]
• Millard, A.R. (1988). The Bevelled-Rim Bowls:British Institute for the Study of Iraq.
• Bevel Rim bowl article, [3]
• Beveled rim bowls, Wikipedia
• Problem Bevel Rim Bowls: Histograms & Related Displays
• Polulation, Exchange, and Early State Formation, Henry Wright and Gregory Johnson, 1975
• [www.columbia.edu/itc/anthropology/v3922/pdfs/wright_johnson.pdf]

## Appendix Code edit

### appendix TCL programs and scripts

```        # pretty print from autoindent and ased editor
# Sumerian beveled bowl volume calculator
# written on Windows XP on eTCL
# working under TCL version 8.5.6 and eTCL 1.0.1
# gold on TCL WIKI , 30mar2014
package require Tk
namespace path {::tcl::mathop ::tcl::mathfunc}
frame .frame -relief flat -bg aquamarine4
pack .frame -side top -fill y -anchor center
set names {{} {bowl rim diameter mm:} }
lappend names {bowl base diameter mm:}
lappend names {bowl height mm : }
lappend names {standard volume milliliters: }
lappend names {answer: bowl side area mm*mm:  }
lappend names {volume bowl milliliters:}
lappend names { bowl vol over sila std. vol : }
foreach i {1 2 3 4 5 6 7} {
label .frame.label\$i -text [lindex \$names \$i] -anchor e
entry .frame.entry\$i -width 35 -textvariable side\$i
proc pi {} {
expr acos(-1)
}
proc bowlvolume {rim base height } {
set r1  [* \$rim .5]
set r2  [* \$base .5]
set term1 [+ [* \$r1 \$r1 ] [* \$r2 \$r2 ] [* \$r1 \$r2 ]]
set bowlvolume [* [pi] \$height \$term1 [/ 1. 3. ]]
}
proc bowlsidearea {rim base height } {
set r1  [* \$rim .5]
set r2  [* \$base .5]
set term2 [* [- \$r1 \$r2] [- \$r1 \$r2]]
set term3 [* \$height \$height]
set term4 [sqrt [+ \$term2 \$term3]]
set surfaceside [*  [pi] [+ \$r1 \$r2] \$term4]
}
proc bowltotalsa {rim base height } {
set r1  [* \$rim .5]
set r2  [* \$base .5]
set term2 [* [pi] \$r1 \$r1 ]
set term3 [* [pi] \$r2 \$r2 ]
set sidearea [ bowlsidearea \$rim \$base \$height]
set bowltotalsa [+ \$term2 \$term3 \$sidearea ]
}
set msg "Calculator for Sumerian Beveled Bowl
from TCL WIKI,
written on eTCL "
tk_messageBox -title "About" -message \$msg }
proc calculate {     } {
global side1 side2 side3 side4 side5
global side6 side7 testcase_number
global surfaceside bowltotalsa
incr testcase_number
set bowlrim \$side1
set bowlbase  \$side2
set bowlheight \$side3
set sila_std_vol2 \$side4
set totalvolx [ bowlvolume \$bowlrim \$bowlbase \$bowlheight]
set bowltotalsa [ bowltotalsa \$bowlrim \$bowlbase \$bowlheight]
set surfaceside [ bowlsidearea \$bowlrim \$bowlbase \$bowlheight]
set side5 \$surfaceside
set side6 [* \$totalvolx .001]
set side7 [/  \$totalvolx 1000.  \$sila_std_vol2 ]
}
proc fillup {aa bb cc dd ee ff gg} {
.frame.entry1 insert 0 "\$aa"
.frame.entry2 insert 0 "\$bb"
.frame.entry3 insert 0 "\$cc"
.frame.entry4 insert 0 "\$dd"
.frame.entry5 insert 0 "\$ee"
.frame.entry6 insert 0 "\$ff"
.frame.entry7 insert 0 "\$gg"}
proc clearx {} {
foreach i {1 2 3 4 5 6 7} {
.frame.entry\$i delete 0 end } }
proc reportx {} {
global side1 side2 side3 side4 side5
global side6 side7 testcase_number
global surfaceside bowltotalsa
console show;
puts "testcase number: \$testcase_number "
puts "bowl rim diameter mm: \$side1 "
puts "bowl base diameter mm: \$side2 "
puts "bowl height mm: \$side3 "
puts "bowl thickness meters: \$side4 "
puts "side surface mm*mm : \$side5 "
puts "total surface mm*mm : \$bowltotalsa "
puts "volume milliliters: \$side6 "
puts "bowl volume over standard volume : \$side7 "
}
frame .buttons -bg aquamarine4
::ttk::button .calculator -text "Solve" -command { calculate   }
::ttk::button .test2 -text "Testcase1" -command {clearx;fillup 155. 80. 73. 1000. 30294.5  818.4 .8184 }
::ttk::button .test3 -text "Testcase2" -command {clearx;fillup 100. 100. 100. 1000. 31415.9  785.39 .785 }
::ttk::button .test4 -text "Testcase3" -command {clearx;fillup 145. 60. 50. 1000. 21131.16  436. .436 }
::ttk::button .clearallx -text clear -command {clearx }
::ttk::button .cons -text report -command { reportx }
::ttk::button .exit -text exit -command {exit}
pack  .clearallx .cons .about .exit .test4 .test3 .test2   -side bottom -in .buttons
grid .frame .buttons -sticky ns -pady {0 10}
. configure -background aquamarine4 -highlightcolor brown -relief raised -border 30
wm title . "Sumerian Beveled Bowl Calculator "

```

### Pushbutton Operation

For the push buttons, the recommended procedure is push testcase and fill frame, change first three entries etc, push solve, and then push report. Report allows copy and paste from console.

For testcases in a computer session, the eTCL calculator increments a new testcase number internally, eg. TC(1), TC(2) , TC(3) , TC(N). The testcase number is internal to the calculator and will not be printed until the report button is pushed for the current result numbers (which numbers will be cleared on the next solve button.) The command { calculate; reportx } or { calculate ; reportx; clearx } can be added or changed to report automatically. Another wrinkle would be to print out the current text, delimiters, and numbers in a TCL wiki style table as
```  puts " %| testcase \$testcase_number | value| units |comment |%"
puts " &| volume| \$volume| cubic meters |based on length \$side1 and width \$side2   |&"  ```