Prosjektoppgaven i TMR4167 innebærer å analysere en konstruksjon med matrisemetoden. Hensikten med prosjektet er å få trening i å utføre beregningsoppgaver med Python, samt få innsikt i oppbyggingen av dataprogram for analyse av rammekonstruksjoner.
I main har vi laget en hovedramme for hvordan programmet kan bygges opp. Her er også forslag til flere av funksjonskallene inkludert slik at det blir lettere å komme igang med programmeringen. Legg merke til at funksjonene lesinput og lengder allerede er implementert.
Code Block |
---|
language | py |
---|
title | Rammeanalyse |
---|
linenumbers | true |
---|
|
import numpy as np
import numpy.matlib
def main():
# Rammeanalyse
# -----Leser input-data-----
npunkt, punkt, nelem, elem, nlast, last = lesinput()
# -----Regner ut lengder til elementene------
elementlengder = lengder(punkt, elem, nelem)
# -----Fastinnspenningsmomentene------
# Lag funksjon selv
fim = moment(npunkt, punkt, nelem, elem, nlast, last, elementlengder)
# -----Setter opp lastvektor-----
# Lag funksjon selv
b = lastvektor(fim, npunkt, punkt, nelem, elem)
# ------Setter opp systemstivhetsmatrisen-----
# Lag funksjon selv
K = stivhet(nelem, elem, elementlengder, npunkt)
# ------Innfører randbetingelser------
# Lag funksjon selv
Kn, Bn = bc(npunkt, punkt, K, b)
# -----Løser ligningssystemet------
# Lag funksjon selv
rot = ...
# Hint, se side for løsing av lineære systemer vha. numpy
#------Finner endemoment for hvert element-----
# Lag funksjon selv
endemoment = endeM(npunkt, punkt, nelem, elem, elementlengder, rot, fim)
#-----Skriver ut hva rotasjonen ble i de forskjellige nodene-----
print("Rotasjoner i de ulike punktene:")
print(rot)
#-----Skriver ut hva momentene ble for de forskjellige elementene-----
print("Elementvis endemoment:")
print(endemoment) |
Utdelte funksjoner
Code Block |
---|
language | py |
---|
title | Elementlengder |
---|
linenumbers | true |
---|
|
def lengder(knutepunkt, element, nelem):
elementlengder = np.matlib.zeros((nelem, 1))
# Beregner elementlengder med Pythagoras' laeresetning
for i in range (0, nelem):
# OBS! Grunnet indekseringsyntax i Python-arrays vil ikke denne funksjonen fungere naar vi bare har ett element.
dx = knutepunkt[element[i, 0], 0] - knutepunkt[element[i, 1], 0]
dy = knutepunkt[element[i, 0], 1] - knutepunkt[element[i, 1], 1]
elementlengder[i] = math.sqrt(dx*dx + dy*dy)
return elementlengder |
Code Block |
---|
language | py |
---|
title | Les input |
---|
linenumbers | true |
---|
|
def lesinput():
# Åpner inputfilen
fid = open("input.txt", "r")
# Leser totalt antall punkt
npunkt = int(fid.readline()) # 'fid.readline()' leser en linje
# LESER INN XY-KOORDINATER TIL KNUTEPUNKTENE
# Nodenummer tilsvarer radnummer i "Node-variabel"
# x-koordinat lagres i kolonne 1, y-koordinat i kolonne 2
# Grensebetingelse lagres i kolonne 3, 1 = fast innspent og 0 = fri rotasjon
punkt = np.loadtxt(fid, dtype = int, max_rows = npunkt) # 'max_rows = npunkt' sorger for at vi bare leser
# de 'npunkt' neste linjene i tekstfilen
# Leser antall elementer
nelem = int(fid.readline())
# Leser konnektivitet: Sammenheng mellom elementender og knutepunktnummer samt EI for elementene
# Elementnummer tilsvarer radnummer i "Elem-variabel"
# Knutepunktnummer for lokal ende 1 lagres i kolonne 1
# Knutepunktnummer for lokal ende 2 lagres i kolonne 2
# Det anbefales at knutepunktnummerering starter på 0, slik at det samsvarerer med listeindeksering i Python
# E-modul for materiale lagres i kolonne 3
# Tverrsnittstype lagres i kolonne 4, I-profil = 1 og rørprofil = 2
elem = np.loadtxt(fid, dtype = int, max_rows = nelem)
# Leser antall laster som virker på rammen
nlast = int(fid.readline())
# Leser lastdata
# Bestem selv verdiene som er nødvendig å lese inn, samt hva verdiene som leses inn skal representere
last = np.loadtxt(fid, dtype = float, max_rows = nlast) # <-- Forslag til innlesing av lastdata
# Lukker input-filen
fid.close()
return npunkt, punkt, nelem, elem, nlast, last |
Følgende er et eksempel på hvordan input.txt kan se ut. I dette eksemplet er det ikke lagt til noen laster på konstruksjonen. OBS! Husk å fjerne kommentarene fra egen inputfil.
No Format |
---|
9 # Antall knutepunkt
0 0 1 # [x, y, Innspenning]
0 10 0
0 20 0
10 20 0
10 10 0
10 0 0
20 20 0
20 10 0
20 0 0
10 # Antall element
0 1 70854000 1 # [Lokal ende 1, Lokal ende 2, Elastisitetsmodul, Profil]
1 2 70854000 1
1 4 141708000 2
2 3 70854000 2
4 3 70854000 1
5 4 70854000 1
3 6 70854000 2
4 7 141708000 1
7 6 70854000 2
8 7 70854000 1
0 # Antall laster |