# Emacs Lisp: stockpile.el calculates volumes of stockpiles, heaps, piles, mounds

This set of function is calculating stockpile volumes depending of sizes of piles, mounds, or heaps. Engineers may be able to dissect various parts of stockpiles and then calculate their volumes by using these functions.

We use those functions in the business consulting program Start Your Own Gold Mine that is as of 2019 provided mostly in East African countries Uganda, Rwanda, Kenya and Tanzania. Many piles and heaps of gold bearing ores are standing around and their volumes need to be calculated to estimate the profitability. Gold prospecting and sampling of the heap and accurate determination of its specific density is also used to calculate estimates of gold in such stockpiles. Yet, these Emacs Lisp functions could be used for other engineering purposes.

```
;;;; Time-stamp: <Montag, Juli 15 2019, 17:05>
;;;; FILE: stockpile.el
;;;; PURPOSE: Calculates volumes of stockpiles for
;;;; the Start Your Own Gold Mine project as on
;;;; <https://www.StartYourOwnGoldMine.com>
;;;;
;;;; Copyright 2018 Jean Louis - <https://gnu.support>
;;;;
;;;; This program is free software: you can redistribute it
;;;; and/or modify it under the terms of the GNU Affero General
;;;; Public License as published by the Free Software Foundation,
;;;; either version 3 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 Affero General Public License for more
;;;; details.
;;;;
;;;; You should have received a copy of the GNU Affero General
;;;; Public License along with this program. If not, see
;;;; <http://www.gnu.org/licenses/agpl.txt>.
;;;;
;;;; from:
;;;; <https://depts.washington.edu/nwfire/piles/support/pile_proc.pdf>
;;;; <https://www.aqua-calc.com/calculate/volume-truncated-pyramid>
;;;; <https://www.calculatorsoup.com/calculators/geometry-solids/surfacearea.php#calculationImage>
;;;; The abbreviation spv relates to Stockpile Volume
(require 'ido)
;; (require 'helm)
(defun spv/half-sphere (height)
"Returns volume for proper half-sphere stockpile where height
represents the height or radius of the half-sphere. It is also
known as hemisphere shape."
(let ((volume (/ (* 2 pi (expt height 3)) 3)))
volume))
(defun spv/half-sphere-i (height)
"Returns volume for proper half-sphere stockpile where height represents
the height or radius of the half-sphere"
(interactive "nHeight of half-sphere: ")
(let* ((volume (spv/half-sphere height))
(volume (format "%.2f" volume))
(message (format "Volume of half-sphere stockpile with height of %s m is %s ㎥." height volume)))
(insert message)))
(defun spv/paraboloid (height width)
"Returns volume for paraboloid stockpile having width and height"
(let ((volume (/ (* pi height (expt width 2)) 8)))
volume))
(defun spv/paraboloid-i (height width)
"Returns volume for paraboloid stockpile having width and height"
(interactive "nHeight of paraboloid: \nnWidth of paraboloid: ")
(let* ((volume (spv/paraboloid height width))
(volume (format "%.2f" volume))
(message (format "Volume of paraboloid stockpile with height of %s m and width of %s m is %s ㎥." height width volume)))
(insert message)))
(defun spv/half-cylinder (height width length)
"Returns the volume of half-cylinder stockpile by having its height,
width and length"
(let ((volume (/ (* pi height width length) 4)))
volume))
(defun spv/half-cylinder-i (height width length)
"Returns the volume of half-cylinder stockpile by having its height,
width and length"
(interactive "nHeight of half-cylinder: \nnWidth of half-cylinder: \nnLength of half-cylinder: ")
(let* ((volume (spv/half-cylinder height width length))
(volume (format "%.2f" volume))
(message (format "Volume of half-cylinder stockpile with height of %s m, width of %s m and length of %s m is %s ㎥." height width length volume)))
(insert message)))
(defun spv/half-frustum-of-a-cone-1 (height-1 height-2 length)
"Returns volume of half frustum of a cone stockpile, version 1"
(let* ((heights (+ (expt height-1 2) (expt height-2 2) (* height-1 height-2)))
(volume (/ (* pi length heights) 6)))
volume))
(defun spv/half-frustum-of-a-cone-1-i (height-1 height-2 length)
"Returns volume of half frustum of a cone stockpile, version 1"
(interactive "nFirst height of half-frustum of a cone: \nnSecond height of half-frustum of a cone: \nnLength of half-frustum of a cone: ")
(let* ((volume (spv/half-frustum-of-a-cone-1 height-1 height-2 length))
(volume (format "%.2f" volume))
(message (format "Volume of half-frustum of a cone stockpile with first height of %s m, second height of %s m and length of %s m is %s ㎥." height-1 height-2 length volume)))
(insert message)))
(defun spv/half-frustum-of-a-cone-2 (width-1 width-2 length)
"Returns volume of half frustum of a cone stockpile, version 2"
(let* ((widths (+ (expt width-1 2) (expt width-2 2) (* width-1 width-2)))
(volume (/ (* pi length widths) 24)))
volume))
(defun spv/half-frustum-of-a-cone-2-i (width-1 width-2 length)
"Returns volume of half frustum of a cone stockpile, version 2"
(interactive "nFirst width of half-frustum of a cone: \nnSecond width of half-frustum of a cone: \nnLength of half-frustum of a cone: ")
(let* ((volume (spv/half-frustum-of-a-cone-2 width-1 width-2 length))
(volume (format "%.2f" volume))
(message (format "Volume of half-frustum of a cone stockpile with first width of %s m, second width of %s m and length of %s m is %s ㎥." width-1 width-2 length volume)))
(insert message)))
(defun spv/half-frustum-of-a-cone-with-rounded-ends (width-1 width-2 length)
"Returns volume of half frustum of a cone stockpile with rounded ends"
(let* ((widths (+ (expt width-1 2) (expt width-2 2) (* width-1 width-2)))
(volume (* pi (/ (+ (* length widths) width-1 width-2) 24))))
volume))
(defun spv/half-frustum-of-a-cone-with-rounded-ends-i (width-1 width-2 length)
"Returns volume of half frustum of a cone stockpile with rounded ends"
(interactive "nFirst width of half-frustum of a cone with rounded ends: \nnSecond width of half-frustum of a cone with rounded ends: \nnLength of half-frustum of a cone with rounded ends: ")
(let* ((volume (spv/half-frustum-of-a-cone-with-rounded-ends width-1 width-2 length))
(volume (format "%.2f" volume))
(message (format "Volume of half-frustum of a cone with rounded ends stockpile with first width of %s m, second width of %s m and length of %s m is %s ㎥." width-1 width-2 length volume)))
(insert message)))
(defun spv/half-ellipsoid (height width length)
"Returns volume of half ellipsoid stockpile"
(let ((volume (/ (* pi height width length) 6)))
volume))
(defun spv/half-ellipsoid-i (height width length)
"Returns volume of half ellipsoid stockpile"
(interactive "nHeight of half-ellipsoid stockpile: \nnWidth of half-ellipsoid stockpile: \nnLength of half-ellipsoid stockpile: ")
(let* ((volume (spv/half-ellipsoid height width length))
(volume (format "%.2f" volume))
(message (format "Volume of half-ellipsoid stockpile with height of %s m, width of %s m and length of %s m is %s ㎥." height width length volume)))
(insert message)))
(defun spv/irregular-solid (height-1 height-2 width-1 width-2 length-1 length-2)
"Returns volume of irregular solid stockpile"
(let* ((volume (/ (* (+ length-1 length-2) (+ width-1 width-2) (+ height-1 height-2)) 8)))
volume))
(defun spv/irregular-solid-i (height-1 height-2 width-1 width-2 length-1 length-2)
"Returns volume of irregular solid stockpile"
(interactive "nFirst height of irregular solid stockpile: \nnSecond height of irregular solid stockpile: \nnFirst width of irregular solid stockpile: \nnSecond width of irregular solid stockpile: \nnFirst length of irregular solid stockpile: \nnSecond length of irregular solid stockpile: ")
(let* ((volume (spv/irregular-solid height-1 height-2 width-1 width-2 length-1 length-2))
(volume (format "%.2f" volume))
(message (format "Volume of irregular solid stockpile with first height of %s m and width of %s m, and second height of %s m and width of %s m, and first length of %s and second length of %s m is %s ㎥." height-1 width-1 height-2 width-2 length-1 length-2 volume)))
(insert message)))
(defun spv/truncated-pyramid (bottom-width bottom-length top-width top-length height)
"Returns volume of a truncated pyramid. Truncated pyramid or frustum of a pyramid is a pyramid whose vertex is cut away by a plane parallel to the base. Formula obtained from: https://www.aqua-calc.com/calculate/volume-truncated-pyramid"
(let* ((base (* bottom-width bottom-length))
(top (* top-width top-length))
(volume (* (/ 1 6.0) height (+ base (* (+ bottom-width top-width) (+ bottom-length top-length)) top))))
;; (volume (* (/ 1 6.0) height (+ (* bottom-width bottom-length) (* (+ bottom-width top-width) (+ bottom-length top-length)) (* top-width top-length)))))
volume))
(defun spv/truncated-pyramid-i (bottom-width bottom-length top-width top-length height)
"Returns volume of a truncated pyramid. Truncated pyramid or frustum of a pyramid is a pyramid whose vertex is cut away by a plane parallel to the base. Formula obtained from: https://www.aqua-calc.com/calculate/volume-truncated-pyramid"
(interactive "nBottom width: \nnBottom length: \nnTop width: \nnTop Length: \nnHeight: ")
(let* ((volume (spv/truncated-pyramid bottom-width bottom-length top-width top-length height))
(volume (format "%.2f" volume))
(message (format "Volume of truncated pyramid or frustum of a pyramid with bottom width of %s m and bottom length of %s m, with top width of %s m and top length of %s m and height of %s m is %s ㎥." bottom-width bottom-length top-width top-length height volume)))
(insert message)))
(defun spv/conical-frustum (bottom-radius top-radius central-height)
"Returns volume of a conical frustum shape. From: https://www.calculatorsoup.com/calculators/geometry-solids/surfacearea.php#calculationImage"
(let ((volume (* (/ 1 3.0) pi central-height (+ (expt top-radius 2) (expt bottom-radius 2) (* bottom-radius top-radius)))))
volume))
(defun spv/conical-frustum-i (bottom-radius top-radius central-height)
"Inserts the snippet of volume calculation of of a conical frustum shape. From: https://www.calculatorsoup.com/calculators/geometry-solids/surfacearea.php#calculationImage"
(interactive "nBottom radius: \nnTop radius: \nnCentral height: ")
(let* ((volume (spv/conical-frustum bottom-radius top-radius central-height))
(volume (format "%.2f" volume))
(message (format "Volume of conical frustum with the bottom radius being %s m, top radius being %s m and central height of %s m is %s ㎥." bottom-radius top-radius central-height volume)))
(insert message)))
(defun spv/cone (radius height)
"Returns the volume of a cone. From: https://www.calculatorsoup.com/calculators/geometry-solids/volume.php"
(let ((volume (* (/ 1 3.0) pi (expt radius 2) height)))
volume))
(defun spv/cone-i (radius height)
"Insert the snippet with the calculation of a cone volume"
(interactive "nRadius of a cone: \nnHeight of a cone: ")
(let* ((volume (spv/cone radius height))
(volume (format "%.2f" volume))
(message (format "Volume of a cone with radius of %s m and height of %s m is %s ㎥." radius height volume)))
(insert message)))
(defun spv/cylinder (radius height)
"Returns the volume of a cylinder by providing its radius and
height"
(let ((volume (* pi (expt radius 2) height)))
volume))
(defun spv/cylinder-i (radius height)
"Insert the the volume of a cylinder by providing its radius
and height"
(interactive "nRadius of cylinder: \nnHeight of cylinder: ")
(let* ((volume (spv/cylinder radius height))
(volume (format "%.2f" volume))
(message (format "Volume of a cylinder with radius of %s m and height of %s m is %s ㎥." radius height volume)))
(insert message)))
(defun stockpile ()
"Interactively chooses one of stockpile volume functions"
(interactive)
(let ((list '(("Halph sphere" . 'spv/half-sphere-i)
("Paraboloid" . 'spv/paraboloid-i)
("Half cylinder" . 'spv/half-cylinder-i)
("Half frustum of a cone (1)" . 'spv/half-frustum-of-a-cone-1-i)
("Half frustum of a cone (2)" . 'spv/half-frustum-of-a-cone-2-i)
("Half frustum of a cone with rounded ends" . 'spv/half-frustum-of-a-cone-with-rounded-ends-i)
("Half ellipsoid" . 'spv/half-ellipsoid-i)
("Irregular solid" . 'spv/irregular-solid-i)
("Truncated pyramid" . 'spv/truncated-pyramid-i)
("Conical frustum" . 'spv/conical-frustum-i)
("Cone" . 'spv/cone-i)
("Cylinder" . 'spv/cylinder))))
(let ((choice (third (assoc (ido-completing-read "Choose stockpile formula: " list nil t) list))))
(call-interactively choice))))
(provide 'stockpile)
```

Let me know if you see any error or problem with these functions.

## Leave Your Comment or Contact GNU.Support

Contact GNU.Support now. **There is a simple rule at
GNU.Support: if we can help you, we do, whenever and wherever
necessary, and it's the way we've been doing business since 2002,
and the only way we know**