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
        
        