using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; namespace EupForms {
public partial class Form1 : Form
{ public Form1() { InitializeComponent(); GridButton.Checked = true; }
private void ExitButton_Click(object sender, EventArgs e) {
Application.Exit(); }
// constants
List<Blocks> fblocks =new List<Blocks>();// Blocks in the lake
List<Blocks> fblocksupdate=new List<Blocks>();// Blocks in the lake
List<GridBlocks>gblocks=newList<GridBlocks>();//grid showing neghbor blocks //List<NeigborBlocks> fnblocks = new List<NeigborBlocks>();
private int blx = 20, bly = 5, blz = 3; private double velocityx = 0.20 ;
private double diffusivityEk = 1.0 / 10; private double timestep = 1.0 / 10; private double deltaxy=10.0;
private double concentration = 0.0;
// specify source concentrations
private double source1 = 0.0; private double source2 = 0.0; private double source3 = 0.0; private double source4 = 0.0;
// specify source flow rates
private double sourcerate1 = 6.0; private double sourcerate2 = 18.0; private double sourcerate3 = 42.2; private double sourcerate4 = 3.8;
//private double source1 = 9.0;
//private double source2 = 7.0;
class Blocks
{
public int Blocknum;// number in reservoir
public double Xpos;// position cordinate in x
public double Ypos;// position cordinate in y
public double Zpos;// position cordinate in z
public double Conc; // public double Source;
public double source1; public double source2; public double source3; public double source4; }
class GridBlocks
{
public int blocknum;
public int right;// number in reservoir
public int left;// position cordinate in x
public int rear;// position cordinate in y
public int front;// position cordinate in z
public int upper; public int lower; }
public void SetBlocks()// sets number and cordinate of blocks
{
for (int num = 0; num < blx * bly * blz; num++) {
Blocks bks = new Blocks(); bks.Blocknum = num;
bks.Xpos = (num % blx) * deltaxy + 5.0; bks.Ypos = (num / blx) * deltaxy + 5.0;
bks.Zpos = (num / (blx * bly * blz)) * deltaxy + 5.0; fblocks.Add(bks);
fblocksupdate.Add(bks); }
}
public void SetInitialConcentrationBlocks()// sets concentration in blocks
{
{
fblocks[num].Conc = 0.0; fblocks[num].Conc = 0.0;
fblocks[num].Conc = concentration; fblocksupdate[num].Conc = concentration;
/* if (num == 1||num == 46||num == 54||num == 201||num == 246||num == 254 ) { fblocksupdate[num].Conc = concentration; }*/ } //fblocks[1].Conc = 1.210; //fblocks[46].Conc = 1.240; //fblocks[54].Conc = 3.090; //fblocks[201].Conc = 0.930; //fblocks[246].Conc = 0.930; //fblocks[254].Conc = 1.200; }
public void SetInitialSourcesBlocks()// sets concentration in blocks
{
for (int num = 0; num < blx * bly * blz; num++) { fblocks[num].source1 = 0.0; fblocksupdate[num].source1 = 0.0; fblocks[num].source2 = 0.0; fblocksupdate[num].source2 = 0.0; fblocks[num].source3 = 0.0; fblocksupdate[num].source3 = 0.0; fblocks[num].source4 = 0.0; fblocksupdate[num].source4 = 0.0; }
fblocks[82 ].source1 = source1 ;
fblocks[80].source2 = source2; fblocks[86].source3 = source3; fblocks[10].source4 = source4; }
public void SetBlockGrids()// sets block grid
for (int num = 0; num < blx * bly * blz; num++) {
GridBlocks bks = new GridBlocks();
bks.blocknum = num; gblocks.Add(bks); }
for (int num = 0; num < blx * bly * blz; num++) {
if (num%(blx*bly) < 20)gblocks[num].left =-1;//sets left most block neigbor
else gblocks[num].left = num - blx;
if (num % (blx * bly)>= 80)gblocks[num].right =-2;//sets right most block neigbor
else gblocks[num].right = num + blx;
if (num % (blx) ==blx-1) gblocks[num].front = -3;// sets front
else gblocks[num].front = num + 1; if (num % (blx) == 0) gblocks[num].rear = -4;// sets rear
else gblocks[num].rear = num - 1;
if (num < (blx*bly )) gblocks[num].upper = -5;// sets upper
else gblocks[num].upper = num - (blx*bly);
if (num >= (blx * bly*(blz -1))) gblocks[num].lower = -6;// sets lower
else gblocks[num].lower = num + (blx * bly);
} }
public void ExecutionProgram() {
for (int timenum = 1; timenum < MaxStep; timenum++)// calculations for all blocks
{
// DiffusionSolver();
for (int num = 0; num < blx * bly * blz; num++)// calculations for all blocks
{
//fblocksupdate[num].Conc = fblocks[num].Conc + AdvectionSolver(num) - DiffusionSolver(num) + fblocks[num].source1 * timestep / (Math.Pow(10, 3));// total diffusion and advection
fblocksupdate[num].Conc = fblocks[num].Conc + AdvectionSolver(num) - DiffusionSolver(num) + (fblocks[num].source1 +fblocks[num].source2 + fblocks[num].source3 + fblocks[num].source4) * timestep/ (Math.Pow(10, - 11));// total diffusion and advection
//fblocksupdate[num].Conc = fblocks[num].Conc + AdvectionSolver(num);// advection only//fblocksupdate[num].Conc = fblocks[num].Conc -
DiffusionSolver(num);// diffusion only
//fblocksupdate[num].Conc = fblocks[num].Source *timestep /(Math .Pow (10,3));
} SetUpBetweenSteps(); SaveConcentrationData(timenum); SaveVelocityData(timenum); } }
public double DiffusionSolver(int num) {
double sum = 0;
// for (int num = 0; num < blx * bly * blz; num++)
//{
// sum = 0.0;
// Test if left most block neigbor
if (gblocks[num].left == -1) {
} else {
sum+=(fblocks [num].Conc -fblocks [ gblocks[num].left].Conc )*timestep *diffusivityEk /(Math .Pow (deltaxy ,2));
}
// sets right most block neigbor
if (gblocks[num].right == -2) {
} else {
sum += (fblocks[num].Conc - fblocks[gblocks[num].right].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
} // sets front if (gblocks[num].front == -3) { } else {
sum += (fblocks[num].Conc - fblocks[gblocks[num].front].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
} // sets rear if ( gblocks[num].rear ==-4) { } else {
sum += (fblocks[num].Conc - fblocks[gblocks[num].rear].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
}
// sets upper
if (gblocks[num].upper == -5) {
} else {
sum += (fblocks[num].Conc - fblocks[gblocks[num].upper].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
} // sets lower if (gblocks[num].lower == -6) { } else {
sum += (fblocks[num].Conc - fblocks[gblocks[num].lower].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
}
// fblocksupdate[num].Conc = fblocks[num].Conc -
return sum; //}
}
public double AdvectionSolver(int num) {
//double sum = 0.0;
//for (int num = 0; num < blx * bly * blz; num++)
// {
double sum = 0.0;
if (num % blx < 2) velocityx = 21.00;//equivalent to 24 cubic meters/sec
else if (num % blx < 6) velocityx = 21.00 * (sourcerate1 + sourcerate2 + sourcerate3) / (sourcerate1 + sourcerate2);
else velocityx = 21.00 * (sourcerate1 + sourcerate2+sourcerate3+sourcerate4 ) / (sourcerate1 + sourcerate2); // sets front if (gblocks[num].front>=0 &&(gblocks[num].front==gblocks[num].blocknum + 1)) {
sum -= (fblocks[num].Conc) * timestep *velocityx / deltaxy; }
// sets rear
if (gblocks[num].rear >=0 && (gblocks[num].rear == gblocks[num].blocknum - 1))
{
sum += (fblocks[gblocks[num].rear].Conc) * timestep * velocityx / deltaxy; }
/*
// Test if left most block neigbor if (gblocks[num].left == -1) { } else { sum += (fblocks[num].Conc -
fblocks[gblocks[num].left].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2));
// sets right most block neigbor if (gblocks[num].right == -2) { } else { sum += (fblocks[num].Conc -
fblocks[gblocks[num].right].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2)); } // sets upper if (gblocks[num].upper == -5) { } else { sum += (fblocks[num].Conc -
fblocks[gblocks[num].upper].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2)); } // sets lower if (gblocks[num].lower == -6) { } else { sum += (fblocks[num].Conc -
fblocks[gblocks[num].lower].Conc) * timestep * diffusivityEk / (Math.Pow(deltaxy, 2)); }*/ //fblocksupdate[num].Conc = fblocks[num].Conc + return sum; //} }
public void SetUpBetweenSteps() {
for (int num = 0; num < blx * bly * blz; num++) {
fblocks[num].Conc=fblocksupdate[num].Conc; }
}
public void SetConcentrationFile() {
string str = " ,"; int number = 0; StreamWriter fileout = new
StreamWriter("Concentration.txt",false); fileout .Write ("Step,");
for (int num = 0; num < blx * bly * blz; num++)// save title
{
str+=fblocks[num].Blocknum .ToString (); str+=" ,"; fileout.Write(str); } fileout.WriteLine(); str = " ,"; fileout.Write(number.ToString()); fileout.Write(str); for (int num = 0; num < blx * bly * blz; num++) { fileout.Write(fblocks[num].Conc.ToString()); fileout.Write(str); } fileout.WriteLine(); fileout.Close(); }
public void SaveConcentrationData(int number) {
string str = " ,";
StreamWriter fileout = new StreamWriter("Concentration.txt", true);
fileout.Write(number.ToString ()); fileout.Write(str);
for (int num = 0; num < blx * bly * blz; num++) { fileout.Write(fblocks[num].Conc .ToString()); fileout.Write(str); } fileout.WriteLine(); fileout.Close(); } //
public void SetVelocityFile() {
string str = " ,"; int number = 0;
StreamWriter fileout = new StreamWriter("Velocityx.txt", false);
fileout.Write("Step,");
for (int num = 0; num < blx * bly * blz; num++)// save title
{ str = "Blknum:"; str += fblocks[num].Blocknum.ToString(); str += " ,"; fileout.Write(str); } fileout.WriteLine(); str = " ,"; fileout.Write(number.ToString()); fileout.Write(str); for (int num = 0; num < blx * bly * blz; num++) {
fileout.Write(fblocks[num].Conc.ToString()); fileout.Write(str); } fileout.WriteLine(); fileout.Close(); }
public void SaveVelocityData(int number) {
string str = " ,";
StreamWriter fileout = new StreamWriter("Velocity.txt", true); fileout.Write(number.ToString()); fileout.Write(str);
if (number % blx < 2) velocityx = 21.00;//equivalent to 24 cubic meters/sec
else if (number % blx < 6) velocityx = 21.00 * (sourcerate1 + sourcerate2 + sourcerate3) / (sourcerate1 + sourcerate2);
else velocityx = 21.00 * (sourcerate1 + sourcerate2 + sourcerate3 + sourcerate4) / (sourcerate1 + sourcerate2 );
for (int num = 0; num < blx * bly * blz; num++) { fileout.Write(velocityx.ToString()); fileout.Write(str); } fileout.WriteLine(); fileout.Close(); } //
public void SaveBlockNighbdata() {
StreamWriter fileout = new StreamWriter("kabakagrid.txt"); foreach (GridBlocks blks in gblocks)
{
string str = "Block number ";
str += Convert.ToString(blks.blocknum); str += "; "; str += blks.left .ToString(); str += "; "; str += blks.right.ToString(); str += "; "; str += blks.front.ToString(); str += "; "; str += blks.rear.ToString(); str += "; "; str += blks.upper.ToString(); str += "; "; str += blks.lower.ToString(); str += "; "; fileout.WriteLine(str); str = " "; } fileout.Close(); }
public void SaveBlockdata() {
StreamWriter fileout = new StreamWriter("kabaka.txt"); foreach (Blocks blks in fblocks)
{
string str="Block number ";
str += Convert .ToString ( blks.Blocknum); str += "; "; str += blks.Xpos.ToString (); str += "; "; str += blks.Ypos.ToString (); str += "; "; str += blks.Zpos.ToString () ; str += "; "; str += blks.Conc .ToString(); str += "; "; fileout.WriteLine(str); str = " "; } fileout.Close(); }
/* private void RunButton_Click(object sender, EventArgs e) {
// On cliking the button 'run', a new window loads SetUpWindow dlg = new SetUpWindow();
dlg.ShowDialog(); diffusivityEk = dlg.diffusivity; velocityx = dlg.velocity; deltaxy = dlg.deltaxy; source = dlg.source; concentration=dlg.concentration ; MaxStep = dlg.maxtimesteps; SetBlocks(); SetInitialConcentrationBlocks(); SetBlockGrids(); SaveBlockdata(); SetConcentrationFile(); SaveBlockNighbdata(); SetInitialSourcesBlocks(); ExecutionProgram(); } */
private void RunButton_Click(object sender, EventArgs e) {
// On cliking the button 'run', a new window loads
h dlg = new h(); dlg.ShowDialog(); diffusivityEk = dlg.diffusivity; velocityx = dlg.velocityx; deltaxy = dlg.deltaxy; source1 = dlg.source1;
source2 = dlg.source2; source3 = dlg.source3; source4 = dlg.source4; sourcerate1 = 42.0; sourcerate2 = 18.0; sourcerate3 = 6.0; sourcerate4 = 3.8; concentration = dlg.concentration; MaxStep = dlg.maxtimesteps; SetBlocks(); SetInitialConcentrationBlocks(); SetBlockGrids(); SaveBlockdata(); SetConcentrationFile(); SaveBlockNighbdata(); SetInitialSourcesBlocks(); SetVelocityFile(); ExecutionProgram(); }
private void ReadFileButton_Click(object sender, EventArgs e) {
if (GridButton.Checked) {
FileTextBox.Clear();
FileTextBox.Lines = File.ReadAllLines("kabakagrid.txt"); }
else if (CordinateButton.Checked) {
FileTextBox.Clear();
FileTextBox.Lines = File.ReadAllLines("kabaka.txt"); }
else {
FileTextBox.Clear();
FileTextBox.Lines = File.ReadAllLines("Concentration.txt"); }
}
private void Form1_Load(object sender, EventArgs e) {
} } }
APPENDIX III: GRID RESULTS SHOWING BLOCK NUMBER AND