четверг, 9 марта 2017 г.

Среднее давление и средняя температура газа. Коэффициент теплопередачи


Заметка имеет косвенное отношение к продувке оборудования газотранспортной системы, но не только к этой технологической операции, поэтому маркировать ее как «Продувка-оборудования-номер-что-то-там» не буду.
Когда участок газопровода выводится в ремонт (то есть изолируется от действующей части газопровода), то в нем устанавливается одинаковое по всей длине давление газа и одинаковая температура. Если же газопровод открыт на проход (осуществляется транспорт газа), то давление и температура в начале участка газопровода всегда будут больше, чем в конце.
Запас газа на участке действующего газопровода рассчитывается по той же формуле, которая приведена в заметке о расчете запаса газа в локализованном газопроводе, но в качестве давления и температуры газа указываются средние значения этих параметров.
В расчете среднего давления газа нет ничего интересного:

А теперь начинается занимательное. Среднюю температуру газа на действующем участке магистрального газопровода можно рассчитать по упрощенной формуле:
Формула применима только в том случае, если температура газа в конце участка газопровода выше температуры грунта. Кроме того, в этом выражении не учитывается эффект дросселирования, то есть дополнительного снижения температуры газа в конце участка газопровода в результате снижения давления.
Более точно рассчитать температуру газа (с учетом эффекта дросселирования и в том числе для ситуаций, когда температура газа в конце трубы ниже, чем температура грунта) можно с помощью выражения:
В случае использования этой формулы расчет, как и при стравливании газа при критическом истечении, замыкается сам на себя, потому что:
Чтобы рассчитать среднюю температуру газа, необходимо знать среднюю темплоемкость газа. Для расчета средней теплоемкости газа необходимо знать среднюю температуру газа. Но не все так запущено, как кажется.
Этот нелинейный расчет можно выполнить по следующему алгоритму:
·        По упрощенной формуле рассчитать предположительное значение средней температуры газа. Если температура газа в конце трубы ниже, чем температура грунта – средней температурой считать температуру газа в конце участка газопровода;
·        Рассчитать теплоемкость газа и коэффициент теплопередачи;
·        По точной формуле рассчитать среднюю температуру газа.
Для повышения точности расчета последние два пункта следует выполнить еще раз.
В этом расчете имеется еще один подвох – в случае, если температура газа в конце участка газопровода выше, чем температура грунта, выражение для расчета коэффициента теплопередачи тупо входит в ступор (как и упрощенное выражение для расчета средней температуры газа).
 Чтобы не вводить в искушение программное обеспечение, которое не воспринимает шуток типа деления на ноль, можно применить следующий метод. Берем выражение для расчета температуры газа в произвольной точке газопровода:
,

и методом перебора находим такое значение коэффициента ax, которое дает наименьшее расхождение с известным значением температуры газа в конце газопровода. После этой операции пересчитываем значения коэффиицента теплопередачи (обратным решением выражения для расчета ax) и средней температуры (без извращений по точной формуле). В общем, без итерации не обойтись.
Конечно, это всего лишь один из вариантов решения проблемы отрицательной разницы конечной температуры газа и температуры грунта, наверняка имеются и более безупречные с физической и математической точек зрения алгоритмы.
Еще один необходимый для расчета промежуточный параметр – коэффициент Джоуля-Томсона:
Онлайн-расчет среднего давления и средней температуры газа можно выполнить здесь:


