close all
clear all
% temperatur og trykk for en standard atmosfære:
load atmos.dat
temp = atmos(:,1);
trykk = atmos(:,2);
% blandingsforholdet av gassene i atmosfæren, brukes kun for SW
load r_gass.dat
r_h2o=r_gass(:,1);
r_co2=r_gass(:,2);
r_o3=r_gass(:,3);
%absorpsjonskonstanter [m^2/kg]:
load abs_kons.dat
k_h2o_1=abs_kons(:,1);
k_h2o_2=abs_kons(:,2);
k_h2o_3=abs_kons(:,3);
k_hartley=abs_kons(:,4);
k_huggins=abs_kons(:,5);
k_chappuis=abs_kons(:,6);

%emissivitetene for hver gass [m^-1]:
load emiss.dat
emiss_h2o = emiss(:,1)*10;
emiss_co2 = emiss(:,2)*2; 
emiss_o3  = emiss(:,3);


R=287.05;                           % gasskonstant tørr luft (J/(K*kg))
S0 = 1367;                          % solkonstanten, Wm-2
breddegrader = 45;                  % 
deklinasjonsvinkel = 0;             % 0=21 mars
sigma = 5.67e-8;                    % Stefan-Boltzmann konstant [W/(m2*K4)] 
Cp = 1004;                          % Spesifikk varme for tørr luft ved konstant trykk [J/K*kg]
Cs = 1e+6;                          % Spesifikk varme (Cs=3e+5 tilsvarer 10 cm jord) [J/K*m2]
Alb = 0.3;                          % Bakkealbedo
In=10;                              % langbølget stråling ved 51km [W/m2]
T_s(1)=288.2;                       % Bakketemp, Kelvin

t_max=2400;                           % hvor mange timer vi ser på frem i tid
lag=1:50;                           % lagene i modellen
temp=temp(:,1);                     % Kelvin [K]
trykk=trykk(:,1);                   % [hPa]
%bruker gassloven for å finne tettheten:
tetthet=trykk(1:50)./(R*temp(1:50))*100; %gange med 100 for å få pascal! [kg/m3]
dz=1000;                                 % tykkelsen på hvert lag, [m]
H_SH=4000;                                 % skalahøyde SH, [m]

%H2O: tilgjengelig energi for 3 bånd for vanndamp:
delband1 = 0.73;
delband2 = 0.20;
delband3 = 0.07;
del_h2o = 0.346*S0;

%O3: tilgjengelig energi for 3 bånd for ozon:
del_hartley = 0.002;
del_huggins = 0.01;
del_chappuis =.988;
del_o3=0.654*S0;

%NB! når du skal finne optisk tykkelse for hvert lag trenger du ikke en
%forløkke! Det holder med matrisemultiplisering. Om du liker løkker, så er
%det også helt ok å lage:)
%optisk tykkelse H2O:
tau1 = 0;             %oppgave1
tau2 = 0;             %oppgave1
tau3 = 0;             %oppgave1

% optisk tykkelse O3:
tauH=0;               %oppgave1
tauHU=0;              %oppgave1
tauC=0;               %oppgave1


%deklarasjon av variabler, disse skal IKKE endres!
% dette er kun for raskere kjøring av programmet
mu=zeros(t_max,1);
S_ned_1=zeros(51,t_max);
S_ned_2=zeros(51,t_max);
S_ned_3=zeros(51,t_max);
DeltaF1=zeros(50,t_max);
DeltaF2=zeros(50,t_max);
DeltaF3=zeros(50,t_max);
Temp1=zeros(50,t_max);
Temp2=zeros(50,t_max);
Temp3=zeros(50,t_max);
Temp_h2o=zeros(50,t_max);
S_ned_H=zeros(51,t_max);
S_ned_HU=zeros(51,t_max);
S_ned_C=zeros(51,t_max);
DeltaF_H=zeros(50,t_max);
DeltaF_HU=zeros(50,t_max); 
DeltaF_C=zeros(50,t_max);
Temp_H=zeros(50,t_max);
Temp_HU=zeros(50,t_max);
Temp_C=zeros(50,t_max);
Temp_o3=zeros(50,t_max);
Temp_kort=zeros(50,t_max);
totTempkort=zeros(50,1);
totTemp=zeros(50,1);
tempO3=zeros(50,1);
tempH2O=zeros(50,1);
T=zeros(50,t_max);
Temp_lang=zeros(50,t_max);
F_oppH2o=zeros(51,t_max);
F_oppCo2=zeros(51,t_max);
F_oppO3=zeros(51,t_max);
DeltaF_oppH2o=zeros(50,t_max);
DeltaF_oppCo2=zeros(50,t_max);
DeltaF_oppO3=zeros(50,t_max);
F_nedH2o=zeros(51,t_max);
F_nedCo2=zeros(51,t_max);
F_nedO3=zeros(51,t_max);
DeltaF_nedH2o=zeros(50,t_max);
DeltaF_nedCo2=zeros(50,t_max);
DeltaF_nedO3=zeros(5,t_max);
DeltaF_H2o=zeros(50,t_max);
DeltaF_Co2=zeros(50,t_max);
DeltaF_O3=zeros(50,t_max);
DeltaF_SH=zeros(50,t_max);
Temp_lang_H2o = zeros(50,t_max);
Temp_lang_Co2 = zeros(50,t_max);
Temp_lang_O3  = zeros(50,t_max);
Temp_SH  = zeros(50,t_max);
totTemp_H2o=zeros(50,1);
totTemp_Co2=zeros(50,1);
totTemp_O3=zeros(50,1);
totTemplang=zeros(50,1);
Total_temp=zeros(50,1);
S_ned_s = zeros(t_max);
F_ned_s = zeros(t_max);

