function [sys,x0]=roer(t,x,u,flag,D1,D2,h,l_o,l_g,blocks_o,blocks_g,p1_out,p3_out,ventiltype_g,ventiltype_o,p_ini,qinn_o,winn_g)  

% Dette er S-funksjonen roer som finner hastigheter og trykk i olje- og gassrøret.
%Beskrivelse av parametre:	D1=diameter av gassrøret		blocks_o=ant. inndelinger av oljerøret	
%									D2=diameter av oljerøret		blocks_g=ant. inndelinger av gassrøret
%									h=havdybde							p1_out=trykket i enden av gassrøret													
%									l_g=lengde på gassrøret			p3_out=trykket i enden av oljerøret	
%									l_o=lengde på oljerøret 		ventiltype_g=ventilkarakteristikk for gassventil 															
%									p_ini=initielt trykk i tanken	ventiltype_o=ventilkarakteristikk for oljeventil
%									qinn_o=volumstrøm olje inn i sep. initielt, design case. Ikke m/ forstyrrelser el.
%									winn_g=massestrøm av gass inn i sep. initielt, design case. Ikke m/forstyrrelser el.

global M z T rho_o Cv_o Cv_g Y u_oi u_gi c h_t_ini;   

R=8314;   % Gasskonstanten [J/kmol*K]
g=9.81;	 % gravitasjon  [m/s2]

switch flag
case 0
   %Beregner først de initielle betingelsene i røret
   v1_rho_g(1:blocks_g)=(4*winn_g)/(pi*D1^2);  %= impulsen ut av gassventilen -antar konstant gjennom hele røret initielt
   v2(1:blocks_o)=(4*qinn_o)/(pi*D2^2);  %Hastighet ut av oljeventilen -antar konstant gjennom hele røret initielt
   p2=rho_o*g*h_t_ini+p_ini;  %Trykket ved inngangen til oljeventilen, initielt
   
   if ventiltype_g== 1  %lineær ventilkarakteristikk
      p1(1)=p_ini-((winn_g^2*z*R*T)/(Cv_g^2*u_gi^2*Y^2*p_ini*M)); %trykket ved utløpet gassventilen, initielt
          
   elseif ventiltype_g== 2  %equal percentage ventilkarakteristikk
      p1(1)=p_ini-((winn_g^2*z*R*T)/(Cv_g^2*(40^(u_gi-1))^2*p_ini*M));
                
    else
       disp('velg riktig ventiltype!')
       return
   
  end
  
  delta_p1=(p1(1)-p1_out)/blocks_g;  %antar lineær trykkforskjell i gassrøret initielt
	p1(2:blocks_g)=p1(1)-(1:blocks_g-1)*delta_p1;  %trykket i gassrøret, initielt

  if ventiltype_o== 1  %lineær ventilkarakteristikk
      p3(1)=p2-((qinn_o^2*rho_o)/(Cv_o^2*u_oi^2)); %trykket ved utløpet til oljeventilen,initielt
          
   elseif ventiltype_o== 2   %equal percentage ventilkarakteristikk
      p3(1)=p2-((qinn_o^2*rho_o)/(Cv_o^2*(40^(u_oi-1))^2));
                
    else
       disp('velg riktig ventiltype!')
       return
   
  end
  
  delta_p3=(p3(1)-p3_out)/blocks_o;   %antar lineær trykkforskjell i oljerøret initielt
  p3(2:blocks_o)=p3(1)-(1:blocks_o-1)*delta_p3;   %trykket i oljerøret, initielt

   x0=[v1_rho_g,p1,v2,p3];    %Dette er initialverdier 
    nx=2*blocks_g+2*blocks_o;
    nu=4;
    ny=4;
    sys=[nx;0;ny;nu;0;1]; 
case 1
   %definerer de deriverte dxdt=f(x,u)
    sys=momentbal(t,u,x,D1,D2,h,l_o,l_g,blocks_o,blocks_g,p1_out,p3_out,ventiltype_g,ventiltype_o);   %Dette kallet må stemme med første linje i momentbal
case 3
   %definerer målinger/outputs y=g(x,u)
   u_o=u(1); %pådraget fra regulatoren som reg. totalnivået
	u_g=u(2); %pådraget fra regulatoren som reg. trykket
	p=u(3);   %trykket i separatoren
	h_t=u(4); %totalt væskenivå

   if ventiltype_g== 1  %lineær ventilkarakteristikk 
     wut_g=Y*Cv_g*u_g*sqrt((p-x(blocks_g+1))*p*M/(z*R*T)); %massestrøm av gass ut av separatoren
	elseif ventiltype_g== 2   %equal percentage ventilkarakteristikk
     wut_g=Y*Cv_g*(40^(u_g-1))*sqrt((p-x(blocks_g+1))*p*M/(z*R*T));
	else
    wut_g=0;
	end
	if ventiltype_g== 1   %lineær ventilkarakteristikk
     qut_o=Cv_o*u_o*sqrt((p+rho_o*g*h_t-x(2*blocks_g+blocks_o+1))/rho_o); %volumstrøm av olje ut av separatoren
	elseif ventiltype_g== 2   %equal percentage ventilkarakteristikk
     qut_o=Cv_o*(40^(u_o-1))*sqrt((p+rho_o*g*h_t-x(2*blocks_g+blocks_o+1))/rho_o);
	else
     qut_o=0;
  end

  	 sys(1)=qut_o; %volumstrøm av olje ut av separator
    sys(2)=wut_g; %massestrøm av gass ut av separator
    sys(3)=x(blocks_g+1); %trykket ved utløpet til gassventilen
    sys(4)=x(2*blocks_g+blocks_o+1); %trykket ved utløpet til oljeventilen
 otherwise
    sys=[];
 end
 
