Create README.md

====================== DOCUMENTATION IN NORWEGIAN ========================
Innledning
Bakgrunnen for å jobbe med konstruksjonsoppgaven er å se hvor anvendelig og effektiv elementmetoden er for å løse problemstillinger innenfor mekanikk. Nysgjerrigheten på hvordan man bruker elementmetoden som et beregningsverktøy danner grunnlaget for undertegnedes motivasjon. Samtidig er det få programvarer av en lettvekter-type til enkle formål: som for eksempel kan være til nytte for enhver mekanikkstudent i øvingsoppgavene deres. Elementmetoden sin styrke ligger i at den er veldig generell. Det blir for overdrevent å kjøre NX eller andre tilsvarende FEM-programmer for å løse enkle problemer i 2D. Denne oppgaven er elementmetoden implementert i Fortran 90 mens visualisering av resultater fra beregningene er gjort i C.
Teori
Selv om oppgaven kun krever bøyemoment i stavendene, velges det likevel å løse denne oppgaven med tre frihetsgrader i hver stavende slik at man får forskyvninger i tillegg til bare rotasjoner. Dette gjør programmet mer anvendelig selv om det krever litt mer arbeid. 
 
Fremgangsmåten til elementmetoden, der man finner forskyvninger og interne krefter, kan kort beskrives på denne måten:
  Diskretiser problemet ved å dele konstruksjonen inn i elementer. Ved to-dimensjonale tilfeller kan elementet være en stav med to noder; en i hver ende.
	Beregn stivhetsmatrisen til hvert element og ta hensyn til evt. skråstilte elementer ved transformasjon.
	Bestem den globale stivhetsmatrisen til hele problemet ved å sette sammen alle stivhetsmatrisene til elementene.
	Innfør grensebetingelsene i systemligningen Kr = R.
	Løs systemligning Kr = R for å finne forskyvningene.
	Tilbakesubstituer forskyvningsverdiene til elementenes stivhetsmatrise og løs Hookes lov med hensyn på kreftene.




Programmet i denne besvarelsen vil handle etter samme mønster som beskrevet.
















Nedenfor er et komponentdiagram over programmet:




 
Brukeren spesifiserer problemet som skal løses i en input-fil. Når programmet kjøres vil Structure lese av filen og begynne FEM-beregningene, ved hjelp av FEMModules. Resultatet er en fil med løsningsdata. Visualisering av resultatet foregår i Visual som henter data fra input-filen og resultatfilen. Visual gjør nødvendige beregninger på dataene før OpenGL brukes for å illustrere løsningen.
Input.dat
En representasjon av problemstillingen defineres i denne filen. Her skal brukeren bestemme antall elementer og noder i tillegg til de fysiske egenskapene til hvert element. Vinkelen til elementet skal også beskrives før man bestemmer nummereringen til nodene. Denne nummereringen tas vare på i elementmetoden i en såkalt IEG-matrise. I denne oppgaven befinner nummereringen i matrisen over elementene. Videre definerer brukeren belastningene på hver node, der frihetsgradene kommer i tre for hver node. Det siste som skal defineres er grensebetingelsene for problemet.   
Structure.f90
Structure skal håndtere representasjonen av problemet i programmet. Her blir de viktigste variablene for det spesifikke problemet definert: systemets stivhetsmatrise, altså stivhetsmatrisen og belastingsvektoren. Input- og output-rutiner er også definert her. Størrelsen til systemets stivhetsmatrise er [3×n][3×n] der n er antall noder. Systemets stivhetsmatrise bestemmes ved å innaddere elementenes stivhetsmatrise i tur og orden. Ved hjelp av nodenummereringen kan man fastslå hvilken plass på systemets stivhetmatrise hver enkelt av elementstivhetene skal innadderes. 3 ×(n_1-1) og 3 ×(n_2-1) der n_1 og n_2 er de globale nodenumrene til første og andre node i et element er bestemmer indeksøkningen for hhv. de tre første og de tre siste spaltene i elementets stivhetsmatrise. Når stivhetene til alle elementene er innaddert, vil programmet tilfredsstille grensebetingelsene ved å nulle ut rader og kolonner i matrisen og belastningsvektoren. Stivhetsmatrisen er nå klar til å bli slått sammen med belastningsvektoren i det som blir den augmenterte matrisen som Gauss’ eliminasjonsmetode løser.
FEMModules.f90
Her finner man prosedyrer som benyttes i FEM-beregningene. Stivhetsmatrisen til et generelt element er definert her med E-modulen, arealet, lengden og annet arealmoment som input.
 
