Пример #1
0
        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);
                }
            }
        }
Пример #2
0
 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;
             }
         }
     }
 }
Пример #3
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();
        }
Пример #4
0
        public void calculateExcessTubeOuterSurfaceArea(Bed bed)
        {
            int r = numOfRNodes_fluid + numOfRNodes_tubeWall;

            excessTubeOuterSurfaceArea = 2 * Math.PI * r * deltaR * bed.numOfZNodes_excessTube * deltaZ;
        }
Пример #5
0
        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;
                    }
                }
            }
        }
Пример #6
0
        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();
        }
Пример #7
0
        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;
                }
            }
        }