#!/usr/bin # -*- coding: utf-8 -*- import numpy as np import numpy.linalg as npla import elements as ef import math as m from elements import Barre,Noeud #src = le fichier Données_Utilisateur.txt def Lecture_Noeud(src): #Initialisation du compteur (c) et lecture intégrale du fichier c=0 f=src.readlines() #Cherche les numéros des lignes début/fin: délimiter les données Noeud et données Elements(Barres) while 1: if (f[c]== 'Idt Noeud|coord x|coord y|u|v|fx|fy\n'): debut_n=c elif (f[c] == '/END NODES\n'): fin_n=c elif (f[c]== 'Idt Element|Idt Noeud1|Idt Noeud2|Module E|Section\n'): debut_e=c elif (f[c] == '/END RODS\n'): fin_e=c break c=c+1 #On reprend la lecture à la ligne 0 jusqu'au début Noeud src.seek(0) for i in range(debut_n): src.readline() #On range les données en colones headline = src.readline().rstrip('\n\r').split("|") Idt_Noeud = headline.index("Idt Noeud") coord_x=headline.index("coord x") coord_y=headline.index("coord y") u=headline.index("u") v=headline.index("v") fx=headline.index("fx") fy=headline.index("fy") #Lecture/Création des noeuds dans (n[]), vecteurs des déplacements autorisés et vecteurs des efforts i=0 n=[] deplacements=[] efforts=[] for ligne in src: if (ligne==f[fin_n]): break data= ligne.rstrip('\n\r').split("|") n.append(0) deplacements.append(int(data[u])) deplacements.append(int(data[v])) efforts.append(float(data[fx])) efforts.append(float(data[fy])) n[i]=ef.Noeud(int(data[Idt_Noeud]),float(data[coord_x]),float(data[coord_y])) i=i+1 #Même procédure pour les éléments Barres src.seek(0) for i in range(debut_e): src.readline() #On classe les éléments dans le tableau e[] headline = src.readline().rstrip('\n\r').split("|") Idt_Ele=headline.index("Idt Element") Idt_Nd1=headline.index("Idt Noeud1") Idt_Nd2=headline.index("Idt Noeud2") Module_E=headline.index("Module E") Section=headline.index("Section") i=0 e=[] for ligne in src: if (ligne==f[fin_e]): break e.append(0) data= ligne.rstrip('\n\r').split("|") id_1= int(data[Idt_Nd1])-1 id_2= int(data[Idt_Nd2])-1 e[i]=ef.Barre( int(data[Idt_Ele]), n[id_1].idt, n[id_2].idt) print"type noeud",type(n[id_1]) #Problème lorsque j'essaie d'appliquer les propriétés lues à l'éléments, le noeud ne semble pas être reconnu en tant qu'instance de Noeud et la longueur ne peut donc pas être déterminée (ligne82) #e[i].setProp(float(data[Module_E]),float(data[Section])) i=i+1 return (n,deplacements,efforts,e) #Assemblage de matrices à 2 dép par noeud def assembler(dicoNoeud,dicoElement): l= 2* len(dicoNoeud) k=np.zeros((l,l)) i=1 while i<=len(dicoElement) : k_e=ef.dicoElement[i].matrice() k_p=np.zeros((l,l)) print"La matrice de l'élement",ef.dicoElement[i].idt,":\n",k_e,"\n" list1=[2*(dicoElement[i].n1.idt)-2,2*(dicoElement[i].n1.idt)-1,2*(dicoElement[i].n2.idt)-2,2*(dicoElement[i].n2.idt)-1] print" Liste indice",i,": \n", list1 for j in range (4): for x in range (4): k_p[list1[j]][list1[x]]=k_e[j][x] k= k + k_p i=i+1 return k #pénalisation de matrice à 2 déplacements par noeud, avec k la matrice assemblée à pénaliser et d le vecteur des déplacement (u,v) def penalisation(k,dicoNoeud,d): l= 2* len(dicoNoeud) list1=[] list2=[] kp=np.zeros((l,l)) d=np.zeros((l)) for i in range(l): if (d[i]!=0): list1.append(i) elif d[i]==0: list2.append(i) for i in list1: for j in list1: kp[i][j]=k[i][j] for i in list2: for j in list2: if i==j : kp[i][j]=1 elif i!=j : kp[i][j]=0 return kp def contrainte_barre(u,dicoElement): u_element=[0,0,0,0] sigma=[0,0,0,0] i=1 while i<=len(dicoElement): if ef.dicoElement[i].type =="b": c= round(m.cos(ef.dicoElement[i].angle),2) s= round(m.sin(ef.dicoElement[i].angle),2) v=[-c,-s,c,s] list1= [(2*ef.dicoElement[i].n1.idt)-2,(2*ef.dicoElement[i].n1.idt)-1,2*(ef.dicoElement[i].n2.idt)-2,2*(ef.dicoElement[i].n2.idt)-1] for j in range(4): u_element[j]=u[list1[j]] sigma[i-1]= (ef.dicoElement[i].E/ef.dicoElement[i].L)* np.dot(v,u_element) print"Contrainte dans la barre",i,":",round(sigma[i-1],2),"\n" i = i +1 # tests: source= open("Données_Utilisateur.txt", "r") n,deplacements,efforts,e=Lecture_Noeud(source) ln=len(ef.dicoNoeud) le=len(ef.dicoElement) #EXPECTED RESULTS print"deplacements",deplacements print"efforts",efforts for i in range (ln): n[i].__str__ print"Noeud n°",i+1,":",n[i].idt,"x:",n[i].x,"y:",n[i].y print "Noeud ?",isinstance(n[i],Noeud) for i in range (le): print"Barre n°",i+1,":",e[i].idt,"n1:",e[i].n1,"n2:",e[i].n2 print"Barre?",isinstance(e[i],Barre) """ #Pas encore tester à cause du problème l 82 k= assembler(ef.dicoNoeud,ef.dicoElement) kp= penalisation(k,ef.dicoNoeud,deplacements) u = npla.solve(kp,efforts) f= np.dot(k,u) contrainte_barre(u,ef.dicoElement) """ source.close()