---
title: "Original Source Code"
author: "Bill Denney"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Original Source Code}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

Below are the original Visual Basic source code used for the translation to R.  It is included to allow users to inspect the fidelity of the code translation.

This program is intended for research use, only.  The code within is translated from Visual Basic code based on Werness, et al 1985 to R.  The Visual Basic code was kindly provided by Dr. John Lieske of the Mayo Clinic.

# Reference

Werness PG, Brown CM, Smith LH, Finlayson B. Equil2: A Basic Computer Program for the Calculation of Urinary Saturation. Journal of Urology. 1985;134(6):1242-1244. doi:10.1016/S0022-5347(17)47703-2

# EQUIL-2

The code below is the basis of the `equil2()` function.

```
VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   8355
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   5100
   LinkTopic       =   "Form1"
   ScaleHeight     =   8355
   ScaleWidth      =   5100
   StartUpPosition =   3  'Windows Default
   Begin VB.TextBox Text15 
      Height          =   375
      Left            =   1680
      TabIndex        =   2
      Top             =   480
      Width           =   3375
   End
   Begin VB.TextBox Text14 
      Height          =   375
      Left            =   1680
      TabIndex        =   1
      Top             =   0
      Width           =   3375
   End
   Begin VB.TextBox Text11 
      Height          =   375
      Left            =   1680
      TabIndex        =   13
      Top             =   6840
      Width           =   1215
   End
   Begin VB.TextBox Text10 
      Height          =   375
      Left            =   1680
      TabIndex        =   12
      Top             =   6360
      Width           =   1215
   End
   Begin VB.TextBox Text9 
      Height          =   375
      Left            =   1680
      TabIndex        =   11
      Top             =   5880
      Width           =   1215
   End
   Begin VB.TextBox Text8 
      Height          =   375
      Left            =   1680
      TabIndex        =   10
      Top             =   5400
      Width           =   1215
   End
   Begin VB.TextBox Text7 
      Height          =   375
      Left            =   1680
      TabIndex        =   9
      Top             =   4920
      Width           =   1215
   End
   Begin VB.TextBox Text6 
      Height          =   375
      Left            =   1680
      TabIndex        =   8
      Top             =   4440
      Width           =   1215
   End
   Begin VB.TextBox Text5 
      Height          =   375
      Left            =   1680
      TabIndex        =   7
      Top             =   3960
      Width           =   1215
   End
   Begin VB.TextBox Text4 
      Height          =   375
      Left            =   1680
      TabIndex        =   6
      Top             =   3480
      Width           =   1215
   End
   Begin VB.TextBox Text3 
      Height          =   375
      Left            =   1680
      TabIndex        =   5
      Top             =   3000
      Width           =   1215
   End
   Begin VB.TextBox Text2 
      Height          =   375
      Left            =   1680
      TabIndex        =   4
      Top             =   2520
      Width           =   1215
   End
   Begin VB.TextBox Text1 
      Height          =   375
      Left            =   1680
      TabIndex        =   3
      Top             =   2040
      Width           =   1215
   End
   Begin VB.CommandButton Command1 
      Caption         =   "Calculate now"
      Height          =   615
      Left            =   3240
      TabIndex        =   0
      Top             =   7800
      Width           =   1935
   End
   Begin VB.Label Label1 
      Caption         =   "Enter Collection Date, Time"
      Height          =   375
      Index           =   14
      Left            =   120
      TabIndex        =   26
      Top             =   480
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Enter Patient Name, Clinic Number"
      Height          =   495
      Index           =   13
      Left            =   120
      TabIndex        =   25
      Top             =   0
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "pH"
      Height          =   255
      Index           =   11
      Left            =   0
      TabIndex        =   24
      Top             =   6480
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Uric Acid (mg/dl)"
      Height          =   375
      Index           =   10
      Left            =   0
      TabIndex        =   23
      Top             =   6840
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Citrate (mg/dl)"
      Height          =   375
      Index           =   9
      Left            =   0
      TabIndex        =   22
      Top             =   5520
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Oxalate (mg/dl)"
      Height          =   375
      Index           =   8
      Left            =   0
      TabIndex        =   21
      Top             =   6000
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Phosphate (mg/dl)"
      Height          =   375
      Index           =   7
      Left            =   0
      TabIndex        =   20
      Top             =   4560
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Sulfate (mg/dl)"
      Height          =   375
      Index           =   6
      Left            =   0
      TabIndex        =   19
      Top             =   5040
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Chloride (Meq/L)"
      Height          =   375
      Index           =   5
      Left            =   0
      TabIndex        =   18
      Top             =   4080
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Sodium (Meq/L)"
      Height          =   375
      Index           =   3
      Left            =   0
      TabIndex        =   17
      Top             =   2160
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Potassium (Meq/L)"
      Height          =   375
      Index           =   2
      Left            =   0
      TabIndex        =   16
      Top             =   2640
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Magnesium (mg/dl)"
      Height          =   375
      Index           =   1
      Left            =   0
      TabIndex        =   15
      Top             =   3600
      Width           =   1455
   End
   Begin VB.Label Label1 
      Caption         =   "Calcium (mg/dl)"
      Height          =   375
      Index           =   0
      Left            =   0
      TabIndex        =   14
      Top             =   3120
      Width           =   1455
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim p As String
Dim q As String
Dim a(120) As Double




Sub Command1_Click()
Call calc
End Sub

Sub Form_Load()


Debug.Print "hello"


End Sub

Sub calc()
Rem Open "ssinput.txt" For Input As #1

Debug.Print "Now in calc routine."

10 Dim S(65)
20 S(1) = 1730000000000#
30 S(2) = 14900000#
40 S(3) = 162
50 S(4) = 145.5
60 S(5) = 20750
70 S(6) = 2640000!
80 S(7) = 55210!
90 S(8) = 1247
100 S(9) = 278000!
110 S(10) = 12.9
120 S(11) = 5.433
130 S(12) = 13.4
140 S(13) = 8.5
150 S(14) = 216
160 S(15) = 33.1
170 S(16) = 251.2
180 S(17) = 10
190 S(18) = 8.831001
200 S(19) = 13.4
210 S(20) = 12.6
220 S(21) = 143
230 S(22) = 3597000!
240 S(23) = 685
250 S(24) = 31.3
260 S(25) = 229.6
270 S(26) = 2746
280 S(27) = 17.3
290 S(28) = 71.4
300 S(29) = 60000!
310 S(30) = 505.2
320 S(31) = 12.5
330 S(32) = 3460000!
340 S(33) = 1014
350 S(34) = 31.9
360 S(35) = 188.4
370 S(36) = 4020
380 S(37) = 4.75
390 S(38) = 5.93
400 S(39) = 69900!
410 S(40) = 316.7
420 S(41) = 5
430 S(42) = 10
440 S(43) = 12.9
450 S(44) = 13
460 S(45) = 8.5
470 S(46) = 58800000#
480 S(47) = 2440000000#
490 S(48) = 4970000!
500 S(49) = 171
510 S(50) = 7.05
520 S(51) = 562000!
530 S(52) = 5500
540 S(53) = 794000000#
550 S(54) = 23.1
560 S(55) = 380.19
570 S(56) = 19770000#
580 S(57) = 1995000000#
590 S(58) = 55.6
600 S(59) = 1940000!
610 S(60) = 16600000000#
620 S(61) = 0.00123
630 S(62) = 18.6
640 S(63) = 1.03
650 S(64) = 1897
660 S(65) = 946
670 Rem Dim a(120)
680 Dim T(11)
690 Rem  Open "LPT1:" For Output As #1
691 Rem  CLS:  Key OFF: Color 7, 1, 0
695 Rem Input #1, z$
697 Rem Input #1, z$
700 Rem Input #1, a(120)
701 a(1) = a(1) / 1000
702 Rem Print "K";: Input #1, a(120)
703 a(2) = a(2) / 1000
704 Rem Print "CA";: Input #1, a(120)
705 a(3) = a(3) / 4008
706 Rem Print "MG";: Input #1, a(120)
707 a(4) = a(4) / 2431
708 Rem Print "PYRO";: Input #1, a(11)
709 Rem a(11)=a(11)/2431
710 Rem Print "NH4";: Input #1, a(120)
711 a(5) = a(5) / 1000
712 Rem Print "CL";: Input #1, a(120)
713 a(91) = a(91) / 1000
714 Rem Print "CO2";: Input #1, a(120)
715 Rem a(31)=a(31)/4401
716 Rem Print "P";: Input #1, a(120)
717 a(6) = a(6) / 3097
718 Rem Print "S";: Input #1, a(120)
719 a(7) = a(7) / 3206
720 Rem Print "CIT";: Input #1, a(120)
721 a(9) = a(9) / 19212
722 Rem Print "OX";: Input #1, a(120)
723 a(8) = a(8) / 8802
724 Rem Print "PH";: Input #1, a(120)
726 Rem Print "UR";: Input #1, a(120)
727 a(10) = a(10) / 16800
800 Rem Close #1
820 a(26) = 10 ^ (-a(24))
850 F1 = 0.7
860 F2 = 0.3
870 F3 = 0.1
880 F4 = 0.02
890 O0 = 0
900 O1 = 0
910 O2 = 0
920 O3 = 0
930 O4 = 0
940 For I = 1 To 10
950 a(12 + I) = 0.1 * a(I)
960 Next I
970 a(12) = 0.1 * a(11)
980 a(23) = 0.01 * a(12)
990 For I = 1 To 50
1000 a(25) = 10 ^ (-13.593 + a(24))
1010 a(27) = S(1) * a(26) * a(18) * F3 / F2
1020 a(28) = S(2) * a(26) * a(27) * F2 / F1
1030 a(29) = S(3) * a(26) * a(28) * F1
1040 a(30) = S(61) * a(31) * S(58)
1050 a(32) = a(30) / (a(26) * S(59) * F1)
1060 a(33) = a(32) * F1 / (a(26) * S(60) * F2)
1070 a(34) = S(62) * a(13) * a(33) * F2
1080 a(35) = S(63) * a(13) * a(34) * F1 * F1
1090 a(36) = S(64) * a(15) * a(33) * F2 * F2
1100 a(37) = S(65) * a(16) * a(33) * F2 * F2
1110 a(38) = S(4) * a(26) * a(19) * F2 / F1
1120 a(39) = S(5) * a(26) * a(20) * F2 / F1
1130 a(40) = S(6) * a(26) * a(21) * F3 / F2
1140 a(41) = S(7) * a(26) * a(40) * F2 / F1
1150 a(42) = S(8) * a(26) * a(41) * F1
1160 a(43) = S(9) * a(26) * a(22) * F1
1170 a(44) = S(10) * a(13) * a(27) * F2
1180 a(45) = S(11) * a(13) * a(19) * F2
1190 a(46) = S(12) * a(13) * a(20) * F2
1200 a(47) = S(13) * a(13) * a(21) * F3 * F1 / F2
1210 a(48) = S(14) * a(13) * a(12) * F1 * F4 / F3
1220 a(49) = S(16) * a(13) * a(48) * F1 * F3 / F2
1230 a(50) = S(15) * a(13) * a(23) * F1 * F3 / F2
1240 a(51) = S(17) * a(14) * a(27) * F2
1250 a(52) = S(18) * a(14) * a(19) * F2
1260 a(53) = S(19) * a(14) * a(20) * F2
1270 a(54) = S(20) * a(14) * a(21) * F3 * F1 / F2
1280 a(55) = S(21) * a(14) * a(12) * F1 * F4 / F3
1290 a(56) = S(22) * a(15) * a(18) * F3 * F2 / F1
1300 a(57) = S(23) * a(15) * a(27) * F2 * F2
1310 a(58) = S(24) * a(15) * a(28) * F2
1320 a(59) = S(25) * a(15) * a(19) * F2 * F2
1330 a(60) = S(26) * a(15) * a(20) * F2 * F2
1340 a(61) = S(28) * a(15) * a(60)
1350 a(62) = S(27) * a(60) * a(20)
1360 a(63) = S(29) * a(15) * a(21) * F3 * F2 / F1
1370 a(64) = S(30) * a(15) * a(40) * F2 * F2
1380 a(65) = S(31) * a(15) * a(41) * F2
1390 a(66) = S(32) * a(16) * a(18) * F3 * F2 / F1
1400 a(67) = S(33) * a(16) * a(27) * F2 * F2
1410 a(68) = S(34) * a(16) * a(28) * F2
1420 a(69) = S(35) * a(16) * a(19) * F2 * F2
1430 a(70) = S(36) * a(16) * a(20) * F2 * F2
1440 a(71) = S(37) * a(16) * a(70)
1450 a(72) = S(38) * a(70) * a(20)
1460 a(73) = S(39) * a(16) * a(21) * F3 * F2 / F1
1470 a(74) = S(40) * a(16) * a(40) * F2 * F2
1480 a(75) = S(41) * a(16) * a(41) * F2
1490 a(76) = S(42) * a(17) * a(27) * F2
1500 a(77) = S(43) * a(17) * a(19) * F2
1510 a(78) = S(44) * a(17) * a(20) * F2
1520 a(79) = S(45) * a(17) * a(21) * F3 * F1 / F2
1540 a(23) = S(47) * a(26) * a(12) * F4 / F3
1550 a(81) = S(48) * a(26) * a(23) * F3 / F2
1560 a(82) = S(49) * a(26) * a(81) * F2 / F1
1570 a(83) = S(50) * a(26) * a(82) * F1
1580 a(84) = S(51) * a(15) * a(12) * F4
1590 a(85) = S(52) * a(15) * a(23) * F2 * F3 / F1
1600 a(86) = S(53) * a(15) * a(25) * a(12) * F4 * F2 / F3
1610 a(87) = S(54) * a(15) * a(25) * F2 / F1
1620 a(88) = S(55) * a(16) * a(25) * F2 / F1
1630 a(89) = S(56) * a(16) * a(12) * F4
1640 a(90) = S(57) * a(16) * a(25) * a(12) * F2 * F4 / F3
1650 T(0) = a(13) + a(44) + a(45) + a(46) + a(47) + a(48) + 2 * a(49) + a(50) + a(34) + 2 * a(35)
1660 T(1) = a(14) + a(51) + a(52) + a(53) + a(54) + a(55)
1670 T(2) = a(17) + a(76) + a(77) + a(78) + a(79)
1680 T(3) = a(15) + a(56) + a(57) + a(58) + a(59) + a(60) + 2 * a(61) + a(63) + a(64) + a(62) + a(65) + a(36) + a(85) + a(84) + a(86) + a(87)
1690 T(4) = a(16) + a(66) + a(67) + a(68) + a(69) + a(70) + 2 * a(71) + a(73) + a(74) + a(75) + a(72) + a(37) + a(88) + a(89) + a(90)
1700 T(5) = a(18) + a(27) + a(28) + a(29) + a(44) + a(51) + a(56) + a(57) + a(58) + a(66) + a(67) + a(68) + a(76)
1710 T(6) = a(19) + a(38) + a(45) + a(52) + a(59) + a(69) + a(77)
1720 T(7) = a(20) + a(39) + a(60) + a(61) + a(70) + a(71) + a(46) + a(53) + a(78) + 2 * a(62) + 2 * a(72)
1730 T(8) = a(21) + a(40) + a(41) + a(42) + a(47) + a(54) + a(79) + a(63) + a(64) + a(65) + a(73) + a(74) + a(75)
1740 T(9) = a(12) + a(23) + a(81) + a(82) + a(83) + a(84) + a(85) + a(86) + a(89) + a(90) + a(48) + a(49) + a(50) + a(55)
1750 T(10) = a(22) + a(43)
1760 T(11) = a(33) + a(32) + a(30) + a(34) + a(35) + a(36) + a(37)
1770 For I1 = O To 11
1780 If T(I1) = 0 Then T(I1) = 1E-20
1790 Next I1
1800 a(13) = a(1) * a(13) / T(0)
1810 a(14) = a(2) * a(14) / T(1)
1820 a(15) = a(3) * a(15) / T(3)
1830 a(16) = a(4) * a(16) / T(4)
1840 a(17) = a(5) * a(17) / T(2)
1850 a(18) = a(6) * a(18) / T(5)
1860 a(19) = a(7) * a(19) / T(6)
1870 a(20) = a(8) * a(20) / T(7)
1880 a(21) = a(9) * a(21) / T(8)
1890 a(22) = a(10) * a(22) / T(10)
1900 a(12) = a(11) * a(12) / T(9)
1910 a(33) = a(31) * a(33) / T(11)
1920 S1 = (a(25) + a(26)) / F1 + a(13) + a(14) + a(17) + a(22) + a(91) + a(44) + a(45) + a(46) + a(34) + a(51) + a(52) + a(53) + a(76) + a(77)
1930 S1 = S1 + a(78) + a(56) + a(58) + a(63) + a(65) + a(85) + a(87) + a(28) + a(32) + a(38) + a(39) + a(41) + a(82) + a(66) + a(68) + a(73) + a(75) + a(88)
1940 S2 = 4 * (a(15) + a(16) + a(19) + a(20) + a(33) + a(47) + a(49) + a(54) + a(79) + a(84) + a(50) + a(89) + a(27) + a(40) + a(81) + a(61) + a(71) + a(62) + a(72))
1950 S3 = 9 * (a(18) + a(21) + a(48) + a(55) + a(23) + a(86) + a(90))
1960 S4 = 16 * a(12)
1970 S5 = (S1 + S2 + S3 + S4) / 2
1980 If S5 > 1 Then S5 = 1
1990 If S5 < 0.000001 Then S5 = 0.000001
2000 S6 = Sqr(S5)
2010 F1 = Exp(-1.20218 * ((S6 / (1 + S6)) - 0.285 * S5))
2020 F2 = F1 ^ 4
2030 F3 = F1 ^ 9
2040 F4 = F1 ^ 16
2050 If a(15) = 0 Then GoTo 2070
2060 If Abs((a(15) - O0) / a(15)) > 0.0001 Then GoTo 2160
2070 If a(16) = 0 Then GoTo 2090
2080 If Abs((a(16) - O1) / a(16)) > 0.0001 Then GoTo 2160
2090 If a(18) = 0 Then GoTo 2110
2100 If Abs((a(18) - O2) / a(18)) > 0.0001 Then GoTo 2160
2110 If a(20) = 0 Then GoTo 2130
2120 If Abs((a(20) - O3) / a(20)) > 0.0001 Then GoTo 2160
2130 If a(21) = 0 Then GoTo 2150
2140 If Abs((a(21) - O4) / a(21)) > 0.0001 Then GoTo 2160
2150 GoTo 2230
2160 O0 = a(15)
2170 O1 = a(16)
2180 O2 = a(18)
2190 O3 = a(20)
2200 O4 = a(21)
2210 Next I
2220 Print "50 CYCLES WITHOUT CONVERGE"
2230 a(92) = I
2231 a(93) = S5
2232 a(94) = F1
2234 a(95) = F2
2236 a(96) = F3
2238 a(97) = F4
2250 Open "ssout.txt" For Output As #1
2257 Print #1, "Patient: "; Tab(30); p$
2258 Print #1, "Analysis Date :"; Tab(30); Date$
2259 Print #1, "Collection Date and Time:"; Tab(30); q$: Print #1,
2260 Print #1, "Sodium", a(1) * 1000
2261 Rem Tab(43); "[NAHPP]"; Tab(57); A(50)
2270 Print #1, "Potassium", a(2) * 1000
2271 Rem Tab(43); "[KHPO4]"; Tab(57); A(51)
2280 Print #1, "Calcium", a(3) * 4008
2281 Rem Tab(43); "[KSO4]"; Tab(57); A(52)
2290 Print #1, "Magnesium", a(4) * 2431
2291 Rem Tab(43); "[KOX]"; Tab(57); A(53)
2300 Print #1, "Ammonia", a(5) * 1000
2301 Rem Tab(43); "[KCIT]"; Tab(57); A(54)
2302 Print #1, "Chloride", a(91) * 1000
2310 Print #1, "Phosphate", a(6) * 3097
2311 Rem Tab(43); "[KPP]"; Tab(57); A(55)
2320 Print #1, "Sulfate", a(7) * 3206
2321 Rem Tab(43); "[CAPO4]"; Tab(57); A(56)
2330 Print #1, "Oxalate", a(8) * 8802
2331 Rem Tab(43); "[CAHPO4]"; Tab(57); A(57)
2340 Print #1, "Citrate", a(9) * 19212
2341 Rem Tab(43); "[CAH2P04]"; Tab(57); A(58)
2342 Print #1, "pH", a(24)
2350 Print #1, "Urate", a(10) * 16800
2351 Rem Tab(43); "[CASO4]"; Tab(57); A(59)
2360 Rem Print #1, "PP", A(11)
2361 Rem Tab(43); "[CAOX]"; Tab(57); A(60)
2370 Rem Print #1, "[PP]", A(12), Tab(43); "[CA2OX]"; Tab(57); A(61)
2380 Rem Print #1, "[NA]", A(13), Tab(43); "[CAOX2]"; Tab(57); A(62)
2390 Rem Print #1, "[K]", A(14), Tab(43); "[CACIT]"; Tab(57); A(63)
2400 Rem Print #1, "[CA]", A(15), Tab(43); "[CAHCIT]"; Tab(57); A(64)
2410 Rem Print #1, "[MG]", A(16), Tab(43); "[CAH2CIT]"; Tab(57); A(65)
2420 Rem Print #1, "[NH4]", A(17), Tab(43); "[MGPO4]"; Tab(57); A(66)
2430 Rem Print #1, "[PO4]", A(18), Tab(43); "[MGHPO4]"; Tab(57); A(67)
2440 Rem Print #1, "[SO4]", A(19), Tab(43); "[MGH2PO4]"; Tab(57); A(68)
2450 Rem Print #1, "[OX]", A(20), Tab(43); "[MGSO4]"; Tab(57); A(69)
2460 Rem Print #1, "[CIT]", A(21), Tab(43); "[MGOX]"; Tab(57); A(70)
2470 Rem Print #1, "[HU]", A(22), Tab(43); "[MG2OX]"; Tab(57); A(71)
2480 Rem Print #1, "[HPP]", A(23), Tab(43); "[MGOX2]", Tab(57); A(72)
2490 Rem Print #1, "PH", A(24), Tab(43); "[MGCIT]"; Tab(57); A(73)
2500 Rem Print #1, "(OH)", A(25), Tab(43); "[MGHCIT]"; Tab(57); A(74)
2510 Rem Print #1, "(H)", A(26), Tab(43); "[MGH2CIT]"; Tab(57); A(75)
2520 Rem Print #1, "[HPO4]", A(27), Tab(43); "[NH4HPO4]"; Tab(57); A(76)
2530 Rem Print #1, "[H2PO4]", A(28), Tab(43); "[NH4SO4]"; Tab(57); A(77)
2540 Rem Print #1, "[H3PO4]", A(29), Tab(43); "[NH4OX]"; Tab(57); A(78)
2550 Rem Print #1, "[H2CO3]", A(30), Tab(43); "[NH4CIT]"; Tab(57); A(79)
2560 Rem Print #1, "CO2", A(31)
2570 Rem Print #1, "[HCO3]", A(32), Tab(43); "[H2PP]"; Tab(57); A(81)
2580 Rem Print #1, "[CO3]", A(33), Tab(43); "[H3PP]"; Tab(57); A(82)
2590 Rem Print #1, "[NACO3]", A(34), Tab(43); "[H4PP]"; Tab(57); A(83)
2600 Rem Print #1, "[NA2CO3]", A(35), Tab(43); "[CAPP]"; Tab(57); A(84)
2610 Rem Print #1, "[CACO3]", A(36), Tab(43); "[CAHPP]"; Tab(57); A(85)
2620 Rem Print #1, "[MGCO3]", A(37), Tab(43); "[CAOHPP]"; Tab(57); A(86)
2630 Rem Print #1, "[HSO4]", A(38), Tab(43); "[CAOH]"; Tab(57); A(87)
2640 Rem Print #1, "[HOX]", A(39), Tab(43); "[MGOH]"; Tab(57); A(88)
2650 Rem Print #1, "[HCIT]", A(40), Tab(43); "[MGPP]"; Tab(57); A(89)
2660 Rem Print #1, "[H2CIT]", A(41), Tab(43); "[MGOHPP]"; Tab(57); A(90)
2670 Rem Print #1, "[H3CIT]", A(42), Tab(43); "[CL]"; Tab(57); A(91)
2680 Rem Print #1, "[H2U]", A(43), Tab(43); "CYCLES"; Tab(57); A(92)
2690 Rem Print #1, "[NAHPO4]", A(44), Tab(43); "I.S."; Tab(57); A(93)
2700 Rem Print #1, "[NASO4]", A(45), Tab(43); "F1"; Tab(57); A(94)
2710 Rem Print #1, "[NAOX]", A(46), Tab(43); "F2"; Tab(57); A(95)
2720 Rem Print #1, "[NACIT]", A(47), Tab(43); "F3"; Tab(57); A(96)
2730 Rem Print #1, "[NAPP]", A(48), Tab(43); "F4"; Tab(57); A(97)
2740 Rem Print #1, "[NA2PP]", A(49)
2750 Print #1, "Cycles", a(92)
2760 Print #1,
2770 Print #1, Tab(20); "SS", Tab(43); "DG"
2780 a(100) = a(60) / 0.00000616
2790 a(101) = a(15) * a(27) * F2 * F2 / 0.000000237
2800 X1 = F2 * a(15) * 1000
2810 X2 = F3 * a(18) * 10000000000#
2820 a(102) = (X1 ^ 5) * (X2 ^ 3) * a(25) / 1.45E-14
2830 a(103) = F1 * F2 * F3 * a(16) * a(17) * a(18) / 0.000000000000115
2840 a(104) = a(43) / 0.000261
2850 a(105) = F1 * F1 * a(22) * a(13) / 0.0000279
2860 a(106) = F1 * F1 * a(22) * a(17) / 0.000036
2870 a(107) = F1 * F1 * a(22) * a(14) / 0.0000963
2875 If a(100) <= 0 Then a(108) = 0: GoTo 2885
2880 a(108) = 1.2935 * Log(a(100))
2885 If a(101) <= 0 Then a(109) = 0: GoTo 2895
2890 a(109) = 1.2935 * Log(a(101))
2895 If a(102) <= 0 Then a(110) = 0: GoTo 2905
2900 a(110) = 0.28744 * Log(a(102))
2905 If a(103) <= 0 Then a(111) = 0: GoTo 2915
2910 a(111) = 0.8623 * Log(a(103))
2915 If a(104) <= 0 Then a(112) = 0: GoTo 2925
2920 a(112) = 2.587 * Log(a(104))
2925 If a(105) <= 0 Then a(113) = 0: GoTo 2935
2930 a(113) = 1.2935 * Log(a(105))
2935 If a(106) <= 0 Then a(114) = 0: GoTo 2945
2940 a(114) = 1.2935 * Log(a(106))
2945 If a(107) <= 0 Then a(115) = 0: GoTo 3000
2950 a(115) = 1.2935 * Log(a(107))
3000 Print #1, "Calcium Oxalate"; Tab(20); Format(a(100), "###0.00"), Tab(43); Format(a(108), "###0.00")
3010 Print #1, "Brushite"; Tab(20); Format(a(101), "###0.00"), Tab(43); Format(a(109), "###0.00")
3020 Print #1, "Hydroxyapatite"; Tab(20); Format(a(102), "###0.00"), Tab(43); Format(a(110), "###0.00")
3030 Rem Print #1, "STRU", Format(A(103), "###0.00"), Tab(43); Format(A(111), "###0.00")
3040 Print #1, "Uric Acid"; Tab(20); Format(a(104), "###0.00"), Tab(43); Format(a(112), "###0.00")
3050 Print #1, "Sodium Urate"; Tab(20); Format(a(105), "###0.00"), Tab(43); Format(a(113), "###0.00")
3060 Print #1, "Ammonium Urate"; Tab(20); Format(a(106), "###0.00"), Tab(43); Format(a(114), "###0.00")
3070 Rem Print #1, "KU", Format(A(100), "###0.00"), Tab(43); Format(A(115), "###0.00")
3080 Print #1,: Print #1,: Print #1,: Print #1,
3100 Close #1
3240 Close

3250 End

End Sub

Sub Text1_Change()
a(1) = Val(Text1.Text)
End Sub

Sub Text10_Change()
a(24) = Val(Text10.Text)
End Sub

Sub Text11_Change()
a(10) = Val(Text11.Text)
End Sub


Private Sub Text14_Change()
p = Text14.Text
End Sub

Private Sub Text15_Change()
q = Text15.Text
End Sub

Sub Text2_Change()
a(2) = Val(Text2.Text)
End Sub

Sub Text3_Change()
a(3) = Val(Text3.Text)
End Sub

Sub Text4_Change()
a(4) = Val(Text4.Text)
End Sub

Sub Text5_Change()
a(91) = Val(Text5.Text)
End Sub

Sub Text6_Change()
a(6) = Val(Text6.Text)
End Sub

Sub Text7_Change()
a(7) = Val(Text7.Text)
End Sub

Sub Text8_Change()
a(9) = Val(Text8.Text)
End Sub

Sub Text9_Change()
a(8) = Val(Text9.Text)
End Sub
```