%NB! temperaturen i atmosfæren kalles T
% Initialiserer med T=250K i alle lag, alternativt initialiserer
% med standard atm.
%T(:,1)=temp(1:50);  
T(:,1)=250;

%her begynner tidsløkka!
for t=1:t_max;

%KORTBØLGET STRÅLING:

%cosinus til sentitvinkelen
mu(t)= sind(breddegrader)*sind(deklinasjonsvinkel)...
    + cosd(breddegrader)*cosd(deklinasjonsvinkel)*cosd((t+18)*15);  

%H2O:
if (mu(t) > 0)                     % Senitvinkelen større enn null = sola er oppe
    S0_1=del_h2o*delband1;
    S0_2=del_h2o*delband2;
    S0_3=del_h2o*delband3;
    S_ned_1(51,t) = S0_1*mu(t);   % Instråling avhengig av senitvinkelen
    S_ned_2(51,t) = S0_2*mu(t);
    S_ned_3(51,t) = S0_3*mu(t);
else 
    S_ned_1(51,t) = 0;   % Sola gått ned
    S_ned_2(51,t) = 0;
    S_ned_3(51,t) = 0;
end

% Stråling nedover i hvert lag avhengig av stråling i lag over og
% eksponensielt av optisk tykkelse og senitvinkelen; ulik veilengde for strålingen å passere
for n=1:50
    S_ned_1(51-n,t) =   0; %oppgave 2
    S_ned_2(51-n,t) =   0; %oppgave 2
    S_ned_3(51-n,t) =   0; %oppgave 2
end

% Forskjell: hva kommer inn i laget minus det som går ut av laget. Stråling
% blir absorbert og kan ha en effekt på oppvarmingsrate
for n=1:50
    DeltaF1(n,t) = S_ned_1(n+1,t)-S_ned_1(n,t); 
    DeltaF2(n,t) = S_ned_2(n+1,t)-S_ned_2(n,t);
    DeltaF3(n,t) = S_ned_3(n+1,t)-S_ned_3(n,t);
end

%------ Oppvarmingsrate ----K/time
for n=1:50
    Temp1(n,t) = 0; %oppgave 3
    Temp2(n,t) = 0; %oppgave 3
    Temp3(n,t) = 0; %oppgave 3
end

%total oppvarmingsrate grunnet vanndamp:
for n=1:50
     Temp_h2o(n,t) = Temp1(n,t) + Temp2(n,t) + Temp3(n,t);
end

%O3:
if (mu(t) > 0)                         % Senitvinkelen større enn null = sola er oppe
    S0_H=del_o3*del_hartley;           % hvor stor del av energien fra sola som er 
    S0_HU=del_o3*del_huggins;          % tilgjengelig for hvert bånd
    S0_C=del_o3*del_chappuis;
    S_ned_H(51,t) = S0_H*mu(t);         % Innstråling avhengig av senitvinkelen
    S_ned_HU(51,t) = S0_HU*mu(t);
    S_ned_C(51,t) = S0_C*mu(t);
else 
    S_ned_H(51,t) = 0;   % Sola gått ned
    S_ned_HU(51,t) = 0;
    S_ned_C(51,t) = 0;
                    
end