For å ta hensyn til skråstilte elementer med en vinkel θ har man også en transformasjonsmatrise c:
c= [■(cosθ&-sinθ&0&0&0&0@sinθ&cosθ&0&0&0&0@0&0&1&0&0&0@0&0&0&cosθ&-sinθ&0@0&0&0&sinθ&cosθ&0@0&0&0&0&0&1)]
Her befinner også prosedyren for Gauss’ direkte eliminasjonsmetode, hentet fra Kreyszig: Advanced Engineering Mathematics, 9. utg, s. 837.
Result.dat
Resultatet fra FEM-beregningene skrives til filen result.dat der første linje med informasjon er systemets forskyvningsvektor etterfølgt av de indre kreftene for hver node i hvert element.
 
Visual.c
Programmet leser inn input- og resultatfilen for å bygge opp elementlisten bestående av disse variablene:
0	1	2	3	4	5	6	7	8	9	10	11	12	13
l	θ	n_1	n_2	x_1	y_1	x_2	y_2	u_1	v_1	w_1	u_2	v_2	w_2




Der l er elementets lengde, x og y er koordinatene for første og andre node – og u, v, og w er hhv. horisontale, vertikale og roterende forskyvninger for første og andre node. Et element visualiseres i OpenGL med såkalte GL_LINES som tegner en linje med en viss tykkelse mellom to koordinater. Disse koordinatene bestemmes først i visual.c. Algoritmen for koordinatbestemmelsen gjøres ved å iterere over elementlisten. Første node i første elementet på listen får koordinatene (0,0) og andre node får da koordinatene 〖(x〗_2,y_2)=(l×cosθ,l×sinθ). Andre nodes koordinater blir lagt til å en historikkliste som tar vare på koordinatene på nodene man har besøkt. På denne måten kan man traversere gjennom konstruksjoner med «løkker». For hvert element flytter man altså koordinatsystemet til elementets første node og gjentar prosessen ved å lete gjennom historikklisten over besøkte noder. Man kan nå enkelt tegne elementene med beregnete koordinater.
For å tilpasse konstruksjonen til vinduet skaleres lengden til hvert element etter den lengste lengden. Nedenfor vises en vilkårlig formet konstruksjon. Skaleringsfaktoren blir den lengste lengden av dx eller dy.
 
Alle lengdemålene blir da delt på skaleringsfaktoren slik at det lengste elementet potensielt får lengde 1. Midtpunktet i vinduet blir da justert etter midtsenteret av konstruksjonen.




Noder med høyeste verdi for de respektive internkreftene blir farget rødt med RGB-verdiene 1,0.7,0.7. Noder uten krefter vil våre grå med RGB-verdiene 0.7,0.7,0.7. 








Resultat
I besvarelsen er det på forhånd skrevet input-filer for to forskjellige problemstillinger. Nedenfor vises input1.dat og beregningene for et rammeverk med en påsatt vertikalkraft på 3000 N. Rammen er 2000 mm høy og 2000 mm bred. Skråstaget har en vinkel på 45 grader. Grensebetingelsene er gitt ved at kun rotasjon er tillatt i lageret til venstre mens lageret til høyre har ingen begrensninger.
 
 
















Når FEM-resultatet er klart, dukker et slikt vindu opp. Trykk på «1»-tasten for å se normalkreftene.
 
Illustrasjonen over viser normalkreftene på rammekonstruksjonen. Maksimalverdi kan også leses av bildet. Veldig store trykkrefter på bjelken til venstre.
Trykk på «2»-tasten for å se skjærkreftene.
 
Her ser man skjærkreftene på konstruksjonen. Størst skjærkraft som forventet midt i rammen.
Trykk på tast «3» for å vise momentkreftene.
 
Momentdiagrammet her viser at momentet er størst i hjørnet oppe til venstre.
Hadde man definert den samme rammen med flere noder ville man kunne lest av flere verdier og fått et større bilde på kreftene som virker mellom de seks nodene som i resultatet over. Samtidig er det verdt å merke seg at når det kun virker punktlast vil kreftene ha en lineær sammenheng mellom nodene. Rammekonstruksjonen over med seks noder vil altså være tilstrekkelig nok for å bestemme kreftene i alle deler av bjelkene. Dersom målet er å vite deformasjonen for rammekonstruksjonen, vil desto flere noder gi et mer presist bilde.
Mulige forbedringer på programmet kan være å beregne spenninger i systemet: ved å bruke sammenhengen mellom bøyespenning og bøyemoment. Videre kan grensesnittet forbedres ved å f.eks. la brukeren tegne rammekonstruksjonen istedenfor å måtte sette inn masse data i en fil, som fort kan bli uoversiktlig og bidra til brukerfeil.