/*Obliczanie naprężeń i kierunków głównych w węzłach siatki - kostka 3D z dyskretyzacją siatką regularną, analiza skalowalności - pthreads Miłosz Czarnota i Bzowski Krzysztofgr 1. IS/IMiIPOgólny sens:Klasa punkt reprezentuje jeden węzeł. Celem jest stworzenie dużej ilości punktów (umieszczonych w tablicy) a nastepnie policzenie dla nich naprężeń głównych.Tensor reprezentowany jest przez tablicę 3x3. Tworzymy więc tablicę wskaźników składającą się z 3 komórek, a potem w każdej tworzymy kolejną tablicę trój-elementową - dostajemy macież 2-wymiarową 3x3. Zapełniamy ją losowymi liczbami z zachowaniem jednak reguły, że musi być to tensor symetryczny (jak we wzorze z pdfa). Liczymy współczynniki (zmienne I1, I2, I3) równania III rzędu - stosując wzory z PDFa. Tworzymy równanie 3-rzędu. Za pomocą wzorów Cardana obliczamy pierwiastki tego równania, które są zarazem naprężeniami głównymi w punkcie. Czas operacji mierzymy za pomocą dedykowanej biblioteki stworzonej przez dr Krzysztofa Banasia. */#include <stdio.h>#include <stdlib.h>#include <iostream>#include <pthread.h>#include <math.h>//------------------------------#include "pomiar_czasu.c"#include "punkt.h"unsigned int rozmiar;int debug;void *thread_func( void *vptr_args );punkt *cube;pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;//------------------------------using namespace std;main (){do {cout<<"Debug Mode [0/1]: ";cin >> debug;}while(debug !=0 && debug !=1);cout<<"Ilosc wezlow: ";cin>>rozmiar;punkt *cube = new punkt[rozmiar];cout<<"$$ OBLICZENIA SEKWENCYJNE $$"<<endl;inicjuj_czas();for(int i=0; i<rozmiar; i++){ if(debug) cube[i].show(); cube[i].oblicz_wspolczynniki(); if(debug) cube[i].show_rownanie(); cube[i].oblicz_pierwiastki(); if(debug) cube[i].show(); }drukuj_czas();delete [] cube;cout<<"$$ OBLICZENIA ROWNOLEGLE $$"<<endl;cube = new punkt[rozmiar];punkt :: delta = 0;inicjuj_czas();pthread_t watek;pthread_create( &watek, NULL, &thread_func, NULL );for(int i=0; i<rozmiar/2; i++){ if(debug) cube[i].show(); cube[i].oblicz_wspolczynniki(); if(debug) cube[i].show_rownanie(); pthread_mutex_lock (&mut); cube[i].oblicz_pierwiastki(); pthread_mutex_unlock (&mut); if(debug) cube[i].show(); }pthread_join(watek, NULL );drukuj_czas();delete [] cube;}void *thread_func( void *vptr_args ){cout<<"Watek 2"<<endl;for(int j=(rozmiar/2)+1; j<rozmiar; j++){ if(debug) cube[j].show(); cube[j].oblicz_wspolczynniki(); if(debug) cube[j].show_rownanie(); cube[j].oblicz_pierwiastki(); if(debug) cube[j].show(); }}