% Stråling nedover i hvert lag avhengig av stråling i lag over og
% eskponensilt av optisk tykkelse og senitvinkelen; ulik veilengde for strålingen å passere
for n=1:50
    S_ned_H(51-n,t) = 0;      %oppgave 2
    S_ned_HU(51-n,t) = 0;      %oppgave 2
    S_ned_C(51-n,t) = 0;      %oppgave 2
end

% For bakketemperaturen
    S_ned_s(t) = S_ned_1(1,t) + S_ned_2(1,t) + S_ned_3(1,t) +S_ned_H(1,t) + S_ned_HU(1,t) + S_ned_C(1,t) ; 

% Forskjell: hva kommer inn i laget minus det som går ut av laget. Stråling
% blir absorbert og kan ha en effekt på oppvarmingsrate
for n=1:50
    DeltaF_H(n,t) = S_ned_H(n+1,t)-S_ned_H(n,t); 
    DeltaF_HU(n,t) = S_ned_HU(n+1,t)-S_ned_HU(n,t); 
    DeltaF_C(n,t) = S_ned_C(n+1,t)-S_ned_C(n,t); 
end

%------ Oppvarmingsrate ----K/time
for n=1:50
    Temp_H(n,t) = 0;   %oppgave 3
    Temp_HU(n,t) = 0;  %oppgave 3
    Temp_C(n,t) = 0;   %oppgave 3
end

%total oppvarmingsrate grunnet ozon:
for n=1:50
     Temp_o3(n,t) = Temp_H(n,t) + Temp_HU(n,t) + Temp_C(n,t);
 end
%total oppvarmingsrate kortbølget (K/time):
 for n=1:50
     Temp_kort(n,t) =Temp_o3(n,t) + Temp_h2o(n,t);% 
 end

%LANGBØLGET STRÅLING:
% %-------- stråling oppover ---------------------------------------
%bruker Stefan-Boltzmann lov, antar at jorda er et svartlegeme
 F_oppH2o(1,t) = sigma*(T_s(t))^4;  
 F_oppCo2(1,t) = sigma*(T_s(t))^4;
 F_oppO3(1,t)  = sigma*(T_s(t))^4;
 
 %langbølget stråling oppover for hvert lag
 for n=1:50
     F_oppH2o(n+1,t) = 0; %oppgave 4
     F_oppCo2(n+1,t) = 0; %oppgave 4
     F_oppO3(n+1,t)  = 0; %oppgave 4
 end

% Forskjell: hva kommer inn i laget minus det som går ut av laget. Stråling
% blir absorbert og kan ha en effekt på oppvarmingsrate
for n=1:50
% TB2011, feil. Rettet 16.02 2012
    DeltaF_oppH2o(n,t) =  F_oppH2o(n,t)-F_oppH2o(n+1,t);                  
    DeltaF_oppCo2(n,t) =  F_oppCo2(n,t)-F_oppCo2(n+1,t);
    DeltaF_oppO3(n,t)  =   F_oppO3(n,t)-F_oppO3(n+1,t);
end

% %-------- stråling nedover ---------------------------------------
% langbølget stråling ned fra 51 km
F_nedH2o(51,t) = In;
F_nedCo2(51,t) = In;
F_nedO3(51,t)  = In;
%langbølget stråling nedover for hvert lag
for n=1:50
    F_nedH2o(51-n,t) = 0; %oppgave 5
    F_nedCo2(51-n,t) = 0; %oppgave 5
    F_nedO3(51-n,t)  = 0; %oppgave 5
end

% For bakketemperaturen
    F_ned_s(t) = F_nedH2o(1,t) + F_nedCo2(1,t) + F_nedO3(1,t) ; 

    % Forskjell: hva kommer inn i laget minus det som går ut av laget. Stråling
% blir absorbert og kan ha en effekt på oppvarmingsrate
for n=1:50
    DeltaF_nedH2o(n,t) = F_nedH2o(n+1,t) - F_nedH2o(n,t);
    DeltaF_nedCo2(n,t) = F_nedCo2(n+1,t) - F_nedCo2(n,t);
    DeltaF_nedO3(n,t)  = F_nedO3(n+1,t) - F_nedO3(n,t);
end 

%---- Total langbølget fluks ----------------------------------  
for n=1:50
    DeltaF_H2o(n,t) =  DeltaF_nedH2o(n,t) + DeltaF_oppH2o(n,t) ;
    DeltaF_Co2(n,t) =  DeltaF_nedCo2(n,t) + DeltaF_oppCo2(n,t) ;
    DeltaF_O3(n,t)  =  DeltaF_nedO3(n,t) + DeltaF_oppO3(n,t) ;
end

