1
#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
2
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++)
3
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;
}