import numpy as np # numpy importeres her
from matplotlib import pyplot as plt # pyplot som plt importeres her
import math # math importeres her
data = np.loadtxt('waterHeight.txt',skiprows = 1) # Laster inn dataen fra "waterHeight", og hopper over den første
# raden.
Time = data[:,0] # "Time" listen hentes ut her
WaterHeight = data [:,1] # "WaterHeight" listen hentes ut her
N = 277 # Det er 277 målinger
t0 = 0 # Starttiden er 0 sekunder
tSlutt = 276 # Sluttiden er 276 sekunder
h = (tSlutt - t0) / (N - 1) # Steglengden er (276 - 0) / (277 - 1) = 276 / 276 = 1
for x in range(N): # For-løkke som kjøres N antall ganger
WaterHeight[x] = -WaterHeight[x] + 21.8 - 5.7 + 21.8
# Her snus datasettet opp ned, og det løftes med 21.8cm, til hvor høyt vannet var ved staten av da forsøket ble
# gjort. Slik modellerte jeg hva avstanden mellom denne vannhøyden og sensoren var, som var 5.7cm. Så løftet jeg
# datasettet opp igjen med 21.8, slik at den kunne vise den reelle vannhøyden
plt.plot(Time, WaterHeight, label = "Data") # Disse tallverdiene plottes inn til leseren, og grafens navn settes
# til "Data"
Ap = ((1/100/2)**2)*math.pi # Regner ut arealet av proppen, der proppens diameter er 1cm
A = ((25.5/100/2)**2)*math.pi # Regner ut arealet av grunn/topp-flaten, der flatens diameter er 25.5cm
k0 = 100/3 # Konstanten k0 settes til 100/3, altså hundre tredeler
k = k0 * (Ap / A) # Regner ut k til bruk for eulermetoden
T = np.zeros(N) # En liste av "T" (Time) lages her
W = np.zeros(N) # En liste av "W" (WaterHeight) lages her
Ti = np.zeros(N) # En liste av "Ti" (TimeIncrease) lages her
Wi = np.zeros(N) # En liste av "Wi" (WaterHeightIncrease) lages her
Td = np.zeros(N) # En liste av "Td" (TimeDouble) lages her
Wd = np.zeros(N) # En liste av "Wd" (WaterHeightDouble) lages her
TimeListe = [T, Ti, Td] # TimeListe settes til T, Ti, og Td
WaterHeightListe = [W, Wi, Wd] #WaterHeightListe settes til W, Wi, og Wd
kListe = [0, 0.4, 0.4] # Dette settes inn, for i den andre og den tredje beregningen er det en konstant tilførsel
# av vann (ki), som står for konstantIncrease. Denne konstanten, etter modellering, settes til 0.4
multiplyListe = [1, 1, 2] # Dette settes inn, for i den tredje beregningen er det to hull istedenfor kun ett.
# Denne konstanten (kd), som står for konstantDouble, settes til 2
tMove = [37, 37+60, 37+60*2] # Denne listen brukes for å flytte de tre beregnede grafene ett gitt mengde til høyre
label = ["Normal", "Increase", "Double"] # Denne listen brukes for å navngi de ulike grafene
for z in range(3): # For-løkke som kjøres 3 ganger
wStart = [21.8, W[60], Wi[60]] # Disse er for å justere startverdien av grafene, til bruk for eulermetoden
w = WaterHeightListe[z] # w her er alle de tre verdiene for WaterHeight
t = TimeListe[z] # t her er alle de tre verdiene for Time
w[0] = wStart[z] # Den første verdien av "W" er 21.8cm, og de andre verdiene kommer fra de forrige grafene
t[0] = 0 # Den første verdien av "T" er 0s. De andre verdiene settes også til 0, men endres senere i koden
for i in range(N-1): # For-løkke som kjøres N-1 antall ganger
w[i + 1] = w[i] - k*(w[i]**0.5) * h * multiplyListe[z] + kListe[z] # Eulremetoden med diferentiallikningen
# for tømming av tank, som den deriverte av w, i tillegg til multiplyListe og kListe.
t[i + 1] = t[i] + h # Eulermetoden med tiden
for x in range(N): # For-løkke som kjøres N antall ganger
t[x] = t[x] + tMove[z] # Alle grafene flyttes til høyre med 37s, andre graf flyttes ytterligere 60s til
# høyre, og tredge graf flyttes ytterligere 120s til høyre. Slik flyttes grafene til der de er relevante
# å bruke
plt.plot(t, w, label = label[z]) # Den kalkulerte verdien, altså vannstanden i forhold til tiden, plottes.
# Navnet til grafene blir gitt her
plt.xlabel("Tid [Sekunder (s)]") # Navngir x-aksen som "Tid [Sekunder (s)]"
plt.ylabel("Vannhøyde [Høyde (h)]") # Navngir y-aksen som "Vannhøyde [Høyde (h)]"
plt.legend() # Viser frem alle navngivelsene til grafene