示例#1
0
        public Result.PPraeasureForCompartment GetMaxValues(bool tmx)
        {
            int compNo = compartments.compartment.Count();

            Result.PPraeasureForCompartment res = new Result.PPraeasureForCompartment(compNo, tmx);
            foreach (Result.PPraeasureForCompartment ppfc in result)
            {
                res.AmbientPreasure = Math.Max(res.AmbientPreasure, ppfc.AmbientPreasure);
                res.Depth           = Math.Max(res.Depth, ppfc.Depth);
                res.PreasureN2      = Math.Max(res.PreasureN2, ppfc.PreasureN2);
                if (tmx)
                {
                    res.PreasureHe = Math.Max(res.PreasureHe, ppfc.PreasureHe);
                }
                res.Time = Math.Max(res.Time, ppfc.Time);
                int count = ppfc.Count();
                for (int i = 0; i < count; i++)
                {
                    res.setN2(i, Math.Max(res.getN2(i), ppfc.getN2(i)));
                    if (tmx)
                    {
                        res.setHe(i, Math.Max(res.getHe(i), ppfc.getHe(i)));
                    }
                }
            }
            return(res);
        }
        private void compartmentChart()
        {
            double czas = (double)numericUpDownCzas.Value;

            Result.PPraeasureForCompartment ppfc = calculation.GetMaxValues(false);
            if (czas > ppfc.Time)
            {
                numericUpDownCzas.Value = (decimal)Math.Floor(ppfc.Time);
                czas = (double)numericUpDownCzas.Value;
            }
            double max   = 0;
            int    count = ppfc.Count();

            for (int i = 0; i < count; i++)
            {
                max = Math.Max(max, ppfc.getN2(i));
            }
            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea = CompartmrntAtTime.ChartAreas.First();
            chartArea.AxisY.Maximum  = max;
            chartArea.AxisY.Crossing = 0;
            ppfc = calculation.GetValusAtTime(czas, false);
            textBoxCisnienie.Text = ppfc.AmbientPreasure.ToString("0.0");
            textBoxGlebokosc.Text = ppfc.Depth.ToString("0.0");
            textBoxPPN2.Text      = ppfc.PreasureN2.ToString("0.0");
            int compartmentNo = ppfc.Count();

            CompartmrntAtTime.Series.Clear();
            CompartmrntAtTime.Series.Add("Cisnienia w tkankach. " + calculation.compartments.Description);
            System.Windows.Forms.DataVisualization.Charting.Series series = CompartmrntAtTime.Series.First();
            series.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
            for (int i = 0; i < compartmentNo; i++)
            {
                series.Points.AddY(ppfc.getN2(i));
                series.Points[i].AxisLabel = calculation.compartments.compartment[i].HalfTimeN2.ToString("0.0");
            }
        }
示例#3
0
        /// <summary>
        /// Uruchomienie obliczeń
        /// </summary>
        public void Run()
        {
            Data.ProfileData profile = calcDiving.GetProfileData();
            int compNo = compartments.compartment.Count();

            Result.PPraeasureForCompartment ppc;
            result = new List <Result.PPraeasureForCompartment>();
            double minHT = compartments.compartment.Min(s => s.HalfTimeN2);

            for (int i = 0; i < profile.Count(); i++)
            {
                //czas początku segmentu
                double iT = profile.getInitTime(i);
                //czas trwania segmentu
                double pT = profile.getTime(i);
                //przyrost ciśnienia pomiędzy początkiem i końcem segmentu
                double dP = profile.getPreasure(iT + pT, i) - profile.getPreasure(iT, i);
                //Punkt obliczeniowy minimum co 1/10 najkróteszego półokresu tkanek
                double dT = 0.1 * minHT;
                //Nie mniej niż 1/4 czasu trwania segmentu
                dT = Math.Min(dT, 0.25 * pT);
                //Obliczamy ilość kroków zaookrąglając w górę
                int step = (int)Math.Floor(pT / dT);
                //Krok nie rzadziej niż zmiana ciśnienia o 1bar
                if (dP.CompareTo(0.0) != 0)
                {
                    step = (int)Math.Max(step, Math.Floor(1.0 / dP));
                }
                //Finalny krok czasowy
                dT = pT / step;
                // Dla zadanego segmentu liczymy cisnienia w kolejnych krokach
                for (int j = 0; j < step; j++)
                {
                    // Rezulataty dla segmentu i czasu iT
                    // Miejsce na nowy zestaw wyników
                    ppc = new Result.PPraeasureForCompartment(compNo);
                    // Bieżący czas
                    ppc.Time = iT;
                    // Bieżące ciśnienie zewnętrzne
                    ppc.AmbientPreasure = profile.getPreasure(iT, i);
                    // Bieżące ciśnienie parcjalne azotu
                    ppc.PreasureN2 = profile.getPartialPreasureN2(iT, i);
                    // Bieżące ciśnienie parcjalne helu
                    if (bTmx)
                    {
                        ppc.PreasureHe = profile.getPartialPreasureHe(iT, i);
                    }
                    // Bieżąca głębokość
                    ppc.Depth = profile.getDepth(iT, i);

                    // Obliczanie nasycenia tkanki gazami obojętnymi dla każdej z tkanek, oraz minimalnego ciśnienia akceptowalnego przez tkankę
                    if (multiThread) //Wersja wielowatkowa - uruchomić po testach jednowątkowej!
                    {
                        Parallel.For(0, compNo, k =>
                        {
                            CalculationForOneStepInOneCompartment(ref k, ref dT, ref ppc);
                        }
                                     );// koniec petli wielowatkowej
                    }
                    else // Obliczenia jednowątkowe
                    {
                        for (int k = 0; k < compNo; k++)
                        {
                            CalculationForOneStepInOneCompartment(ref k, ref dT, ref ppc);
                        }
                    }// koniec petli jednowątkowej
                    result.Add(ppc);
                    iT += dT;
                }
            }
            lowerResultSerch = 0;
            upperResultSerch = (int)(0.5 * result.Count());
        }
