background image

 

#include

 

"bibs.h"

 

 

const

 

int

 roz=1000; 

char

 katalog[roz]=

"D:\\Dokumenty\\kratownica_infa\\projekt\\projekt\\"

;  

char

 plik[roz]; 

fstream wczytywanie,zapisywanie;  
 

void

 main() 

{      

//Definiowanie podstawowych zmiennych do wczytywania danych z plików txt

 

int

 M; 

//liczba prętów kratownicy

 

int

 N; 

//liczba węzłów

 

int

 Z; 

//liczba odebranych stopni swobody

 

     
strcpy_s(plik,katalog); 
strcat_s(plik,

"alok.txt"

);  

wczytywanie.open(plik,ios::in);  
wczytywanie>>M;        

//wczytujemy liczbe prętów z 1. wiersza alok.txt

 

int

** ALOK=NEW(0,M,2); 

//utworzenie macierzy alokacji ALOKmx2

 

for

(

int

 i=0;i<M;i++)  

 

 

 

for

(

int

 j=0;j<2;j++) 

wczytywanie>>ALOK[i][j];  
wczytywanie.close();  
display(

"ALOK"

,ALOK,M,2); 

//wyświetlenie macierzy ALOK

 

 
strcpy_s(plik,katalog); 
strcat_s(plik,

"boundary.txt"

); 

wczytywanie.open(plik,ios::in);  
wczytywanie>>Z;  

//wczytujemy ile jest odebranych st. swobody z 1. wiersza boundary.txt

 

int

* R=NEW(0,Z); 

//wektor Rz z numerami odebranych st. swobody

 

for

(

int

 i=0;i<Z;i++) 

wczytywanie>>R[i]; 
wczytywanie.close(); 
quick_sort(R,Z);  

// sortowanie wektora R od najmniejszej do największej wartości

 

display(

"R"

,R,Z); 

//wyświetlenie wektora R 

 

 

 

 

strcpy_s(plik,katalog); 
strcat_s(plik,

"cart.txt"

); 

wczytywanie.open(plik,ios::in); 
wczytywanie>>N;          

// wczytywanie liczby węzłów

 

double

** X=NEW(0.0,N,2); 

// macierz Xnx2 ze składowymi położen wszystkich prętów

 

for

(

int

 i=0;i<N;i++)  

 

for

(

int

 j=0;j<2;j++) 

wczytywanie>>X[i][j]; 
wczytywanie.close(); 
display(

"X"

,X,N,2); 

//wyświetlanie macierzy X ze składowymi położen prętów

 

 

int

 T=2*N; 

//zmienna pomocnicza

 

 
strcpy_s(plik,katalog); 
strcat_s(plik,

"force.txt"

); 

wczytywanie.open(plik,ios::in); 

double

* Q=NEW(0.0,T); 

//wektor Qt zawierający składowe pionowe(Y) i poziome (X) sił i 

reakcji

 

for

(

int

 i=0;i<T;i++)  

wczytywanie>>Q[i]; 
wczytywanie.close(); 
display(

"Q"

,Q,T); 

//wyświetlenie wektora Q sił i reakcji

 

 

double

* L=NEW(0.0,M);    

//wektor Lm z długościami prętów

 

background image

 

double

** B=NEW(0.0,M,T); 

//macierz Bmxt kosinusów kierunkowych prętów

 

 

for

 ( 

int

 a=0;a<M;a++) 

//zerowanie macierzy B 

 

 

for

 (

int

 b=0;b<T;b++) 

B[a][b]=0;  
 

 

for

(

int

 p=0; p<M; p++) 


 

int

 i0=ALOK[p][0]; 

//numery globalne końców prętów (1. kolumna z ALOK)

 

 

int

 i1=ALOK[p][1]; 

//numery globalne końców prętów (2. kolumna z ALOK)

 

 

double

 dX=X[i1][0]-X[i0][0]; 

//rzut pręta na oś X

 

 

double

 dY=X[i1][1]-X[i0][1]; 

//rzut pręta na oś Y

 

 

L[p]=sqrt(pow(dX,2)+pow(dY,2)); 

// obliczenie długości pręta

 

 

double

 alfa=dX/L[p]; 

// kosinus kierunkowy

 

 

double

 beta=dY/L[p]; 

// kosinus kierunkowy

 

 

B[p][2*i0]=-alfa;  

 

B[p][2*i0+1]=-beta;  

 

B[p][2*i1]=alfa;  

 

B[p][2*i1+1]=beta; 

// 4 składowe macierzy B w wierszu p

 


 
display(

"L"

,L,M); 

display(

"B"

,B,M,T); 

//wyświetlenie macierzy Btxm i wektora Lm

 

 

double

** D=NEW(0.0,T,M); 

//Dtxm - Transponowana macierz B

 

for

(

int

 i=0;i<T;i++) 

 

for

(

int

 j=0;j<M;j++) 

 

 

D[i][j]=B[j][i]; 

//transpozycja

 

display (

"D"

,D,T,M); 

//wyświetlenie macierz Dbxt

 

 

//Definiowanie kolejnych macierzy i wektorów

 

//podział macierzy D na dwie części

 

double

** Dg=NEW(0.0,T-Z,M); 

//macierz górna

 

double

** Dd=NEW(0.0,Z,M); 

//macierz dolna 

 

double

* F=NEW(0.0,M); 

//wektor poszukiwanych sił w prętach, który obliczamy

 

double

* Qg=NEW(0.0,T-Z); 

//wektor z węzłami w których nie ma reakcji

 

double

* Qd=NEW(0.0,Z); 

// wektor,który obliczamy z reakcjami w węzłach 

 

int

 wd=0; 

//pomocnicze zmienne-liczniki

 

int

 wg=0;  

 

for

 (

int

 s=0;s<T;s++) 


 

if

 (s==R[wd]) 

//jeżeli s jest elem. wektora Rz(nr st. swob.) 

 


 

for

(

int

 i=0;i<M;i++) 

 

 

Dd[wd][i]=D[s][i]; 

// wiersz s macierzy Dtxm zapisujemy do Dd

 

 

wd++; 


 

else

 


 

Qg[wg]=Q[s];  

//składową s wektora Qt zapisujemy do Qg

 

 

for

 (

int

 i=0;i<M;i++) 

 

 

Dg[wg][i]=D[s][i]; 

//wiersz s macierz Dtxm zapisujemy do Dg

 

 

wg++; 



 

if

 (T-Z==M) 

//sprawdzenie czy macierz Dd jest kwadratowa

 


 

for

 (

int

 i=0;i<M;i++) 

background image

 

    gauss(Dg,Qg,F,M); 

//obliczenie sił F w prętach

 

 

 

 

 

for

 (

int

 i=0;i<Z;i++) 

 

 

for

(

int

 j=0;j<M;j++) 

 

 

 

Qd[i]+=Dd[i][j]*F[j]; 

// obliczenie składowych reakcji Qd z 

zależności Dd*F=Qd

 


 

for

(

int

 i=0;i<M;i++) 

 

 

cout<<

"\nSila w precie "

<<i<<

" : F["

<<i<<

"]="

<<F[i]; 

 
 

//wyświetlenie wyników na ekranie 

 

 

for

(

int

 i=0;i<Z;i++) 

 

 

 

cout<<

"\nReakcja w wezle "

 <<R[i]/2; 

 

 

 

if

(!(R[i]%2))  

//bo bylo i=2i(+1) przy alokacji

 

 

 

 

 

cout<<

" w kierunku poziomej osi x - stopien swobody "

<<R[i]<<

: Qd["

<<i<<

"]="

<<Qd[i]; 

 

 

 

else

 

 

 

 

 

 

 

 

cout<<

" w kirerunku pionowej osi y"

 

 

cout<<

" - stopien swobody "

<<R[i]<<

" : Qd["

<<i<<

"]="

<<Qd[i]; 

 

 

 

 

//zapisywanie wyników do plików

 

strcpy_s(plik,katalog); 
strcat_s(plik,

"sily.txt"

); 

zapisywanie.open(plik,ios::out); 

//zapisywanie sił

 

for

 (

int

 i=0;i<M;i++)  


 

zapisywanie<<

"F["

<<i<<

"] = "

<<F[i]<<endl;  


zapisywanie.close(); 
 

//Zapisywanie reakcji

 

strcpy_s(plik,katalog); 
strcat_s(plik,

"reakcje.txt"

); 

zapisywanie.open(plik,ios::out); 

for

 (

int

 i=0;i<Z;i++)  


 

zapisywanie<<Qd[i]<<endl; 

             

zapisywanie.close(); 
DEL(ALOK); 
DEL(R); 
DEL(X); 
DEL(Q); 
DEL(L); 
DEL(B); 
DEL(D); 
DEL(Dg); 
DEL(Dd); 
DEL(Qg); 
DEL(Qd); 
DEL(F); 
 
cout<<endl;