///// <summary>
            ///// Преобразование входных для расчета значений в структуры, пригодные для производства расчетов
            ///// </summary>
            ///// <param name="pAlg">Объект - словарь структур для расчета</param>
            ///// <param name="tablePar">Таблица с параметрами</param>
            ///// <param name="tableVal">Таблица со значениями</param>
            //protected int initValues(P_ALG pAlg, DataTable tablePar, DataTable tableVal)
            //{
            //    int iRes = 0; //Предположение, что ошибки нет

            //    DataRow[] rVal = null;
            //    int idPut = -1
            //        , idComponent = -1;
            //    string strNAlg = string.Empty;

            //    pAlg.Clear();

            //    // цикл по всем параметрам расчета
            //    foreach (DataRow rPar in tablePar.Rows)
            //    {
            //        // найти соответствие параметра в алгоритме расчета и значения для него
            //        idPut = (int)rPar[@"ID"];
            //        // идентификатор параметра в алгоритме расчета - ключ для словаря с его характеристиками
            //        strNAlg = ((string)rPar[@"N_ALG"]).Trim();
            //        rVal = tableVal.Select(@"ID_PUT=" + idPut);
            //        // проверить успешность нахождения соответствия
            //        if (rVal.Length == 1)
            //        {
            //            if (pAlg.ContainsKey(strNAlg) == false)
            //            {// добавить параметр в алгоритме расчета
            //                pAlg.Add(strNAlg, new P_ALG.P_PUT());

            //                pAlg[strNAlg].m_avg = (AGREGATE_ACTION)(Int16)rPar[@"AVG"];
            //                pAlg[strNAlg].m_bDeny = false;
            //            }
            //            else
            //                ;
            //            // идентификатор компонента станции - ключ для словаря со значением и характеристиками для него
            //            idComponent = (int)rPar[@"ID_COMP"];

            //            if (pAlg[strNAlg].ContainsKey(idComponent) == false)
            //                pAlg[strNAlg].Add(idComponent, new P_ALG.P_PUT.P_VAL()
            //            // добавить параметр компонента в алгоритме расчета
            //                {
            //                    m_iId = idPut
            //                    //, m_iIdComponent = idComponent
            //                    , m_bDeny = false
            //                    , value = (float)(double)rVal[0][@"VALUE"]
            //                    , m_sQuality = ID_QUALITY_VALUE.DEFAULT // не рассчитывался
            //                    , m_idRatio = (int)rPar[@"ID_RATIO"]
            //                    , m_fMinValue = (rPar[@"MINVALUE"] is DBNull) ? 0 : (float)rPar[@"MINVALUE"] //??? - ошибка д.б. float
            //                    , m_fMaxValue = (rPar[@"MAXVALUE"] is DBNull) ? 0 : (float)rPar[@"MAXVALUE"] //??? - ошибка д.б. float
            //                });
            //            else
            //                ;
            //        } else {// ошибка - не найдено соответствие параметр-значение
            //            iRes = -1;

            //            Logging.Logg().Error(@"TaskCalculate::initValues (ID_PUT=" + idPut + @") - не найдено соответствие параметра и значения...", Logging.INDEX_MESSAGE.NOT_SET);
            //        }
            //    }

            //    return iRes;
            //}

            protected void validateKeyPValue(P_ALG.P_PUT pPut, P_ALG.KEY_P_VALUE keyGroupPValue)
            {
                P_ALG.P_PUT.P_VALUE emptyPValue
                , templatePValue;
                P_ALG.KEY_P_VALUE keyEmptyPValue;

                keyEmptyPValue.Stamp = DateTime.MinValue;

                // сформировать ключ с датой "по умолчанию"
                keyEmptyPValue.Id = keyGroupPValue.Id;
                // попробовать найти элемент с датой "по умолчанию"
                if (pPut.ContainsKey(keyEmptyPValue) == true)
                {
                    // сохранить значение перед удалением элемента с датой "по умолчанию"
                    emptyPValue = pPut[keyEmptyPValue];
                    // удалить элемент с датой "по умолчанию"
                    pPut.Remove(keyEmptyPValue);
                    // добавить элемент с новым ключом и старым значением
                    pPut.Add(keyGroupPValue, emptyPValue);
                }
                else if (pPut.ContainsKey(keyGroupPValue) == false)
                {
                    templatePValue = pPut.FirstOrDefault(put => { return(put.Key.Id == keyGroupPValue.Id); }).Value;

                    if (templatePValue.m_iId > 0)
                    {
                        pPut.Add(
                            keyGroupPValue
                            , new P_ALG.P_PUT.P_VALUE()
                        {
                            m_iId         = templatePValue.m_iId
                            , m_bDeny     = templatePValue.m_bDeny
                            , m_idRatio   = templatePValue.m_idRatio
                            , m_sQuality  = ID_QUALITY_VALUE.NOT_REC
                            , value       = 0F
                            , m_fMinValue = templatePValue.m_fMinValue
                            , m_fMaxValue = templatePValue.m_fMaxValue
                        }
                            );
                    }
                    else
                    {
                        ;
                    }
                }
                else
                {
                    ;
                }
            }
            private float calculateOut(string nAlg, DateTime stamp)
            {
                float fRes = 0F,
                      fTmp = -1F;//промежуточная велечина
                float sum  = 0,
                      sum1 = 0;

                P_ALG.KEY_P_VALUE keyStationPValue
                , keyPValue;
                int i = -1;

                keyStationPValue = new P_ALG.KEY_P_VALUE()
                {
                    Id = ST, Stamp = stamp
                };

                switch (nAlg)
                {
                    #region 1.1
                case @"1.1":     //Удельный объем
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue = new P_ALG.KEY_P_VALUE()
                        {
                            Id = ID_COMP[i], Stamp = stamp
                        };

                        double temp = 9.771 * Math.Pow(10, -4) + 1.774 * Math.Pow(10, -5) * In["1.2"][keyPValue].value / 100
                                      + 2.52 * Math.Pow(10, -5) * Math.Pow((In["1.2"][keyPValue].value / 100), 2) + 2.96 * Math.Pow(10, -6) * Math.Pow((In["1.2"][keyPValue].value / 100 - 1.5), 3) * In["1.2"][keyPValue].value / 100
                                      + (3.225 * Math.Pow(10, -6) + 1.3436 * Math.Pow(10, -6) * In["1.2"][keyPValue].value / 100 + 1.684 * Math.Pow(10, -8) * Math.Pow((In["1.2"][keyPValue].value / 100), 6)
                                         + 1.432 * Math.Pow(10, -7) * Math.Pow((1 / (In["1.2"][keyPValue].value / 100 + 0.5)), 3)) * ((50 - In["1.4"][keyPValue].value * 0.0980665) / 10)
                                      + (3.7 * Math.Pow(10, -8) + 3.588 * Math.Pow(10, -8) * Math.Pow((In["1.2"][keyPValue].value / 100), 3) - 4.05 * Math.Pow(10, -13) * Math.Pow((In["1.2"][keyPValue].value / 100), 9)) * Math.Pow(((50 - In["1.4"][keyPValue].value * 0.0980665) / 10), 2) +
                                      +1.1766 * Math.Pow(10, -13) * Math.Pow((In["1.2"][keyPValue].value / 100), 12) * Math.Pow(((50 - In["1.4"][keyPValue].value * 0.0980665) / 10), 4);

                        Out[nAlg][keyPValue].value = (float)temp /* 10000*/;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    }
                    break;
                    #endregion

                    #region 1.2
                case @"1.2":     //Расход сетевой воды с поправкой
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue = new P_ALG.KEY_P_VALUE()
                        {
                            Id = ID_COMP[i], Stamp = stamp
                        };

                        double temp = In["1.1"][keyPValue].value;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    break;
                    #endregion

                    #region 1.3
                case @"1.3":     //Энтальпия пр
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue = new P_ALG.KEY_P_VALUE()
                        {
                            Id = ID_COMP[i], Stamp = stamp
                        };

                        double p    = In["1.4"][keyPValue].value;
                        double t    = In["1.2"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    }
                    break;
                    #endregion

                    #region 1.4
                case @"1.4":     //Энтальпия обр
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["1.4"][keyPValue].value; //Индекс обратного давления
                        double t    = In["1.2"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = 0 /*(float)str*/;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    }
                    break;
                    #endregion

                    #region 1.5
                case @"1.5":     //Тепло по блокам
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = (In["1.1"][keyPValue].value * (Out["1.3"][keyPValue].value - In["5.2"][keyStationPValue].value)) / 1000;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    break;
                    #endregion

                    #region 2.1
                case @"2.1":     //Энтальпия пр вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["2.5"][keyPValue].value;
                        double t    = In["2.3"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    }
                    break;
                    #endregion

                    #region 2.2
                case @"2.2":     //Энтальпия обр вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["2.6"][keyPValue].value;
                        double t    = In["2.4"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    }
                    break;
                    #endregion

                    #region 2.3
                case @"2.3":     //Q БД вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = In["7.1"][keyPValue].value;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    break;
                    #endregion

                    #region 2.4
                case @"2.4":     //Q расч вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = (In["2.1"][keyPValue].value * (Out["2.1"][keyPValue].value - In["5.2"][keyStationPValue].value)) / 1000;

                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    break;
                    #endregion

                    #region 3.1
                case @"3.1":     //Тепло с подпиткой сумма суммы тепла по блокам и тепла с подпиткой теплосети
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double temp = 0;
                        if (Out["3.2"][keyPValue].value == 0)
                        {
                            calculateOut("3.2", stamp);
                        }
                        Out[nAlg][keyPValue].value = (In["3.1"][keyPValue].value * (Out["3.2"][keyPValue].value - In["5.2"][keyStationPValue].value)) / 1000;

                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 3.2
                case @"3.2":     //Энтальпия тепла
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["2.6"][keyPValue].value;
                        double t    = In["2.4"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 3.3
                case @"3.3":     //Тепло по блокам с подпиткой
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double temp = 0;
                        Out[nAlg][keyPValue].value = Out["1.5"][keyStationPValue].value + Out["3.1"][keyPValue].value;

                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 4.1
                case @"4.1":     //Q БД тс
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = Out["2.3"][keyStationPValue].value;
                        fRes += Out[nAlg][keyPValue].value;
                    }
                    nAlg = "4.3";
                    fRes = 0;
                    goto entalp;    //????
                    break;
                    #endregion

                    #region 4.2
                case @"4.2":     //Q расч тс
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double temp = 0;
                        Out[nAlg][keyPValue].value = (In["4.1"][keyPValue].value * (Out["4.3"][keyPValue].value - In["5.2"][keyStationPValue].value)) / 1000;

                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 4.3
                case @"4.3": //Энтальпия тс
entalp:                      //????
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["4.4"][keyPValue].value;
                        double t    = In["4.2"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 5.1
                case @"5.1":     //Тепло вывода F1
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = Out["2.4"][keyStationPValue].value;
                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 5.2
                case @"5.2":     //Тепло вывода F2
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        fRes += In["2.1"][keyPValue].value * Out["2.1"][keyPValue].value - In["2.2"][keyPValue].value * Out["2.2"][keyPValue].value;
                    }

                    Out[nAlg][keyStationPValue].value = fRes / 1000;
                    break;
                    #endregion

                    #region 5.3
                case @"5.3":     //Небаланс
                    for (i = (int)INDX_COMP.iST; i < (int)INDX_COMP.COUNT; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double temp = 0;
                        Out[nAlg][keyPValue].value = (In["2.1"][keyStationPValue].value - In["2.2"][keyStationPValue].value - In["4.1"][keyStationPValue].value) / In["2.1"][keyStationPValue].value * 100;
                        fRes += Out[nAlg][keyPValue].value;
                    }
                    break;
                    #endregion

                    #region 6.1
                case @"6.1":     //Q бд
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double temp = 0;
                        Out[nAlg][keyPValue].value = In["7.1"][keyPValue].value;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    nAlg = "6.3";
                    fRes = 0;
                    goto entpr;
                    break;
                    #endregion

                    #region 6.2
                case @"6.2":     //Q расч
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        Out[nAlg][keyPValue].value = (In["6.1"][keyPValue].value * (Out["6.3"][keyPValue].value - In["5.2"][keyStationPValue].value)) / 1000;

                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes;
                    }
                    break;
                    #endregion

                    #region 6.3
                case @"6.3":     //Энтальпия пр