示例#4
0
        private void CalculationForOneStepInOneCompartment(ref int compartmentNo, ref double timeStep, ref Result.PPraeasureForCompartment ppc)
        {
            double ceiling = 0;

            if (result.Count() == 0)
            {
                ppc.setN2(compartmentNo, PartialPreasure(ppc.PreasureN2, 0.79 * calcDiving.AtmosphericPressure, 0, compartments.compartment[compartmentNo].HalfTimeForN2(false)));
                if (bTmx)
                {
                    ppc.setN2(compartmentNo, PartialPreasure(ppc.PreasureHe, 0.0, 0, compartments.compartment[compartmentNo].HalfTimeForHe(false)));
                }
            }
            else
            {
                ppc.setN2(compartmentNo, PartialPreasure(ppc.PreasureN2, result.Last().getN2(compartmentNo), timeStep, compartments.compartment[compartmentNo].HalfTimeForN2(ppc.PreasureN2 < result.Last().getN2(compartmentNo))));
                if (bTmx)
                {
                    ppc.setN2(compartmentNo, PartialPreasure(ppc.PreasureHe, result.Last().getHe(compartmentNo), timeStep, compartments.compartment[compartmentNo].HalfTimeForHe(ppc.PreasureHe < result.Last().getHe(compartmentNo))));
                }
            }
            if (bTmx)
            {
                ceiling = ceiling = Ceiling(ppc.getN2(compartmentNo), compartments.compartment[compartmentNo].M0N2, compartments.compartment[compartmentNo].dMN2, ppc.getHe(compartmentNo), compartments.compartment[compartmentNo].M0He, compartments.compartment[compartmentNo].dMHe);
            }
            else
            {
                ceiling = Ceiling(ppc.getN2(compartmentNo), compartments.compartment[compartmentNo].M0N2, compartments.compartment[compartmentNo].dMN2);
            }
            ppc.setCeiling(compartmentNo, ceiling);
        }
示例#5
0
        public Result.PPraeasureForCompartment GetValusAtTime(double time, bool tmx)
        {
            int compNo = compartments.compartment.Count();

            Result.PPraeasureForCompartment res = new Result.PPraeasureForCompartment(compNo, tmx);
            if (result[upperResultSerch].Time < time)
            {
                lowerResultSerch = upperResultSerch;
                upperResultSerch = result.Count() - 1;
                if (result[upperResultSerch].Time < time)
                {
                    throw new Exception("GetValusAtTime. Invalid time, over maximum value");
                }
            }
            if (result[lowerResultSerch].Time > time)
            {
                upperResultSerch = lowerResultSerch;
                lowerResultSerch = 0;
                if (result[lowerResultSerch].Time > time)
                {
                    throw new Exception("GetValusAtTime. Invalid time, under minimum value");
                }
            }
            if (lowerResultSerch > upperResultSerch)
            {
                throw new Exception("GetValusAtTime. Invalid range");
            }
            bool notFound    = true;
            int  curentIndex = 0;

            while (notFound)
            {
                if (Math.Abs(result[lowerResultSerch].Time - time) < Double.Epsilon)
                {
                    upperResultSerch = lowerResultSerch;
                }
                else if (Math.Abs(result[upperResultSerch].Time - time) < Double.Epsilon)
                {
                    lowerResultSerch = upperResultSerch;
                }
                else
                {
                    curentIndex = (int)(0.5 * (upperResultSerch + lowerResultSerch));
                    if (result[curentIndex].Time < time)
                    {
                        lowerResultSerch = curentIndex;
                    }
                    else
                    {
                        upperResultSerch = curentIndex;
                    }
                }
                notFound = (upperResultSerch - lowerResultSerch) > 1;
            }
            if (upperResultSerch == lowerResultSerch)
            {
                res = result[upperResultSerch];
            }
            else
            {
                double delta = (time - result[lowerResultSerch].Time) / (result[upperResultSerch].Time - result[lowerResultSerch].Time);
                res.Time            = time;
                res.AmbientPreasure = result[lowerResultSerch].AmbientPreasure + delta * (result[upperResultSerch].AmbientPreasure - result[lowerResultSerch].AmbientPreasure);
                res.Depth           = result[lowerResultSerch].Depth + delta * (result[upperResultSerch].Depth - result[lowerResultSerch].Depth);
                for (int i = 0; i < compNo; i++)
                {
                    res.setN2(i, (result[lowerResultSerch].getN2(i) + delta * (result[upperResultSerch].getN2(i) - result[lowerResultSerch].getN2(i))));
                    if (tmx)
                    {
                        res.setHe(i, (result[lowerResultSerch].getHe(i) + delta * (result[upperResultSerch].getHe(i) - result[lowerResultSerch].getHe(i))));
                    }
                }
            }

            return(res);
        }