public Model(Protocol prt, double pCCH, double pCFeH, double pCMnH, double pCSiH, double pCOH, double pCFeOH, double pCMnOH, double pCSiO2H, double pCCaOH)
 {
     _calc = new Calculation();
     _cur = new Currents();
     _cur.CC = pCCH;
     _cur.CMn = pCMnH;
     _cur.CSi = pCSiH;
     _cur.CO = pCOH;
     _cur.CFeO = pCFeOH;
     _cur.CMnO = pCMnOH;
     _cur.CSiO2 = pCSiO2H;
     _cur.CCaO = pCCaOH;
     _cur.mC = _cur.CC * prt.mStH / 100;
     _cur.mFe = pCFeH * prt.mStH / 100;
     _cur.mMn = _cur.CMn * prt.mStH / 100;
     _cur.mSi = _cur.CSi * prt.mStH / 100;
     _cur.mO = _cur.CO * prt.mStH / 100;
     _cur.mFeO = _cur.CFeO * prt.mSlH / 100;
     _cur.mMnO = _cur.CMnO * prt.mSlH / 100;
     _cur.mSiO2 = _cur.CSiO2 * prt.mSlH / 100;
     _cur.mCaO = _cur.CCaO * prt.mSlH / 100;
     _cur.mSt = prt.mStH;
     _cur.mSl = prt.mSlH;
     _cur.Tav = prt.TH;
     _cur.EScrS = prt.WCh1SP;
     _cur.ECPh = _calc.ECPh_0(prt);
     _cur.mStL = 0;
     _cur.mStLPrev = 0;
 }
 /// <summary>
 /// Масса металла в печи,кг
 /// mSt(i)=mSt(0)+mC(i)+mMn(i)+mSi(i)+mO(i)+mFe(i)
 /// Масса металла в печи перед началом плавки,кг
 /// mSt(0)=mStH
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double mSt(Protocol prt, Currents cur)
 {
     return prt.mStH + cur.mC + cur.mMn + cur.mSi + cur.mO + cur.mFe;
 }
 /// <summary>
 /// Изменение энергии Гиббса реакции растворения кислорода в металле, Дж/моль
 /// GOxO(i)=-R*Tav(i)*ln(KeOxO(i)/KfOxO(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double GOxO(Currents cur)
 {
     return -Constants.R * cur.Tav * Math.Log(KeOxO(cur) / KfOxO(cur));
 }
 /// <summary>
 /// Коэффициент активности марганца в металле
 /// fMn(i)=10^()
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double fMn(Currents cur)
 {
     return Math.Pow(10,
                     Constants.eMnC*cur.CC + Constants.eMnMn*cur.CMn + Constants.eMnSi*cur.CSi +
                     Constants.eMnO*cur.CO);
 }
 /// <summary>
 /// Коэффициент активности кремния в металле
 /// fSi(i)=10^(eSiC(i)*CC(i)+eSiMn*CMn(i)+eSiSi(i)*Csi(i)+eSiO*CO(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double fSi(Currents cur)
 {
     return Math.Pow(10, eSiC(cur)*cur.CC + Constants.eSiMn*cur.CMn + eSiSi(cur)*cur.CSi + Constants.eSiO*cur.CO);
 }
 /// <summary>
 /// Параметр взаимодействия O по O
 /// eOO(i)=-1750/Tav(i)+0,734
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double eOO(Currents cur)
 {
     return -1750 / cur.Tav + 0.734;
 }
 /// <summary>
 /// Параметр взаимодействия Si по Si
 /// eSiSi(i)=-34,5/Tav(i)+0,089
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double eSiSi(Currents cur)
 {
     return -34.5 / cur.Tav + 0.089;
 }
 /// <summary>
 /// Активность марганца в металле
 /// aMn(i)=fMn(i)*CMn(i)
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aMn(Currents cur)
 {
     return fMn(cur) * cur.CMn;
 }
 /// <summary>
 /// Концентрация MnO в шлаке, % масс
 /// CMnO(i)=mMnO(i)/mSl(i)*100
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double CMnO(Protocol prt, Currents cur)
 {
     return cur.mMnO / cur.mSl * 100;
 }
 /// <summary>
 /// Активность углерода в металле
 /// aC(i)=fC(i)*CC(i)
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aC(Currents cur)
 {
     return fC(cur) * cur.CC;
 }
 /// <summary>
 /// Активность FeO в шлаке
 /// aFeO(i)=xFe(i)*xO
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aFeO(Currents cur)
 {
     return xFe(cur) * Constants.xO;
 }
 /// <summary>
 ///	Физическое тепло завалки, МДж
 /// WCh1=mCh1*cStS*TScr(i)
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 ///<returns></returns>
 public double WCh1(Protocol prt, Currents cur)
 {
     return prt.mCh1 * Constants.cStS * TScr(prt, cur);
 }
 /// <summary>
 /// Средняя температура системы металл-шлак, К
 /// при средней температуре металла менее температуры ликвидус
 /// при ECPh(i)-cSl*Tav(i-1)*mSl(i) меньше или = (EStL*mSt(i)-lmbdSt*mSt(i))
 /// Tav(i)=(ECPh(i)+cStS*mSt(i)*Tenv(i))/(cStS*mSt(i)+cSl*mSl(i))
 /// при средней температуре металла равной температуре ликвидус
 /// при ECPh(i)-cSl*Tav(i)*mSl(i) меньше или = EStL*mSt(i)
 /// Tav(i)=TStL	
 /// при средней температуре металла более температуры ликвидус
 /// в остальных случаях: 
 /// Tav(i)=(ECPh(i)-mSt(i)*(cStS*TStL-cStS*Tenv(i)-cStL*TStL+lmbdSt))/(cStL*mSt(i)+cSl*mSl(i))
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double Tav(Protocol prt, Currents cur)
 {
     var ttemp1 = cur.ECPh - Constants.cSl * cur.Tav * cur.mSt;
     var ttemp2 = (Constants.EStL * cur.mSt - Constants.lmbdSt * cur.mSt);
     var ttemp3 = Constants.EStL * cur.mSt;
        if (ttemp1 <= ttemp2)
        {
        return (cur.ECPh + Constants.cStS * cur.mSt * prt.Tenv) /
               (Constants.cStS * cur.mSt + Constants.cSl * cur.mSl);
        }
        if (ttemp1 <= ttemp3)
        {
       return Constants.TStL;
        }
        return (cur.ECPh - cur.mSt *
             (Constants.cStS*Constants.TStL - Constants.cStS*prt.Tenv - Constants.cStL*Constants.TStL +
              Constants.lmbdSt)) / (Constants.cStL * cur.mSt + Constants.cSl * cur.mSl);
 }
 /// <summary>
 /// Масса жидкой ванны в печи, кг
 /// при Tav(i)>TStL:   mStL(i)=mSt(i)	
 /// при Tav(i)>TStL:   mStL(i)=(ECPh(i)-cSl*mSl(i)*Tav(i))/EStL	
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double mStL(Currents cur)
 {
     return cur.Tav > Constants.TStL ? cur.mSt : (cur.ECPh - Constants.cSl * cur.mSl * cur.Tav) / Constants.EStL;
 }
 /// <summary>
 /// Параметр взаимодействия C по С
 /// eCC(i)=158/Tav(i)+0,0581
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double eCC(Currents cur)
 {
     return 158 / cur.Tav + 0.0581;
 }
 /// <summary>
 /// Активность MnO в шлаке
 /// aMnO(i)=xMn(i)*xO
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aMnO(Currents cur)
 {
     return xMn(cur) * Constants.xO;
 }
 /// <summary>
 /// Параметр взаимодействия C по Si
 /// eCSi(i)=162/Tav(i)+0,008
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double eCSi(Currents cur)
 {
     return 162 / cur.Tav + 0.008;
 }
 /// <summary>
 /// Активность кислорода в металле
 /// aO(i)=fO(i)*CO(i)
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aO(Currents cur)
 {
     return fO(cur) * cur.CO;
 }
 /// <summary>
 /// Параметр взаимодействия Si по С
 /// eSiC(i)=380/Tav(i)-0,023
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double eSiC(Currents cur)
 {
     return 380 / cur.Tav - 0.023;
 }
 /// <summary>
 /// Активность кремния в металле
 /// aSi(i)=fSi(i)*CSi(i)
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aSi(Currents cur)
 {
     return fSi(cur) * cur.CSi;
 }
 /// <summary>
 /// Коэффициент активности углерода в металле
 /// fC(i)=10^(eCC(i)*CC(i)+eCMn*CMn(i)+eCSi(i)*Csi(i)+eCO*CO(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double fC(Currents cur)
 {
     return Math.Pow(10, eCC(cur)*cur.CC + Constants.eCMn*cur.CMn + eCSi(cur)*cur.CSi + Constants.eCO*cur.CO);
 }
 /// <summary>
 /// Активность SiO2 в шлаке
 /// aSiO2(i)=xSi(i)*xO
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double aSiO2(Currents cur)
 {
     return xSi(cur) * Constants.xO;
 }
 /// <summary>
 /// Коэффициент активности кислорода в металле
 /// fO(i)=10^(eOC*CC(i)+eOMn*CMn(i)+eOSi*CSi(i)+eOO(i)*CO(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double fO( Currents cur)
 {
     return Math.Pow(10, Constants.eOC*cur.CC + Constants.eOMn*cur.CMn + Constants.eOSi*cur.CSi + eOO(cur)*cur.CO);
 }
 /// <summary>
 /// Коэффициент распределения кислорода на окисление кремния
 /// DOxSi(i)=GOxSiO2(i)/(GOxFeO(i)+GOxCO(i)+GOxMnO(i)+GOxSiO2(i)+GOxO(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double DOxSi(Currents cur)
 {
     return GOxSiO2(cur) / (GOxFeO(cur) + GOxCO(cur) + GOxMnO(cur) + GOxSiO2(cur) + GOxO(cur));
 }
 /// <summary>
 ///	Расход кокса, кг
 /// CnsCk(i)=CnsCk(i-1)+mCk(i)*dt
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double CnsCk(Protocol prt, Currents cur)
 {
     return cur.CnsCk + mCk(prt) * prt.dt;
 }
 /// <summary>
 ///	Суммарный расход природного газа, м3
 /// CnsCH4(i)=CnsCH4(i-1)+(UCH4B(i)+UCH4RB(i))*dt/3600
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double CnsCH4(Protocol prt, Currents cur)
 {
     return cur.CnsCH4 + (prt.UCH4B + prt.UCH4RB) * prt.dt / 3600;
 }
 /// <summary>
 /// Изменение энергии Гиббса реакции восстановления SiO2 из шлака при вдувании порошка углерода, Дж/моль
 /// GRedSiO2(i)=-R*Tav(i)*ln(KeRedSiO2(i)/KfRedSiO2(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double GRedSiO2(Currents cur)
 {
     return -Constants.R * cur.Tav * Math.Log(KeRedSiO2(cur) / KfRedSiO2(cur));
 }
 /// <summary>
 /// Коэффициент расходования порошка углерода на восстановление SiO2 из шлака
 /// DRedSiO2(i)=GRedSiO2(i)/(GRedFeO(i)+GRedMnO(i)+GRedSiO2(i)+GRedC(i))
 /// </summary>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 private static double DRedSiO2(Currents cur)
 {
     return GRedSiO2(cur) / (GRedFeO(cur) + GRedMnO(cur) + GRedSiO2(cur) + GRedC(cur));
 }
 private void FilldvgMailParams(Currents res)
 {
     var row = _dtProtocol.Rows[_rowNum];
     dgvMainParams.Rows.Add(new[] { row[1].ToString(), row[2].ToString(), res.CnsEE.ToString(), res.CnsO2L.ToString(), res.CnsO2B.ToString(),
         res.CnsCH4.ToString(), res.CnsScr.ToString(), res.CnsHI.ToString(), res.CnsCP.ToString(), res.CnsLm.ToString(), res.CnsDlmt.ToString(),
         res.CnsCk.ToString(), res.mSt.ToString(), res.CC.ToString(), res.CSi.ToString(), res.CMn.ToString(), res.CO.ToString(), res.mSl.ToString(),
         res.CCaO.ToString(), res.CSiO2.ToString(), res.CMnO.ToString(), res.CFeO.ToString(), res.Tav.ToString() });
 }
 /// <summary>
 /// Концентрация марганца в металле, % масс
 /// CMn(i)=mMn(i)/mSt(i)*100
 /// </summary>
 /// <param name="prt">Протокол плавки</param>
 /// <param name="cur">Текущие значения параметров</param>
 /// <returns></returns>
 public double CMn(Protocol prt, Currents cur)
 {
     return cur.mMn / cur.mSt * 100;
 }