entpr:
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["6.5"][keyPValue].value;
                        double t    = In["6.3"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iST - (int)INDX_COMP.iPP2);
                    }
                    nAlg = "6.4";
                    fRes = 0;
                    goto entob;
                    break;
                    #endregion

                    #region 6.4
                case @"6.4":     //Энтальпия обр
entob:
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        double p    = In["6.6"][keyPValue].value; //Индекс обратного давления
                        double t    = In["6.4"][keyPValue].value;
                        double temp = (49.4 + 402.5 * t / 100 + 4.767 * Math.Pow((t / 100), 2) +
                                       0.0333 * Math.Pow((t / 100), 6) +
                                       (-9.25 + 1.67 * t / 100 + 7.36 * Math.Pow(10, -3) * Math.Pow((t / 100), 6) -
                                        0.008 * Math.Pow((1 / (t / 100 + 0.5)), 5)) * ((50 - p * 0.0980665) / 10) +
                                       (-0.073 + 0.079 * t / 100 + 6.8 * Math.Pow(10, -4) * Math.Pow((t / 100), 6)) * Math.Pow(((50 - p * 0.0980665) / 10), 2) +
                                       3.39 * Math.Pow(10, -8) * Math.Pow((1 / 100), 12) * Math.Pow(((50 - p * 0.0980665) / 10), 4)) / 4.1868;

                        Out[nAlg][keyPValue].value = (float)temp;
                        fRes += Out[nAlg][keyPValue].value;
                        Out[nAlg][keyStationPValue].value = fRes / ((int)INDX_COMP.iST - (int)INDX_COMP.iPP2);
                    }
                    break;
                    #endregion

                default:
                    Logging.Logg().Error(@"TaskTepCalculate::calculateMaket (N_ALG=" + nAlg + @") - неизвестный параметр...", Logging.INDEX_MESSAGE.NOT_SET);
                    break;
                }
                return(fRes);
            }
            private float calculateIn(string nAlg, DateTime stamp)
            {
                float fRes = 0F,
                      fTmp = -1F;//промежуточная велечина
                float sum  = 0,
                      sum1 = 0;
                int i      = -1;

                P_ALG.KEY_P_VALUE keyStationPValue
                , keyPValue;
                double temp = 0;

                keyStationPValue = new P_ALG.KEY_P_VALUE()
                {
                    Id = ST, Stamp = stamp
                };

                switch (nAlg)
                {
                    #region 1.1
                case @"1.1":     //Удельный объем
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In["1.1"][keyPValue].value;
                    }

                    In[nAlg][keyStationPValue].value = (float)temp;
                    keyPValue.Id = ID_COMP[i - 1]; keyPValue.Stamp = stamp;
                    fRes        += In["1.1"][keyPValue].value;
                    break;
                    #endregion

                    #region 1.2
                case @"1.2":     //Расход сетевой воды с поправкой
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In["1.2"][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In["1.2"][keyStationPValue].value;
                    break;
                    #endregion

                    #region 1.3
                case @"1.3":     //Энтальпия пр
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In["1.3"][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In["1.3"][keyStationPValue].value;
                    break;
                    #endregion

                    #region 1.4
                case @"1.4":     //Энтальпия обр
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        In["1.4"][keyPValue].value = In["1.4"][keyPValue].value /* * (float)10.197*/;
                        temp = temp + In["1.4"][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In["1.4"][keyStationPValue].value;
                    break;
                    #endregion

                    #region 1.5
                case @"1.5":     //Тепло по блокам
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In["1.5"][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iOP1 - (int)INDX_COMP.iBL1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In["1.5"][keyStationPValue].value;
                    break;
                    #endregion

                    #region 2.1
                case @"2.1":     //Энтальпия пр вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }

                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 2.2
                case @"2.2":     //Энтальпия обр вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }

                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    break;
                    #endregion

                    #region 2.3
                case @"2.3":     //Q БД вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 2.4
                case @"2.4":     //Q расч вывод
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 2.5
                case @"2.5":
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        In[nAlg][keyPValue].value = In[nAlg][keyPValue].value * (float)10.197;
                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 2.6
                case @"2.6":
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        In[nAlg][keyPValue].value = In[nAlg][keyPValue].value * (float)10.197;
                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 3.3
                case @"3.3":     //T циркулир. воды ТС по блокам
                    int col = 0;
                    for (i = (int)INDX_COMP.iBL1; i < (int)INDX_COMP.iOP1; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In["1.3"][keyPValue].value;
                        col++;
                    }
                    In[nAlg][keyStationPValue].value = (float)(temp / col);
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 3.4
                case @"3.4":

                    In[nAlg][keyStationPValue].value = In[nAlg][keyStationPValue].value /** (float)10.197*/;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 4.3
                case @"4.3":     //T обратной воды ТС по выводам
                    double temp_vzves = 0;
                    for (i = (int)INDX_COMP.iOP1; i < (int)INDX_COMP.iPP2; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp       = temp + In["2.2"][keyPValue].value;
                        temp_vzves = temp_vzves + (In["2.2"][keyPValue].value * In["2.4"][keyPValue].value);
                    }
                    In[nAlg][keyStationPValue].value = (float)(temp_vzves / temp);
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 4.4
                case @"4.4":
                    In[nAlg][keyStationPValue].value = In[nAlg][keyStationPValue].value * (float)10.197;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 5.1
                    //case @"5.1":

                    //    In[nAlg][keyStationPValue].value = In[nAlg][keyStationPValue].value * (float)10.197;
                    //    fRes += In[nAlg][keyStationPValue].value;
                    //    break;
                    #endregion

                    #region 6.1
                case @"6.1":     //Энтальпия пр вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }

                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 6.2
                case @"6.2":     //Энтальпия обр вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }

                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    break;
                    #endregion

                    #region 6.3
                case @"6.3":     //Q БД вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 6.4
                case @"6.4":     //Q расч вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 6.5
                case @"6.5":     //Q расч вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        In[nAlg][keyPValue].value = In[nAlg][keyPValue].value * (float)10.197;
                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                    #region 6.6
                case @"6.6":     //Q расч вывод
                    for (i = (int)INDX_COMP.iPP2; i < (int)INDX_COMP.iST; i++)
                    {
                        keyPValue.Id = ID_COMP[i]; keyPValue.Stamp = stamp;

                        In[nAlg][keyPValue].value = In[nAlg][keyPValue].value * (float)10.197;
                        temp = temp + In[nAlg][keyPValue].value;
                    }
                    temp = temp / ((int)INDX_COMP.iPP2 - (int)INDX_COMP.iOP1);
                    In[nAlg][keyStationPValue].value = (float)temp;
                    fRes += In[nAlg][keyStationPValue].value;
                    break;
                    #endregion

                default:
                    break;
                }
                return(fRes);
            }
            protected int initValues(P_ALG pAlg
                                     , IEnumerable <HandlerDbTaskCalculate.NALG_PARAMETER> listNAlg
                                     , IEnumerable <HandlerDbTaskCalculate.PUT_PARAMETER> listPutPar
                                     , IEnumerable <VALUE> values)
            {
                int iRes = 0;

                NALG_PARAMETER      nAlg;
                IEnumerable <VALUE> putValues;

                //VALUE value;
                P_ALG.KEY_P_VALUE keyPValue;

                foreach (PUT_PARAMETER putPar in listPutPar)
                {
                    if (putPar.IsNaN == false)
                    {
                        nAlg      = listNAlg.FirstOrDefault(item => { return(item.m_Id == putPar.m_idNAlg); });
                        putValues = values.Where(item => { return(item.m_IdPut == putPar.m_Id); });

                        if (!(nAlg == null))
                        {
                            if (!(nAlg.m_Id < 0))
                            {
                                foreach (VALUE value in putValues)
                                {
                                    if ((value.m_IdPut > 0)
                                        /*&& (((value.stamp_value.Equals(DateTime.MinValue) == false)))*/)
                                    {
                                        if (pAlg.ContainsKey(nAlg.m_nAlg) == false)
                                        {
                                            pAlg.Add(nAlg.m_nAlg, new P_ALG.P_PUT(nAlg.m_Id, !nAlg.m_bEnabled, nAlg.m_sAverage));
                                        }
                                        else
                                        {
                                            ;
                                        }

                                        keyPValue = new P_ALG.KEY_P_VALUE()
                                        {
                                            Id = putPar.IdComponent, Stamp = value.stamp_value
                                        };

                                        if (pAlg[nAlg.m_nAlg].ContainsKey(keyPValue) == false)
                                        {
                                            pAlg[nAlg.m_nAlg].Add(keyPValue
                                                                  , new P_ALG.P_PUT.P_VALUE()
                                            {
                                                m_iId         = putPar.m_Id
                                                , m_bDeny     = !putPar.IsEnabled
                                                , m_idRatio   = putPar.m_prjRatio
                                                , m_sQuality  = (value.stamp_value.Equals(DateTime.MinValue) == false) ? value.m_iQuality : ID_QUALITY_VALUE.NOT_REC
                                                , value       = (value.stamp_value.Equals(DateTime.MinValue) == false) ? value.value : 0F
                                                , m_fMinValue = putPar.m_fltMinValue
                                                , m_fMaxValue = putPar.m_fltMaxValue
                                            });
                                        }
                                        else
                                        {
                                            // для параметра 1-го порядка уже содержится значение параметра 2-го порядка
                                            ;
                                        }
                                    }
                                    else
                                    {
                                        // некорректный параметр расчета 2-го порядка
                                        ;
                                    }
                                }
                            }
                            else
                            {
                                // не найден либо параметр 1-го порядка, либо значение для параметра 2-го порядка
                                ;
                            }
                        }
                        else
                        {
                            // не найден параметр 1-го порядка (не ошибка - возможно putPar для другого типа расчета)
                            ;
                        }
                    }
                    else
                    {
                        // параметр 2-го порядка не достоверен
                        ;
                    }
                }

                return(iRes);
            }