Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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.



Panel
borderColor#dfe1e5
bgColor#eff9ff
borderWidth2
titlePage content

Table of Contents


'Main'-funksjon

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
languagepy
titleRammeanalyse
linenumberstrue
from structure_visualization import *


def main():
    # -----Rammeanalyse-----
    # ----------------------
def main():
    # -----Initialiserer figuererfigurer-----
    fig_init, ax_init, fig_def, ax_def = setup_plots()
    
    # -----Til visualiseringen, velg første indeks brukt i nummerering av noder og element-----
    first_index = 1

    # -----Leser input-data-----
    npunkt, punkt, nelem, elem, nlast, last = lesinput()


	# -----Plott initalramme-----
    plot_structure(fig_init, ax_init, punkt, elem, 1, first_index)

    # -----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 i Python
    
    #------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)

	#-----Plott deformert ramme-----
    skalering = 100;     # Du kan endre denne konstanten for å skalere de synlige deformasjonene til rammen
    plot_structure_def(fig_def, ax_def, punkt, elem, 1, first_index, skalering*rot)
    plt.show()


Info

Dersom du ønsker tips til å forbedre kodingen din, besøk siden Tips and tricks for coding. Andre nyttige sider for dette prosjektet kan være LaTeX, Inkscape TexText og Python.

Utdelte funksjoner


Code Block
languagepy
titleElementlengder
linenumberstrue
import numpy as np


def lengder(knutepunkt, element, nelem):

    elementlengder = np.zeros((nelem, 1))
    # Beregner elementlengder med Pythagoras' laeresetning
    for i in range (0, nelem):
        # OBS! Grunnet indekseringsyntaks 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] = np.sqrt(dx*dx + dy*dy)

    return elementlengder


Code Block
languagepy
titleLes input
linenumberstrue
import numpy as np


def lesinput():

    # Åpner inputfilen
    fid = open("input.txt", "r")

    # Leser totalt antall punkt
    npunkt = int(fid.readline())       # 'fid.readline()' leser en linje, 'int(...)' gjør at linjen tolkes som et heltall

    # 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

Inputfil - Eksempel

Følgende er et eksempel på hvordan input.txt kan se ut. I dette eksemplet er det ikke lagt til noen laster på konstruksjonen. 

Note

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