%----  Fluks (W/m2) av SH fra bakken, ser bort fra LH ----------------------------------  
if (mu(t) > 0)                     % Senitvinkelen større enn null = sola er oppe
  SH0 = Cp*tetthet(1)*1.5e-1*(T_s(t)-T(1,t));   % Hartmann likning 4.26
                                              % (CD=3E-3, U=5m/s)
else
  SH0 = 0;
end
    
%Energifluksen ved bakken gitt ved SH0 fordeles vertikalt
for n=1:50
    DeltaF_SH(n,t) = SH0*(exp(-(n-1)*dz/H_SH)-exp(-n*dz/H_SH));
end


    
%------ Oppvarmingsrate ----K/time
for n=1:50
    Temp_lang_H2o(n,t) = 0; %oppgave 6 
    Temp_lang_Co2(n,t) = 0; %oppgave 6
    Temp_lang_O3(n,t) = 0; %oppgave 6
    Temp_SH(n,t) = 0; %oppgave 6   % Hint: DeltaF_SH og DeltaF_H2o
                      %er begge energiflukser
    % total oppvarmingsrate for langbølget:
    Temp_lang(n,t)=Temp_lang_H2o(n,t)+Temp_lang_Co2(n,t)+Temp_lang_O3(n,t);
end
%------ Total Oppvarmingsrate, både kort og lang ----K/time
for n=1:50
    Total_temp(n,t) = Temp_kort(n,t) + Temp_lang(n,t);
end   
% Oppdaterer bakketemperaturen
    T_s(t+1) = T_s(t)+((1-Alb)*S_ned_s(t)+F_ned_s(t)-sigma*(T_s(t))^4-SH0)*3600/Cs;
    
% Oppdaterer temperaturen i atmosfæren
for n=1:50
T(n,t+1) = T(n,t)+ Total_temp(n,t)+Temp_SH(n,t);
end

end %her ender tidsløkka:

%finner ut total oppvarmingsrate for det siste døgnet vi har sett på
%brukes i figurene nedenfor
if t_max>=24
    t_min=t_max-23;
else
    t_min=1;
end
for n=1:50
    totTemp_H2o(n)=sum(Temp_lang_H2o(n,t_min:t_max));
    totTemp_Co2(n)=sum(Temp_lang_Co2(n,t_min:t_max));
    totTemp_O3(n)=sum(Temp_lang_O3(n,t_min:t_max));
    totTemplang(n)=sum(Temp_lang(n,t_min:t_max));
    totTempkort(n)=sum(Temp_kort(n,t_min:t_max));
    tempO3(n)=sum(Temp_o3(n,t_min:t_max));
    tempH2O(n)=sum(Temp_h2o(n,t_min:t_max));
    totTemp(n)=sum(Total_temp(n,t_min:t_max));
end

T_s(t_max)
T(:,t_max)

%figur over oppvarmingsraten pga. absorbsjon av kortbølget stråling, [Kelvin/døgn]
figure(1)
plot(totTempkort,lag,'Linewidth',3)
hold on
plot(tempO3,lag,'r')
plot(tempH2O,lag,'g')
legend('total', 'O3', 'H2O','Location','SE')
title('Oppvarming kortbølget pr døgn')
ylabel('km')
xlabel('Kelvin pr. døgn')
ylim([1 50])

%figur over oppvarmingsraten pga. absorbsjon av langbølget stråling, [Kelvin/døgn]
figure(2)
plot(totTemplang,lag,'LineWidth',4)
hold on
plot(totTemp_H2o,lag,'g-','LineWidth',3)
plot(totTemp_Co2,lag,'k-','LineWidth',3)
plot(totTemp_O3,lag,'r-','LineWidth',3)
ylim([1 50])
title('Oppvarming langbølget pr døgn')
ylabel('km')
xlabel('Kelvin pr. døgn')
legend('Total', 'H2O', 'CO2','O3','Location','SW')

%figur over total oppvarmingsrate pga. stråling, [kelvin/døgn]
figure(3)
plot(totTemp,lag,'b','LineWidth',3)
hold on
plot(totTemplang,lag,'k','Linewidth',3)
plot(totTempkort,lag,'r','LineWidth',3)
legend('Total', 'Lang', 'Kort','Location','SW')
ylim([1 50])
title('Oppvarming pr døgn')
ylabel('km')
xlabel('Kelvin pr. døgn')

%figur over temperaturprofil, [kelvin]
figure(4)
plot(T(:,t_max),lag,'b','LineWidth',3)
hold on
legend('Temp','Location','SW')
ylim([1 50])
title('Temperaturprofil')
ylabel('km')
xlabel('Kelvin')


