static void export_uptake(Bed bed, string filename) { using (CsvWriter writer = new CsvWriter(filename + ".csv")) { CsvRow row; for (int r = (bed.numOfRNodes - 1); r >= 0; r--) { row = new CsvRow(); for (int z = 0; z < bed.numOfZNodes; z++) { row.Add((bed.Rho[r, z].q).ToString()); } writer.WriteRow(row); } } }
public static void updateq(Bed bed) { foreach (RhoNodes node in bed.Rho) { if (node.q < bed.workingPair.qm && node.materialType == MaterialType.Adsorbent) { node.q = node.q + node.dqdt * Parameters.deltat; if (node.q > bed.workingPair.qm) { node.q = bed.workingPair.qm; } else if (node.q < 0) { node.q = 0; } } } }
public BedTemperaturePDE(Bed bed) { deltaR = bed.deltaR; deltaZ = bed.deltaZ; numOfRNodes = bed.numOfRNodes; numOfZNodes = bed.numOfZNodes; T = bed.T; assignBoundary(); //initial conditions foreach (TNodes node in T) { node.TP0 = Parameters.T0; node.TP = node.TP0; } assignCoefficients2(); }
public void calculateExcessTubeOuterSurfaceArea(Bed bed) { int r = numOfRNodes_fluid + numOfRNodes_tubeWall; excessTubeOuterSurfaceArea = 2 * Math.PI * r * deltaR * bed.numOfZNodes_excessTube * deltaZ; }
public void assignMaterials(Bed bed) { //assign materials for TNodes //for first excess tube for (int z = 0; z < bed.numOfZNodes_excessTube; z++) { for (int r = 0; r < numOfRNodes; r++) { if (r < bed.numOfRNodes_fluid) { T[r, z].materialType = MaterialType.HeatExchangeFluid; T[r, z].density = bed.fluid.density; T[r, z].heatCapacity = bed.fluid.heatCapacity; T[r, z].thermalConductivity = bed.fluid.thermalConductivity; T[r, z].dynamicViscosity = bed.fluid.dynamicViscosity; T[r, z].velocity = Parameters.fluidVelocity_bed; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall)) { T[r, z].materialType = MaterialType.Tube; T[r, z].density = bed.tube.density; T[r, z].heatCapacity = bed.tube.heatCapacity; T[r, z].thermalConductivity = bed.tube.thermalConductivity; T[r, z].velocity = 0; } else { T[r, z].materialType = MaterialType.Adsorbate; T[r, z].density = bed.adsorbate.density; T[r, z].heatCapacity = bed.adsorbate.heatCapacity; T[r, z].thermalConductivity = (1 - bed.adsorbent.porosity) * bed.adsorbate.thermalConductivity; T[r, z].velocity = 0; } } } //for each tube section (fin + adsorbent z nodes) for (int n = 0; n < bed.numOfTubeSection; n++) { for (int z = ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * n + bed.numOfZNodes_excessTube); z < ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * (n + 1) + bed.numOfZNodes_excessTube); z++) { for (int r = 0; r < numOfRNodes; r++) { if (z >= ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * n + bed.numOfZNodes_excessTube) && z < ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * n + bed.numOfZNodes_fin + bed.numOfZNodes_excessTube)) { if (r < bed.numOfRNodes_fluid) { T[r, z].materialType = MaterialType.HeatExchangeFluid; T[r, z].density = bed.fluid.density; T[r, z].heatCapacity = bed.fluid.heatCapacity; T[r, z].thermalConductivity = bed.fluid.thermalConductivity; T[r, z].dynamicViscosity = bed.fluid.dynamicViscosity; T[r, z].velocity = Parameters.fluidVelocity_bed; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall + bed.numOfRNodes_adsorbent)) { T[r, z].materialType = MaterialType.Tube; T[r, z].density = bed.tube.density; T[r, z].heatCapacity = bed.tube.heatCapacity; T[r, z].thermalConductivity = bed.tube.thermalConductivity; T[r, z].velocity = 0; } else { T[r, z].materialType = MaterialType.Adsorbate; T[r, z].density = bed.adsorbate.density; T[r, z].heatCapacity = bed.adsorbate.heatCapacity; T[r, z].thermalConductivity = bed.adsorbate.thermalConductivity; T[r, z].velocity = 0; } } else { if (r < bed.numOfRNodes_fluid) { T[r, z].materialType = MaterialType.HeatExchangeFluid; T[r, z].density = bed.fluid.density; T[r, z].heatCapacity = bed.fluid.heatCapacity; T[r, z].thermalConductivity = bed.fluid.thermalConductivity; T[r, z].dynamicViscosity = bed.fluid.dynamicViscosity; T[r, z].velocity = Parameters.fluidVelocity_bed; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall)) { T[r, z].materialType = MaterialType.Tube; T[r, z].density = bed.tube.density; T[r, z].heatCapacity = bed.tube.heatCapacity; T[r, z].thermalConductivity = bed.tube.thermalConductivity; T[r, z].velocity = 0; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall + bed.numOfRNodes_adsorbent)) { T[r, z].materialType = MaterialType.Adsorbent; T[r, z].density = bed.adsorbent.density; T[r, z].heatCapacity = bed.adsorbent.heatCapacity; T[r, z].thermalConductivity = bed.adsorbent.thermalConductivity; T[r, z].velocity = 0; T[r, z].porosity = bed.adsorbent.porosity; } else { T[r, z].materialType = MaterialType.Adsorbate; T[r, z].density = bed.adsorbate.density; T[r, z].heatCapacity = bed.adsorbate.heatCapacity; T[r, z].thermalConductivity = bed.adsorbate.thermalConductivity; T[r, z].velocity = 0; } } } } } //for last fin for (int z = ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * bed.numOfTubeSection + bed.numOfZNodes_excessTube); z < ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * bed.numOfTubeSection + bed.numOfZNodes_excessTube + bed.numOfZNodes_fin); z++) { for (int r = 0; r < numOfRNodes; r++) { if (r < bed.numOfRNodes_fluid) { T[r, z].materialType = MaterialType.HeatExchangeFluid; T[r, z].density = bed.fluid.density; T[r, z].heatCapacity = bed.fluid.heatCapacity; T[r, z].thermalConductivity = bed.fluid.thermalConductivity; T[r, z].dynamicViscosity = bed.fluid.dynamicViscosity; T[r, z].velocity = Parameters.fluidVelocity_bed; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall + bed.numOfRNodes_adsorbent)) { T[r, z].materialType = MaterialType.Tube; T[r, z].density = bed.tube.density; T[r, z].heatCapacity = bed.tube.heatCapacity; T[r, z].thermalConductivity = bed.tube.thermalConductivity; T[r, z].velocity = 0; } else { T[r, z].materialType = MaterialType.Adsorbate; T[r, z].density = bed.adsorbate.density; T[r, z].heatCapacity = bed.adsorbate.heatCapacity; T[r, z].thermalConductivity = bed.adsorbate.thermalConductivity; T[r, z].velocity = 0; } } } //for last excess tube for (int z = ((bed.numOfZNodes_fin + bed.numOfZNodes_adsorbent) * bed.numOfTubeSection + bed.numOfZNodes_excessTube + bed.numOfZNodes_fin); z < numOfZNodes; z++) { for (int r = 0; r < numOfRNodes; r++) { if (r < bed.numOfRNodes_fluid) { T[r, z].materialType = MaterialType.HeatExchangeFluid; T[r, z].density = bed.fluid.density; T[r, z].heatCapacity = bed.fluid.heatCapacity; T[r, z].thermalConductivity = bed.fluid.thermalConductivity; T[r, z].dynamicViscosity = bed.fluid.dynamicViscosity; T[r, z].velocity = Parameters.fluidVelocity_bed; } else if (r < (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall)) { T[r, z].materialType = MaterialType.Tube; T[r, z].density = bed.tube.density; T[r, z].heatCapacity = bed.tube.heatCapacity; T[r, z].thermalConductivity = bed.tube.thermalConductivity; T[r, z].velocity = 0; } else { T[r, z].materialType = MaterialType.Adsorbate; T[r, z].density = bed.adsorbate.density; T[r, z].heatCapacity = bed.adsorbate.heatCapacity; T[r, z].thermalConductivity = bed.adsorbate.thermalConductivity; T[r, z].velocity = 0; } } } //assign materials for RhoNodes for (int r = 0; r < numOfRNodes; r++) { for (int z = 0; z < numOfZNodes; z++) { Rho[r, z].materialType = bed.T[r, z].materialType; if (Rho[r, z].materialType == MaterialType.Adsorbent) { Rho[r, z].porosity = bed.adsorbent.porosity; Rho[r, z].molarMass = bed.adsorbate.molarMass; Rho[r, z].molarGasConstant = bed.adsorbate.molarGasConstant; Rho[r, z].sigma = bed.adsorbate.sigma; Rho[r, z].omega = bed.adsorbate.omega; Rho[r, z].specificGasConstant = bed.adsorbate.specificGasConstant; Rho[r, z].volume = bed.T[r, z].volume; } else if (Rho[r, z].materialType == MaterialType.Adsorbate) { Rho[r, z].porosity = bed.adsorbate.porosity; Rho[r, z].molarMass = bed.adsorbate.molarMass; Rho[r, z].molarGasConstant = bed.adsorbate.molarGasConstant; Rho[r, z].sigma = bed.adsorbate.sigma; Rho[r, z].omega = bed.adsorbate.omega; Rho[r, z].specificGasConstant = bed.adsorbate.specificGasConstant; Rho[r, z].volume = bed.T[r, z].volume; } else { Rho[r, z].porosity = bed.adsorbate.porosity; } } } }
static void Main(string[] args) { //define chambers Bed[] bed = new Bed[Parameters.numOfBed]; for (int i = 0; i < Parameters.numOfBed; i++) { bed[i] = new Bed(); } Condenser cond = new Condenser(); Evaporator eva = new Evaporator(); //define connecting pipes ConnectingPipes[] connectingPipe = new ConnectingPipes[Parameters.numOfBed + 1 + 1]; connectingPipe[0] = new ConnectingPipes(bed[0], cond); connectingPipe[1] = new ConnectingPipes(bed[1], cond); connectingPipe[2] = new ConnectingPipes(eva, bed[0]); connectingPipe[3] = new ConnectingPipes(eva, bed[1]); //define time plots TemperaurePlot temperaturePlot = new TemperaurePlot(); PressurePlot pressurePlot = new PressurePlot(); //define performance indicators PerformanceIndicator.initialise(); Report.initialise(bed); //starting operation int cycle = 1; for (int timeStep = 1; timeStep <= Parameters.numOfTimeStep; timeStep++) { if (timeStep > 1) { updateNodeAtNewTimeStep(bed[0]); updateq(bed[0]); updateNodeAtNewTimeStep(bed[1]); updateq(bed[1]); updateNodeAtNewTimeStep(cond); updateNodeAtNewTimeStep(eva); } if (timeStep > ((cycle - 1) * 2 * Parameters.switchingTime * Parameters.timeStepPerSecond) && timeStep <= (Parameters.switchingTime * Parameters.timeStepPerSecond + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime) * Parameters.timeStepPerSecond)) { //Phase bed[0].phase = Phase.Preheating; bed[1].phase = Phase.Precooling; cond.phase = Phase.NA; eva.phase = Phase.NA; updateMassFlowrate(connectingPipe); //switching time List <Task> TaskList = new List <Task>(); Task task1 = new Task(bed[0].preheating); task1.Start(); TaskList.Add(task1); Task task2 = new Task(bed[1].precooling); task2.Start(); TaskList.Add(task2); Task task3 = new Task(cond.disconnected); task3.Start(); TaskList.Add(task3); Task task4 = new Task(eva.disconnected); task4.Start(); TaskList.Add(task4); Task.WaitAll(TaskList.ToArray()); } else if (timeStep > ((Parameters.switchingTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond) && timeStep <= ((Parameters.switchingTime + Parameters.sorptionTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond)) { //Phase bed[0].phase = Phase.Desorption; bed[1].phase = Phase.Adsorption; cond.phase = Phase.Desorption; eva.phase = Phase.Adsorption; updateMassFlowrate(connectingPipe); //sorption time List <Task> TaskList = new List <Task>(); Task task1 = new Task(bed[0].desorption); task1.Start(); TaskList.Add(task1); Task task2 = new Task(bed[1].adsorption); task2.Start(); TaskList.Add(task2); Task.WaitAll(TaskList.ToArray()); cond.condensation(); eva.evaporation(); } else if (timeStep > ((Parameters.switchingTime + Parameters.sorptionTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond) && timeStep <= ((2 * Parameters.switchingTime + Parameters.sorptionTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond)) { //Phase bed[0].phase = Phase.Precooling; bed[1].phase = Phase.Preheating; cond.phase = Phase.NA; eva.phase = Phase.NA; updateMassFlowrate(connectingPipe); //switching time List <Task> TaskList = new List <Task>(); Task task1 = new Task(bed[0].precooling); task1.Start(); TaskList.Add(task1); Task task2 = new Task(bed[1].preheating); task2.Start(); TaskList.Add(task2); Task task3 = new Task(cond.disconnected); task3.Start(); TaskList.Add(task3); Task task4 = new Task(eva.disconnected); task4.Start(); TaskList.Add(task4); Task.WaitAll(TaskList.ToArray()); } else if (timeStep > ((2 * Parameters.switchingTime + Parameters.sorptionTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond) && timeStep <= ((2 * Parameters.switchingTime + 2 * Parameters.sorptionTime + (cycle - 1) * 2 * (Parameters.switchingTime + Parameters.sorptionTime)) * Parameters.timeStepPerSecond)) { //Phase bed[0].phase = Phase.Adsorption; bed[1].phase = Phase.Desorption; cond.phase = Phase.Desorption; eva.phase = Phase.Adsorption; updateMassFlowrate(connectingPipe); //sorption time List <Task> TaskList = new List <Task>(); Task task1 = new Task(bed[0].adsorption); task1.Start(); TaskList.Add(task1); Task task2 = new Task(bed[1].desorption); task2.Start(); TaskList.Add(task2); Task.WaitAll(TaskList.ToArray()); cond.condensation(); eva.evaporation(); } if (timeStep == cycle * 2 * (Parameters.switchingTime + Parameters.sorptionTime) * Parameters.timeStepPerSecond) { cycle++; } //reset mass flow rate to 0 resetMassFlowRate(connectingPipe); //update aveage pressure bed[0].calculateAveragePressure(); bed[1].calculateAveragePressure(); cond.calculateAveragePressure(); eva.calculateAveragePressure(); bed[0].calculateAverageMass(); cond.calculateAverageMass(); //update time plots temperaturePlot.addValue(bed, cond, eva, timeStep); pressurePlot.addValue(bed, cond, eva, timeStep); //update performance indicators for (int i = 0; i < Parameters.numOfBed; i++) { if (bed[i].phase == Phase.Preheating || bed[i].phase == Phase.Desorption) { //heat input switch (i) { case 0: PerformanceIndicator.addBedValue(temperaturePlot.array_bed1_inlet[timeStep], temperaturePlot.array_bed1_outlet[timeStep], timeStep); break; case 1: PerformanceIndicator.addBedValue(temperaturePlot.array_bed2_inlet[timeStep], temperaturePlot.array_bed2_outlet[timeStep], timeStep); break; default: Console.WriteLine("more bed than declared"); Console.Read(); break; } } } //heat output PerformanceIndicator.addEvaValue(temperaturePlot.array_eva_inlet[timeStep], temperaturePlot.array_eva_outlet[timeStep], timeStep); //condensatation PerformanceIndicator.addCondensateValue(cond.rateOfCondensation, timeStep); //output the current time step Console.WriteLine("{0} of {1} time steps completed...", timeStep, Parameters.numOfTimeStep); Console.WriteLine("{0}" + " " + "{1}", bed[0].averagePressure, cond.averagePressure); Console.WriteLine("{0}" + " " + "{1}", bed[1].averagePressure, eva.averagePressure); } string cycleTime = (Parameters.switchingTime / 60).ToString() + "m " + (Parameters.sorptionTime / 60).ToString() + "m"; export_T(bed[0], cycleTime + " bed 1 temperature contour"); export_T(bed[1], cycleTime + " bed 2 temperature contour"); export_T(cond, cycleTime + " cond temperature contour"); export_T(eva, cycleTime + " eva temperature contour"); export_P(bed[0], cycleTime + " bed 1 pressure contour"); export_P(bed[1], cycleTime + " bed 2 pressure contour"); export_P(cond, cycleTime + " cond pressure contour"); export_P(eva, cycleTime + " eva pressure contour"); temperaturePlot.exportPlot(cycleTime + " temperature plot"); pressurePlot.exportPlot(cycleTime + " pressure plot"); PerformanceIndicator.calculatePerformance(bed, eva); Console.WriteLine("COP is {0}", PerformanceIndicator.COP); Report.publish(cycleTime + " report"); Console.WriteLine("Simulation is completed, press any key to close this window"); Console.Read(); }
public void condensationOnExcessTubeSurface(double T_sat, Bed bed, int part, out double rateOfCondensation) { int startIndex = 0, endIndex = 0; switch (part) { case 1: startIndex = 0; endIndex = bed.numOfZNodes_excessTube; break; case 2: startIndex = numOfZNodes - bed.numOfZNodes_excessTube; endIndex = numOfZNodes; break; default: Console.WriteLine("wrong data for bed excess tube"); Console.Read(); break; } int r = bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall - 1; //calculate averaged wall temperature for excess tube double sum = 0; int count = 0; for (int z = startIndex; z < endIndex; z++) { if (T[r, z].materialType == MaterialType.Tube && T[r + 1, z].materialType == MaterialType.Adsorbate) { sum += T[r, z].TP; count++; } } double T_wall = sum / count; //calculate modified latent heat of vaporisation double JakobNumber = bed.adsorbate.heatCapacity_condensed * (T_sat - T_wall) / bed.adsorbate.latentHeat; double modifiedLatentHeat = bed.adsorbate.latentHeat * (1 + 0.68 * JakobNumber); //calculate heat transfer coefficient for film condensation double g = 9.81; //kgm/s2 double c = 0.729; //for tube double numerator = g * bed.adsorbate.density_condensed * (bed.adsorbate.density_condensed - bed.adsorbate.density) * Math.Pow(bed.adsorbate.thermalConductivity_condensed, 3) * modifiedLatentHeat; double denominator = bed.adsorbate.dynamicViscosity_condensed * (T_sat - T_wall) * 2 * (bed.numOfRNodes_fluid + bed.numOfRNodes_tubeWall) * deltaR; double heatTransferCoefficient_condensation = c * Math.Pow(Math.Abs(numerator / denominator), 0.25) * deltaZ * bed.numOfZNodes_excessTube; double heatOfCondensation = heatTransferCoefficient_condensation * bed.excessTubeOuterSurfaceArea * (T_sat - T_wall); rateOfCondensation = 0; if ((T_sat - T_wall) > 0) { //apply heat flux (ignore it first) for (int z = startIndex; z < endIndex; z++) { //T[r, z].aN = 0; //T[r, z].Sc = 2 * Math.PI * T[r, z].rn * deltaZ * heatTransferCoefficient_condensation * (T_sat - T_wall); //T[r, z].aP = T[r, z].aW + T[r, z].aE + T[r, z].aS + T[r, z].aN + T[r, z].aP0 - T[r, z].Sp + T[r, z].deltaF; rateOfCondensation = heatOfCondensation / modifiedLatentHeat; } } }