function [Pt2,Tt2,m2,Ps,Pup,Tup,mup]=sprezarka(Pt1,Tt1,m1,PIS,es,Bup,PISup)

%[Pt2,Tt2,m2,Ps]=sprezarka(Pt1,Tt1,m1,PIS,es)
% 
%Inne opcje wywołania polecenia:
%[Pt2,Tt2,m2,Ps,Pup,Tup,mup]=sprezarka(Pt1,Tt1,m1,PIS,es,Bup,PISup)
%lub
%[Pt2,Tt2,m2,Ps,Pup,Tup,mup]=sprezarka(Pt1,Tt1,m1,PIS,es)
%
%Funkcja oblicza remperaturę i ciśnienie w parmetrach spiętrzenia za
%sprężarką oraz moc sprężarki i w przypadku uwzględnienie upustów, także
%parametry upuszczanego powietrza.
%Danymi wejściowymi są ciśnienie i temperatura spiętrzenia na
%wlocie do sprężarki (Pt1, Tt1), oraz wydatek masowy powietrza na wlocie (m1)
%spręż spręzarki (PIS), sprawność sprężarki (es) opcjonalnie parametry 
%upustu Bup=[Bup1, Bup2, ..] i PISup=[PISup1, PISup2 ...], gdzie
%Bupi=mupi/m1 a PISup1=(spręż_upustu-1)/(spręż_sprężarki-1)
%WAŻNE Sprawność można
%zdefiniować jako izentropowa i politropowa. Dlatego sprawność sprężarki
%es=[sprawność, rodzaj sprawności], gdzie sprawność powinna się zawierać w
%przedziale od 0 do 1, a rodzaj sprawności powinien być definiowany jako
%0 dla sprawności izentropowej i 1 dla sprawnoości politropowej. Dla
%sprawności izentropowej wystarczające jest aby zdefinować samą
%wartość sprawności, a program domyślnie przyjmie że jest to sprawność
%izentropowa.
%Parametry wyjściowe to: Ciśnienie i temparatura całkowita na wyjściu (Pt2,
%Tt2) wydatek masowy na wyjściu m2, moc sprężarki Ps, ciśnienie upustu Pup,
%Temperatura upustu Tup, wydatek upustu mup. Parametry upustów są wektorami
%o tylu elementach ile upustów zdefiniowano.
% Gdy upust nie jest zdefiniowany, a parametry wyjściowe upustu są czytane,
% to przyjmują one wartość NaN;


%======= KOD PROGRAMU ==============

%WŁAŚCIWOŚCI GAZU
cp=1005;
k=1.4;

%PRZYPISANIE ZMIENNYCH WYJŚCIOWYCH
Pt2=NaN;
Tt2=NaN;
m2=NaN;
Ps=NaN;
Pup=NaN;
Tup=NaN;
mup=NaN;

var_added=0; % Wartość zminnej dodatkowej, dla której nie są prowadzone obliczenia
% WERYFIKACJA PARAMETRÓW UPUSTU

if exist('Bup','var')==0
    Bup=NaN;
    PISup=NaN;
    var_added=1; %Zmienndodatkowa do inicjalizowania procesu obliczeń 
else
    % OBLICZENIA DLA SPREŻARKI Z UPISTEM
    n1=length(Bup);
    % WERYFIKACJA CZY ISTNIEJE ZMIENNA PISup
    if exist('PISup','var')
        % AKCJA GDY PISup i Bup są zadane
        % WERYFIKACJA CZY długość wektora PISup==długości wektora Bup 
        if length(PISup)==n1
            % Akcja gdy PISup and Bup mają tę samą długość
            var_added=1;
        else
            disp('Length of Bup and PISup should be equal')
        end
    else
        disp('PISup and Bup is regiured to compressor bleed calculation')
    end
end

if var_added==1
            
    % WERYFIKACJA RODZAJU SPRAWNOŚCI
    if length(es)==1
        es(2)=0;
    end


    if es(2)==0
         Tt2=Tt1*(1+(PIS.^((k-1)/k)-1)/es(1));
         epol=(k-1)/k*log(PIS)/log(Tt2/Tt1);

    elseif es(2)==1
        Tt2=Tt1*PIS^((k-1)/k/es(1));
        epol=es(1);
    end

    Pt2=PIS*Pt1;   



    if isnan(Bup(1))
        % OBLICZENIA DLA SPRĘŻARKI BEZ UPUSTÓW
        Ps=cp*m1*(Tt2-Tt1);
        m2=m1;
    else
        % OBLICZENUIA DLA SPRĘŻARKI Z UPUSTAMI
        mup=Bup*m1;
        % To jest spręż do wystąpienia upustu
        Pis_up=(PIS-1)*PISup+1;
        % Ciśnienie upustu
        Pup=Pt1*Pis_up;
        mp1=m1;
        %Sztuczna modyfikacja Tup o Tt1 -  dla celów obliczeniowych 
        Tup(1)=Tt1;
        Ps=0;
        for i=1:n1
            % Tup indeksowane z numerem i+1
            Tup(i+1)=Tt1*(Pup(i)/Pt1)^((k-1)/k/epol);
            mp2=mp1-mup(i);
            Ps=mp1*cp*((Tup(i+1)-Tup(i)))+Ps;
            mp1=mp2;
        end
        % KOREKTA Tup w celu wyrzucenia Tt1
        Tup=Tup(2:n1+1);
        Ps=mp1*cp*(Tt2-Tup(n1))+Ps;
        m2=mp1;
    end
end
        
end
        
        