Листинг серверной части расчета среднего давления и средней температуры газа (PHP):
<?php
// Внимание!
// проверки на адекватность исходных данных
// выполняются на стороне клиента!
//
header('Content-Type^ text/html; charset=utf-8');
if ($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){
        if ($_POST){
               // исходные данные из приложения
               $ro = $_POST['ro'];// плотность газа абсолютная, кг/м3
               $pn  = $_POST['pn'];// избыточное давление газа в начале МГ, кгс/см2
               $pk  = $_POST['pk'];// избыточное давление газа в конце МГ, кгс/см2
               $prt  = $_POST['prt'];// атмосферное давление, мм рт.ст.
               $tn  = $_POST['tn'];// температура газа в начале МГ, по Цельсию
               $tk  = $_POST['tk'];// температура газа в конце МГ, по Цельсию
               $tgr  = $_POST['tgr'];// температура грунта, по Цельсию
               $ad  = $_POST['ad'];// наружный диаметр МГ, мм
               $al  = $_POST['al'];// длина МГ, км
               $qf  = $_POST['qf'];// транспорт газа, тыс.м3/час
               // децимальный разделитель
               $ro = str_replace(",", ".", $ro);
               $pn = str_replace(",", ".", $pn);
               $pk = str_replace(",", ".", $pk);
               $prt = str_replace(",", ".", $prt);
               $tn = str_replace(",", ".", $tn);
               $tk = str_replace(",", ".", $tk);
               $tgr = str_replace(",", ".", $tgr);
               $ad = str_replace(",", ".", $ad);
               $al = str_replace(",", ".", $al);
               $qf = str_replace(",", ".", $qf);
               // приведение размерности
               $tn = $tn+273.15;// по Кельвину
               $tk = $tk+273.15;// по Кельвину
               $tgr = $tgr+273.15;// по Кельвину
               $ad = $ad/1000;// диаметр трубы в метрах
               $al = $al*1000;// длина участка МГ в метрах
               $patm = $prt*0.001359511;// атмосферное давление в кгс/см2
               $qf = $qf/1000*24;// млн.м3/сут
               // загрузка функций
               function f_delta($ro) {
               // относительная плотность газа
               // ro - плотность газа, кг/м3
               $delta = $ro/1.2044;
               return $delta;
               }
               function f_psr($pn, $pk, $patm){
               // среднее избыточное давление на участке МГ
               // pn - начальное избыточное давление, кгс/см2
               // pk - конечное избыточное давление, кгс/см2
               $pna = $pn+$patm;
               $pka = $pk+$patm;
               $psr = 2/3*($pna+($pka*$pka)/($pna+$pka))-$patm;
               return $psr;   
               }
               function f_z($delta, $pn, $patm, $tn){
               // коэффициент сжимаемости газа
               // delta - дельта
               // pn - избыточное давление газа, кгс/см2
               // patm - атмосферное давление, кгс/см2
               // tn - температура газа, по Кельвину
               $pabs = $pn+$patm;// абсолютное давление
               $pmpa = $pabs*0.0980665;// перевод кгс/см2 в МПа
               $z = 1-((10.2*$pmpa-6)*(0.345/100*$delta-0.446/1000)+0.015)*(1.3-0.0144*($tn-283.2));
               return $z;     
               }
               function f_ax($km, $d, $l, $q, $delta, $cp){
               // множитель для определения средней температуры
               // km - коэффициент теплопроводности
               // d - внутренний диаметр, м
               // l - длина МГ, м
               // q - транспорт газа, млн.м3/сут
               // delta - относительная плотность газа
               $dmm = $d*1000;
               $lkm = $l/1000;
               $ax = 62.6*(($km*$dmm*$lkm)/($q*$delta*$cp*1e6));
               return $ax;    
               }
               function f_tsr_simple($ax, $tgr, $tn, $tk){
               // средняя температура газа, по Кельвину
               // ax - множитель для Trs
               // tgr - температура грунта, по Кельвину
               // tn - температура в начале МГ, по Кельвину
               // tk - температура в конце МГ, по Кельвину   
               if ($tgr<$tk){
               $tsr = $tgr+($tn-$tk)/log(($tn-$tgr)/($tk-$tgr));}
               else {$tsr = $tk;}
               return $tsr;
               }
               function f_tsr_full($ax, $tgr, $tn, $tk){
               // средняя температура газа, по Кельвину
               // ax - множитель для Trs
               // tgr - температура грунта, по Кельвину
               // tn - температура в начале МГ, по Кельвину
               // tk - температура в конце МГ, по Кельвину   
               $tsr = $tgr+(($tn-$tk)/$ax)*(1-exp(-$ax));
               return $tsr;
               }
               function f_cp($tsr, $psr){
               // теплоемкость газа в смешанной системе координат, кКал/кг*К
               // tsr - средняя температура, по Кельвину
               // psr - среднее давление, кгс/см2
               $cp = 0.405+4.39e-4*$tsr+46000*($psr-1)/($tsr*$tsr*$tsr);
               return $cp;    
               }
               function f_di($tsr, $cp){
               // коэффициент Джоуля-Томсона, К/(кгс/см2)
               // tsr - средняя температура, по Кельвину
               // cp - теплоемкость газа
               $di = (23000/($tsr*$tsr)-0.035)/$cp;
               return $di;    
               }
               function f_eax($tn, $tk, $tgr, $pn, $pk, $psr, $patm, $ax, $di){
               // множитель для Km
               // tn - начальная температура, по Кельвину
               // tk - конечная температура, по Кельвину
               // tgr - температура грунта, по Кельвину
               // pn - начальное избыточное давление, кгс/см2
               // pk - конечное избыточное давление, кгс/см2
               // psr - среднее абсолютное давление, кгс/см2
               // ax - множитель для Tsr
               // di - коэффициент Джоуля-Томсона
                $pnabs = $pn+$patm;
               $pkabs = $pk+$patm;
               $psrabs = $psr;
               $deltat = abs($tn);
               for ($x=1; $x<=3000; $x++){
                       $dx = ($ax/100)*$x;
                       $tcrush = $tgr+($tn-$tgr)*exp(-$dx)-$di*($pnabs*$pnabs-$pkabs*$pkabs)/(2*$dx*$psrabs)*(1-exp(-$dx));
                       if ($deltat>abs($tcrush-$tk)){
                               $eax = $dx;
                       $deltat = abs($tcrush-$tk);
                       }
               }
               return $eax;   
               }
               function f_kmdross($eax, $q, $delta, $cp, $d, $l){
               // коэффициент теплопередачи с учетом эффекта дросселирования, кКал/м2чК
               // eax - множитель для KM
               // q - транспорт газа, млн.м3/сут
               // delta - относительная плотность газа
               // cp - теплоемкость газа
               // d - диаметр МГ, м
               // l - длина МГ, м
               $dmm = $d*1000;
               $lkm = $l/1000;
               $km = ($eax*$q*$delta*$cp*1e6)/(62.6*$dmm*$lkm);
               return $km;    
               }
               // расчет
               // относительная плотность газа
               $delta = f_delta($ro);
               // среднее давление
               $psr = f_psr($pn, $pk, $patm);
               // средняя температура по упрощенной формуле
               $tsr = f_tsr_simple(1, $tgr, $tn, $tk);
               // первый цикл
               // теплоемкость газа в смешанной системе координат, кКал/кг*К
               $cp = f_cp($tsr, $psr);
               // коэффициент Джоуля-Томсона, К/(кгс/см2)
               $di = f_di($tsr, $cp);
               // множитель для средней температуры, в первом цикле km = 1
               $ax = f_ax(1, $ad, $al, $qf, $delta, $cp);
               // множитель для Km
               $eax = f_eax($tn, $tk, $tgr, $pn, $pk, $psr, $patm, $ax, $di);
               // коэффициент теплопередачи с учетом эффекта дросселирования, кКал/м2чК
               $km = f_kmdross($eax, $qf, $delta, $cp, $ad, $al);
               // множитель для средней температуры
               $ax = f_ax($km, $ad, $al, $qf, $delta, $cp);
               // средняя температура по точной формуле
               $tsr = f_tsr_full($ax, $tgr, $tn, $tk);
               // второй цикл
               // теплоемкость газа в смешанной системе координат, кКал/кг*К
               $cp = f_cp($tsr, $psr);
               // коэффициент Джоуля-Томсона, К/(кгс/см2)
               $di = f_di($tsr, $cp);
               // множитель для средней температуры
               $ax = f_ax($km, $ad, $al, $qf, $delta, $cp);
               // множитель для Km
               $eax = f_eax($tn, $tk, $tgr, $pn, $pk, $psr, $patm, $ax, $di);
               // коэффициент теплопередачи с учетом эффекта дросселирования, кКал/м2чК
               $km = f_kmdross($eax, $qf, $delta, $cp, $ad, $al);
               // множитель для средней температуры
               $ax = f_ax($km, $ad, $al, $qf, $delta, $cp);
               // средняя температура по точной формуле
               $tsr = f_tsr_full($ax, $tgr, $tn, $tk);
               // подготовка результата
               $psr = $psr-$patm;// избыточное среднее давление, кгс/см2
               $tsr = $tsr-273.15;// средняя температура, по Цельсию
               //
               $psr = number_format($psr, 2);
               $tsr = number_format($tsr, 2);
               //
               $psr = str_replace(",","",$psr);
               $psr = str_replace(".",",",$psr);
               //
               $tsr = str_replace(",","",$tsr);
               $tsr = str_replace(".",",",$tsr);
               //
               $resrt = '<p>Среднее избыточное давление газа: '.$psr.' кгс/см<sup>2</sup></p>';
               print $resrt.'<p>Средняя температура газа: '.$tsr.' по Цельсию</p>';
        }
}
?>