Exemplo n.º 1
0
        private void Solve()
        {
            if (vaporOutlet.Pressure.HasValue)
            {
                Calculate(liquidOutlet.Pressure, vaporOutlet.Pressure.Value);
            }
            else if (liquidOutlet.Pressure.HasValue)
            {
                Calculate(vaporOutlet.Pressure, liquidOutlet.Pressure.Value);
            }

            //if (vaporOutlet.Temperature.HasValue) {
            //   Calculate(liquidOutlet.Temperature, vaporOutlet.Temperature.Value);
            //}
            //else if (liquidOutlet.Temperature.HasValue) {
            //   Calculate(vaporOutlet.Temperature, liquidOutlet.Temperature.Value);
            //}

            //drying material
            if (inlet is DryingMaterialStream)
            {
                DryingMaterialStream dmsInlet        = inlet as DryingMaterialStream;
                DryingMaterialStream dmsVaporOutlet  = vaporOutlet as DryingMaterialStream;
                DryingMaterialStream dmsLiquidOutlet = liquidOutlet as DryingMaterialStream;

                if (inlet.VaporFraction.HasValue && inlet.MassFlowRate.HasValue)
                {
                    //double vaporFraction = inlet.VaporFraction.Value;
                    //double tBoilingPoint1 = inlet.GetBoilingPoint(inlet.Pressure.Value);
                    //double tBoilingPoint2 = inlet.GetBoilingPoint(vaporOutlet.Pressure.Value);
                    //double evapHeat = inlet.GetEvaporationHeat(tBoilingPoint);
                    //double cpLiquid = inlet.SpecificHeat.Value;
                    //double hBoilingPoint = cpLiquid * (tBoilingPoint - 273.15);
                    //double h = inlet.SpecificEnthalpy.Value;
                    //double vaporFraction = (h - hBoilingPoint)/evapHeat;
                    double inletSpecificEnthalpyValue = inlet.SpecificEnthalpy.Value;
                    double tBoilingPointOfSolution    = dmsInlet.GetBoilingPoint(inlet.Pressure.Value);
                    double tBoilingPointOfOutlet      = dmsInlet.GetBoilingPoint(vaporOutlet.Pressure.Value);
                    double cpOfInletLiquid            = dmsInlet.GetLiquidCp(tBoilingPointOfSolution);
                    double evapHeat = dmsInlet.GetEvaporationHeat(tBoilingPointOfSolution);
                    //double hBubble = dmsInlet.GetBubblePointEnthalpy(inlet.Pressure.Value, dmsInlet.MoistureContentWetBase.Value);
                    //double h = hBubble + inlet.VaporFraction.Value * evapHeat;
                    //inletSpecificEnthalpyValue = h;

                    double vaporFractionInlet      = inlet.VaporFraction.Value;
                    double selfEvaporationFraction = cpOfInletLiquid * (tBoilingPointOfSolution - tBoilingPointOfOutlet) / evapHeat;

                    double massFlowRateInlet = inlet.MassFlowRate.Value;
                    double massFlowRateVapor = massFlowRateInlet * (vaporFractionInlet + selfEvaporationFraction);
                    double totalSolidContent = massFlowRateInlet * dmsInlet.MassConcentration.Value;
                    double massFlowRateVaporOld;
                    double massFlowRateLiquid;
                    double massConcentrationLiquidOutlet;
                    double specificEnthalpyLiquid;
                    double specificEnthalpyVapor;
                    double tBoilingPointOutlet;
                    int    counter = 0;
                    do
                    {
                        counter++;
                        massFlowRateLiquid            = massFlowRateInlet - massFlowRateVapor;
                        massConcentrationLiquidOutlet = totalSolidContent / massFlowRateLiquid;
                        specificEnthalpyLiquid        = CalculateSpecificEnthalpyLiquidOutlet(massConcentrationLiquidOutlet);
                        tBoilingPointOutlet           = CalculateBoilingPointLiquidOutlet(massConcentrationLiquidOutlet);
                        specificEnthalpyVapor         = CalculateSpecificEnthalpyVaporOutlet(tBoilingPointOutlet);
                        massFlowRateVaporOld          = massFlowRateVapor;
                        massFlowRateVapor             = massFlowRateInlet * (inletSpecificEnthalpyValue - specificEnthalpyLiquid) / (specificEnthalpyVapor - specificEnthalpyLiquid);
                    } while (Math.Abs(massFlowRateVapor - massFlowRateVaporOld) > 1.0e-6 && counter < 200);

                    if (counter == 200)
                    {
                        throw new CalculationFailedException(this.name + ": Flash tank calculation failed.");
                    }

                    Calculate(vaporOutlet.MassFlowRate, massFlowRateVapor);
                    Calculate(liquidOutlet.MassFlowRate, massFlowRateLiquid);
                    //Calculate(vaporOutlet.VaporFraction, 1.0);
                    Calculate(liquidOutlet.VaporFraction, 0.0);
                    //Calculate(liquidOutlet.Temperature, tBoilingPointOutlet);
                    Calculate(vaporOutlet.Temperature, tBoilingPointOutlet);
                    Calculate(dmsVaporOutlet.MassConcentration, 0);
                    Calculate(dmsLiquidOutlet.MassConcentration, massConcentrationLiquidOutlet);

                    //if (dmsInlet.MassConcentration.HasValue) {
                    //   double liquidConcentration = (massFlowRate * dmsInlet.MassConcentration.Value)/liquidMassFlowRate;
                    //   Calculate(dmsLiquidOutlet.MassConcentration, liquidConcentration);
                    //   Calculate(dmsVaporOutlet.MassConcentration, 0);
                    //}

                    if (dmsLiquidOutlet.MassConcentration.HasValue && dmsVaporOutlet.MassConcentration.HasValue &&
                        dmsLiquidOutlet.Pressure.HasValue)
                    {
                        solveState = SolveState.Solved;
                    }
                }
            }
        }