#!c:\perl\bin\perl.exe;
#Calculating Information about chemical baths
#Author = David Daycock
#Date = April, 2004
#First, lets initilize the hashs we will need and fill them with data.
+..
%density = (
DI => "1",
HF => "1.16",
NH4OH => "0.9",
H202 => "1.11",
HCl => "1.18",
H2SO4 => "1.84",
Citric_Acid => "1",
NH4F => "1.01",
TMAH => "1",
PHOS => "1.7"
);
%concentration =(
DI => "1",
HF => "0.49",
NH4OH => "0.29",
H202 => "0.3",
HCl => "0.37",
H2SO4 => ".98",
Citric_Acid => "0.5",
NH4F => "0.4",
TMAH => "0.25",
PHOS => "0.85"
);
%because = (
1 => "DI",
2 => "HF",
3 => "NH4OH",
4 => "H202",
5 => "HCl",
6 => "H2SO4",
7 => "Citric_Acid",
8 => "NH4F",
9 => "TMAH",
10 => "PHOS",
11 => "Other"
);
#Overall Script Flow below:
&INTRODUCTION;
$true = 0;
&CHOICE;
sub INTRODUCTION
{
# print("\n\nChemical Bath Calculation Utility\n");
print <<DONE
******************************************************
* *
* *
* Chemical Bath Calculation Utility *
* ver. 1.0 *
* *
* by: *
* David Daycock *
* *
* *
* *
******************************************************
DONE
}
sub CHOICE
{
print("\nMake a Selection: \n");
print("1. Calculate amount of material to make the bath.\n");
print("2. Convert chemical ratio to mass percent.\n");
print("3. Display a list of assumptions used in the calculatio
+ns.\n");
print("4. Quit\n\n");
print("Choice: ");
$where = <STDIN>;
chomp($where);
if ($where == 1)
{
&MAKE_BATH;
}
elsif ($where == 2)
{
&RATIO;
}
elsif ($where == 4)
{
&QUIT;
}
elsif ($where == 3)
{
&ASSUME;
}
else
{
print ("\nThat is not an option...try again.\n");
&CHOICE;
};
}
sub MAKE_BATH #subroutine to calculate how much chemical to pou
+r into a bath...
{
print <<DONE
*******************************************************************
* *
* This Utility will give you an estimate of the amount of *
* material you need to pour into your bath to achieve *
* a desired weight percent based concentration *
* *
* *
*******************************************************************
+
DONE
;&BASIC_QUESTIONS;
print("\n\n");
foreach (@choices)
{
print("$_\. $because{$_}\n");
}
print ("\nWhat is the solvent: ");
$solvent = <STDIN>;
chomp($solvent);
print("\nWhat is the final concentration of each chemical you desi
+re \(wt \%\):\n");
$vDI = 0;
foreach (@choices)
{
if ($_ != $solvent)
{
while ($testSix !=1) # this will make sure that a numeri
+cal answer is given
{
print("\n$because{$_} \(in \%\): ");
$answer2 = <STDIN>;
chomp($answer2);
if ($answer2 =~ m/\d/ || $answer2 =~ m/\d/){$testSix =
+ 1;} # searching for a numererical answer
}
$answer2 = $answer2 / 100;
$testSix = 0;
$c2i{$_} = $answer2;
}
}
$percentsolvent = 1;
foreach (@choices)
{
$foo = $because{$_};
$percentsolvent = $percentsolvent - ($c2i{$_} / $concentration
+{$foo});
}
foreach (@choices)
{
$chemName3 = $because{$_};
$estdensity = $estdensity + (($c2i{$_} / $concentration{$chemN
+ame3}) * $density{$chemName3});
}
$solvName = $because{$solvent};
$estdensity = $estdensity + ($percentsolvent * $density{$solvName}
+);
# print("\nestdensity = $estdensity\n");
$volSolv = $totalsize;
foreach (@choices)
{
if ($_ != $solvent)
{
$chemName2 = $because{$_};
$concRatio = $c2i{$_} / $concentration{$chemName2};
$totalmass = $totalsize * $estdensity;
$mass{$_} = $concRatio * $totalmass;
$volume{$_} = $mass{$_} / $density{$chemName2};
$volSolv = $volSolv - $volume{$_};
}
}
print("\nHere are the volumes you need to fill:\n\n");
foreach (@choices)
{
if ($_ != $solvent)
{
$volume{$_} = $volume{$_} * 100;
$volume{$_} = int($volume{$_});
$volume{$_} = $volume{$_} / 100;
print("$because{$_}:\t\t$volume{$_} L\n");
}
}
$volSolv = $volSolv * 100;
$volSolv = int($volSolv);
$volSolv = $volSolv / 100;
print("$because{$solvent}:\t\t$volSolv L\n");
&ASK;
}
sub RATIO
{
print <<DONE
*******************************************************************
* *
* This Utility will give you an estimate of the concentration *
* of material in your bath given a known pour up ratio. *
* *
* *
*******************************************************************
+
DONE
;$true = 1; #this is for the BASIC_QUESTION sub, to know whethe
+r or not to ask for total volume...
&BASIC_QUESTIONS;
# At this point, we have all the chemical choices in the @choices
+array using the keys of %because
# Now we need to take the chemicals we have and find out the ratio
+ of chemicals in the final bath...
while ($testOne != 1){
print("\nAre you using mass or volume ratios (m or v): ");
$mORv = <STDIN>;
chomp($mORv);
if ($mORv =~ m/[mM]/ || $mORv =~ m/[vV]/){$testOne = 1;} #lets m
+ake sure we have m's and v's as answers...
};
print("\nPlease provide the ratio of the chemicals you have select
+ed: \n");
foreach (@choices)
{
while ($testTwo !=1) # this will make sure that a numerical
+answer is given
{
print("\n$because{$_}: ");
$answer = <STDIN>;
chomp($answer);
if ($answer =~ m/\d/ || $answer =~ m/\d/){$testTwo = 1;}
+# searching for a numererical answer
}
$testTwo = 0; # need to reset the test or else goodbye!
$ratio{$_} = $answer; #Put all answers into
+ the ratio hash for later use
$chemName = $because{$_};
if ($mORv eq "v" || $mORv eq "V") #i like to work in
+weight percent so this does the ratio conversion
{
$ratio{$_} = $ratio{$_} * $density{$chemName};
}
$wtPureAmt{$_} = $ratio{$_} * $concentration{$chemName};
$A = $ratio{$_};
$B = 1 - $concentration{$chemName};
$C = $A * $B;
$residualWater = $residualWater + $C; #becasue most chemicals
+ have water in them, lets add the residual water together
}
$sumTotal = 0;
foreach (@choices)
{
$sumTotal = $sumTotal + $ratio{$_}; #calculate the total mass
+ of chemical in the bath
}
print("\nHere are the weight percents:\n\n");
foreach (@choices)
{
if ($_ == 1)
{
$wtPureAmt{$_} = $wtPureAmt{$_} + $residualWater;
}
$chemName2 = $because{$_};
$wtPercent{$_} = $wtPureAmt{$_} / $sumTotal;
# print("WtPercent = $wtPercent{$_}\n");
# print("PureAmt = $wtPureAmt{$_}\n");
#print $sumTotal;
$percent = $wtPercent{$_}*100000; #these next three lines a
+re for displaying to two sig figs, since I don't know another way to
+do this...
$percent = int($percent);
$percent = $percent / 1000;
print("$because{$_}:\t\t$percent \%\n");
# $volPercent{$_} = $wtPercent{$_} /
}
$DI_PRESENT = 0;
foreach (@choices)
{
if ($_ == 1) {$DI_PRESENT = 1};
}
if ($residualWater != 0 && $DI_PRESENT != 1) { #I want to displa
+y the residual water if I haven't already accounted for it in the DI
+water answer
$DI_Percent = $residualWater / $sumTotal;
$DI_Percent = $DI_Percent * 10000;
$DI_Percent = int($DI_Percent);
$DI_Percent = $DI_Percent / 100;
print("Water:\t\t$DI_Percent\%\n");
}
&ASK;
}
sub QUIT #This is for GOODBYE and GOOD RIDANCE!
{print("\nHope this helped! See you next time...\n");}
sub sort_by_number #This is for sorting the hashes / arrays in the s
+cript in numerical order...
{
if ($a < $b)
{
return -1;
}
elsif ($a == $b)
{
return 0;
}
else
{
return 1;
}
}
sub BASIC_QUESTIONS
{
if ($true == 0)
{
while ($fourTest != 1)
{
print("\nWhat is the size of your bath in liters: ");
$totalsize = <STDIN>;
chomp($totalsize);
if ($totalsize =~ m/\d/) {$fourTest = 1;}
}
}
print ("\nHow many chemicals in the mixture (include DI as a chemi
+cal): ");
$numChems = <STDIN>;
chomp($numChems);
# Now we need to find which chemicals are going to be in t
+he bath...
print("\n\n\tCHEMICAL LIST\n");
foreach (sort sort_by_number keys(%because))
{
print("$_\.\t$because{$_}\n");
};
$selection = 1;
#this section puts all the chemicals into the @choices array
+
for ($i = 0; $i < $numChems; $i++)
{
print("\nChemical #$selection: ");
$selection++;
while ($fiveTest != 1)
{
$chemchoice = <STDIN>;
chomp($chemchoice);
if ($chemchoice =~ m/\d/) {$fiveTest = 1;}
if ($fiveTest == 0){print ("I need a numerical answer: ")
+;}
}
$fiveTest = 0;
push (@choices, $chemchoice);
};
#if we don't have the chemical already, we need to add them to the
+ existing hash
$inc = 0;
foreach(@choices)
{
if ($_ == 11)
{
#no error checking in here, if you are adding your
+ own stuff, you better be sure it is right!
print("\nChemical Name: ");
$othName = <STDIN>;
chomp($othName);
print ("\nChemical Concentration of Pure M
+aterial\(in percent\): ");
$othConc = <STDIN>;
chomp($othConc);
$othConc = $othConc * 0.01;
print ("\nChemical Density of Pure Materia
+l(g/mL): ");
$othDen = <STDIN>;
chomp($othDen);
$density{$othName} = $othDen;
$concentration{$othName} = $othConc;
$othIndex = 11 + $inc;
$because{$othIndex} = "$othName";
$choices[$inc] = $othIndex;
}
$inc++;
}
}
sub ASK
{
print("\nAre you finished (y or n): ");
$quitornot = <STDIN>;
chomp($quitornot);
undef (@choices);
undef ($fiveTest);
undef ($fourTest);
undef ($DI_PRESENT);
undef ($true);
undef ($vDI);
undef ($testSix);
undef ($testOne);
undef ($testTwo);
undef ($residualWater);
if ($quitornot eq "y" || $quitornot eq "Y")
{
&QUIT;
}
elsif ($quitornot eq "n" || $quitornot eq "N")
{
&CHOICE;
}
else
{
print ("\nThat is not an option...try again.\n");
&ASK;
};
}
sub ASSUME
{
print("\n\nHere are the assumptions used in the calculations:\n");
print("\n\nThe following densities were used \(g/mL\):\n");
foreach (sort keys(%density))
{
print("$_\t$density{$_}\n");
}
print("\n\nThe following concentrations were used:\n");
foreach (sort keys(%concentration))
{
print("$_\t$concentration{$_}\n");
}
print("\nWhen calculating the amount of material to pour up a bath
+, the density of the entire solution is assumed to be the mass percen
+t weighted average of the components.");
&ASK;
}
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.