praca dyplomowa magisterskahome.agh.edu.pl/~kopernik/resource_pmiidp/s_mylnarczyk.pdfona stworzona...
TRANSCRIPT
AKADEMIA GÓRNICZO-HUTNICZA
IM. STANISŁAWA STASZICA W KRAKOWIE
Wydział Inżynierii Metali i Informatyki Przemysłowej
PRACA DYPLOMOWA MAGISTERSKA
pt.
„Aplikacja internetowa do wizualizacji
i analizy wyniko w dla symulacji MES”
Imię i nazwisko dyplomanta: Seweryn Młynarczyk
Kierunek studiów: Informatyka stosowana
Specjalność: Systemy Informatyki Przemysłowej
Nr albumu: 232183
Promotor: dr inż. Magdalena Kopernik
Recenzent: dr hab. inż. Mirosław Głowacki, prof. AGH
Podpis dyplomanta: Podpis promotora:
Kraków 2015
1
Oświadczam, świadomy(-a) odpowiedzialności karnej za poświadczenie nieprawdy, że ni-
niejszą pracę dyplomową wykonałem(-am) osobiście i samodzielnie i że nie korzystałem(-
am) ze źródeł innych niż wymienione w pracy.
Kraków, dnia …… Podpis dyplomanta…………….
2
Spis treści
WSTĘP 4
1. OPRACOWANIE LITERATUROWE ZAGADNIEŃ DOTYCZĄCYCH TEMATU
PROJEKTU. 6
1.1. Co to jest aplikacja internetowa 6
1.2 Java 7
1.2.1 Spring Framework 8
1.2.2. Hibernate 10
1.3. Javascipt 12
1.3.1. ThreeJs 13
1.4. MySQL 15
1.5. Adina 16
2. CEL PRACY 21
3. WYKONANIE PRZYKŁADOWYCH SYMULACJI W PROGRAMIE KOMERCYJNYM. 22
3.1 Analiza FSI uproszczonej turbiny z wykorzystaniem siatki przesuwnej 22
3.2 Analiza klejonego wału z wykorzystaniem ADINA-M/PS 25
4. OPIS IMPLEMENTACJI WYKONANEJ APLIKACJI 27
4.1 Schemat bazy danych 27
4.2 Eksport danych z Adiny 30
4.3 Wczytywanie danych z dostarczonych plików. 35
4.3.1 Wczytywanie danych o węzłach 39
4.3.2 Wczytywanie danych o prymitywach 40
3
4.3.3 Wczytywanie danych o wynikach 43
4.4 Wybór modelu oraz translacja danych 48
4.4.1 Przetwarzanie danych o węzłach 50
4.4.2 Przetwarzanie danych o prymitywach 50
4.4.3 Przetwarzanie danych o wynikach symulacji 52
4.5 Budowa modułu wyświetlającego grafikę 53
5 PORÓWNANIE STWORZONEJ APLIKACJI ORAZ ROZWIĄZANIA KOMERCYJNEGO 58
5.1 Uproszczony model turbiny 58
5.2 Model wału z przyklejonym pierścieniem 65
6. WNIOSKI 68
SPIS ILUSTRACJI 70
BIBLIOGRAFIA 72
4
Wstęp
Jednym z bardziej interesujących narzędzi wykorzystywanych przez naukowców oraz
inżynierów w swojej pracy jest metoda elementów skończonych. Pozwala ona na podział
obszaru na pojedyncze elementy i przeprowadzenie obliczeń tylko dla pojedynczych węzłów[1].
Takie podejście umożliwia przeanalizowanie zachowania nawet skomplikowanych konstrukcji
w zadanych warunkach fizycznych. Minusem tej metody jest konieczność przeprowadzenia
skomplikowanych obliczeń dla bardzo wielu elementów w dyskretyzowanej przestrzeni.
Problem wydajności częściowo został rozwiązany dzięki gwałtownemu rozwojowi technologii
komputerowych, który ma miejsce od około 50 lat. W wyniku którego, uzyskaliśmy możliwość
rozwiązywania układów w przestrzeni trójwymiarowej.
Zanim przeprowadzanie symulacji komputerowych było możliwe, jedyną metodą na
weryfikację poprawności modelów teoretycznych było stworzenie modelu urządzenia i
fizyczne jego przetestowanie. Było to podejście czasochłonne oraz kosztowne. Analiza projektu
z wykorzystaniem metody elementów skończonych pozwala na wczesne wykrycie wad
konstrukcyjnych, a dzięki temu oszczędza cenny czas i środki.[1] MES, czyli metoda
elementów skończonych, znajduje zastosowanie w wielu dziedzinach życia. Służy badaniu
wytrzymałość konstrukcji, analizuje przepływ cieczy czy ciepła oraz wiele innych.
Wykorzystywana jest przy projektowaniu sztucznych serc, jak również przy projektowaniu
bolidów formuły 1.
Popularną metodą przeprowadzania symulacji MES jest wykorzystanie gotowego
komercyjnego oprogramowania. Takie oprogramowanie wspiera wiele procesów oraz
umożliwia analizę otrzymanych rozwiązań dzięki wbudowanym post-procesorom. Istotną
częścią tych narzędzi jest moduł graficzny, który pozwala na zobrazowanie badanego elementu
przed symulacją, oraz po jej wykonaniu. Na dany element możemy nałożyć różnego rodzaju
efekty, które dodatkowo ułatwiają wyobrażenie sobie zachodzących procesów.
Wadą tego typu post-procesorów jest instalacja programu na komputerze. Jeśli chcemy komuś
pokazać swoje rozwiązanie musimy się upewnić, że inni również posiadają takie
oprogramowanie. Często istnieje możliwość zapisu graficznej reprezentacji rozwiązania, jako
obrazu graficznego. Uniemożliwia to jednak jakąkolwiek edycję tego elementu. Jest to czynnik
ograniczający możliwość pełnej współpracy przy projektach. Elementem dodatkowo
poprawiającym kooperację w zespołach byłaby możliwość natychmiastowego dzielenia się
wynikami obliczeń bez konieczności instalowania dodatkowego oprogramowania. Taką
możliwość dają aplikacje internetowe. Niestety na rynku obecnie takie narzędzia nie istnieją.
5
Niniejsza praca opisuje próbę stworzenia aplikacji internetowej, która działałaby, jako prosty
post-procesor dla komercyjnego oprogramowania MES. Działanie zaimplementowanego
rozwiązania zostanie zaprezentowane na przykładzie symulacji stworzonych w programie
„ADINA”.
6
1. Opracowanie literaturowe zagadnień dotyczących tematu projektu.
1.1. Co to jest aplikacja internetowa
Aplikacja internetowa jest to program, w którym logika biznesowa programu może być
realizowana zarówno po stronie klienta jak i serwera, a dostęp do niej uzyskujemy poprzez
Internet[2]. Taka aplikacja wykonuje na rzecz użytkownika akcje. Nie ogranicza się wyłącznie
do wyświetlania treści, ale pozwala również na wprowadzenie danych, które następnie są w
odpowiedni sposób procesowane
Klient – zawiera interfejs, z którym bezpośrednio komunikuje się użytkownik programu.
o „Gruby” klient – typ aplikacji, w którym po stronie klienta znajduje się zarówno
interfejs, jak i logika aplikacji, czyli przetwarzanie danych. Natomiast po stronie
serwerowej zazwyczaj znajduje się baza danych oraz różnego rodzaju inne
serwery przechowujące dane. W przypadku takiej architektury większość
obciążenia związanego z przetwarzaniem danych spoczywa na komputerze
klienta. Takie rozwiązanie posiada dwie podstawowe wady. Po pierwsze
wydajność aplikacji w dużej mierze zależy od sprzętu, jakim dysponuje klient.
Wymusza to na nim inwestycję często w kosztowny sprzęt dla każdego z
potencjalnych użytkowników naszego programu. Kolejną cechą tego
rozwiązania jest trudna administracja rozproszoną aplikacją. Każda zmiana w
kodzie programu wymusza zmianę aplikacji u każdego z użytkowników.
Przykładem tego typu programów mogą być aplikacje Swing pisane w języku
Java.[3]
o „Cienki” klient – są to aplikacje, które jako interfejs wykorzystują przeglądarkę
WWW. Logika biznesowa w tym przypadku wykonywana jest na serwerze,
który pośredniczy pomiędzy interfejsem, a bazą danych, która przeważnie
znajduje się na tej samej maszynie. Zaletą takiej metody jest łatwe utrzymanie
programu. Aby wprowadzić poprawki wystarczy zaktualizować aplikację
działającą na serwerze, z której korzystają wszyscy klienci. Kolejnym aspektem
takiego rozwiązania jest mniej kosztowne utrzymanie komputerów klienckich.
Przeglądarki mają stosunkowo małe wymagania, a więc do korzystania z
aplikacji wystarczy komputer o niskich parametrach. Specyfiką tego
rozwiązania jest przeniesienie większości kosztu obliczeniowego na jedną
7
maszynę, co wymusza inwestycję w bardzo drogie serwery[3]. Program
rozwijany w ramach tej pracy jest tego typu aplikacją.
Serwer – jest to część aplikacji, która oferuje usługi na rzecz jednego lub większej ilości
klientów. W zależności od rodzaju aplikacji jego rola może sprowadzać się jedynie do
gromadzenia danych wysyłanych od klientów. Może również wykonywać całą logikę,
a z klientami komunikować się w celu uzyskania i dostarczenia informacji.
1.2 Java
Popularnym językiem programowania, a zarazem platformą komputerową jest Java. Została
ona stworzona przez firmę Sun Microsystems w roku 1995, przejętą przez Oracle w roku 2010.
Logo technologii przedstawione na rysunku 1 rozpoznawalne jest przez wielu użytkowników
nawet niezwiązanych z programowaniem.
Składnia Javy ma wiele wspólnego z C oraz C++, czerpie również z innych języków, w
większym stopniu stawia jednak na obiektowość. Umożliwia tworzenie zarówno prostych
aplikacji desktopowych, jak i skomplikowanych aplikacji biznesowych. Bardzo często
wykorzystywana jest do tworzenia internetowych aplikacji typu klient – serwer. Jest również
powszechnie używana w aplikacjach mobilnych, grach, tworzy się w niej oprogramowanie dla
różnego rodzaju odtwarzaczy oraz telewizorów. Jedną z charakterystycznych cech tego języka
jest możliwość uruchamiania skompilowanej aplikacji na różnych platformach. Implementacje
maszyny javy dostępne są dla wielu zróżnicowanych systemów. Program kompiluje się do bajt
kodu, który następnie można uruchomić na dowolnej maszynie, bez względu na architekturę[4].
Rysunek 1 Logo Java[7]
8
Pozwala to programistom rozwijać aplikację na jednej platformie, bez konieczności
dostosowywania programu do wielu systemów.
Java ułatwia pracę programisty poprzez system automatycznego zwalniania wolnej pamięci,
‘garbage collector’, czyli odśmiecacz pamięci. Programista wskazuje, kiedy chce stworzyć
obiekt, lecz Java odpowiada za określenie momentu, w którym zmienna nie jest już
wykorzystywana i ją usuwa. Uruchomiony odśmiecacz wykrywa obiekty, do których nie ma
już referencji, a następnie pozbywa się ich z pamięci. Jest to jeden z mechanizmów, przez który
uważa się, iż jest to język, który nie nadaje się do pisania aplikacji czasu rzeczywistego.
Pomimo automatycznego zarządzania pamięcią, w programie nadal może dojść do wycieku
pamięci. Dzieje się tak, gdy kod przechowuje referencje do obiektów, które nie są już
wykorzystywane. Jest to sytuacja niepożądana i zazwyczaj dość trudna do wykrycia. Zwłaszcza
we wczesnych wersjach Javy, zwalnianie pamięci często powodowało znaczący spadek
wydajności komputera. Przyczynia się to do problemów ze stabilnością wydajności programów,
w wyniku czego nie jest właściwym wyborem jeśli chodzi o aplikację czasu rzeczywistego.[4].
Częścią technologii odpowiedzialną za niezależność sprzętową oraz systemową jest wirtualna
maszyna Javy. Stanowi ona abstrakcyjną jednostkę obliczeniową, działającą analogicznie do
prawdziwego procesora, sterowaną przez instrukcje, która zarządza różnymi obszarami pamięci.
Wirtualna maszyna Javy do działania nie wymaga żadnego specyficznego systemu lub sprzętu.
Z powodzeniem działa na takich urządzeniach jak smartfony, komputery desktopowe, czy na
serwerach. Java nie jest jedynym językiem, który może być uruchamiany na wirtualnej
maszynie. Jedynym, czego potrzebuje ona do uruchomienia programu są pliki ‘class’
zawierające instrukcje dla maszyny oraz inne wymagane informacje. Jednym z języków, które
działają na wirtualnej maszynie Javy jest Scala.[5]
1.2.1 Spring Framework
Jednym z najpopularniejszych i najlepiej rozwiniętych lekkich frameworków jest Spring, jego
zadaniem jest ułatwienie oraz usprawnienie pracy w Javie EE. Serwisy, które oferuje mogą być
stosowane zarówno w apletach, standalone’owych klientach aplikacji, jak i aplikacjach
webowych. Umożliwia on stworzenie silnika servletowego do prostego programu, jak również
skomplikowanej aplikacji biznesowej. Framework Spring bierze pod uwagę wszystkie poziomy
9
architektoniczne typowej aplikacji Javy Enterprise. Logo platformy przedstawione zostało na
rysunku 2.
Rysunek 2 Logo Spring[22]
Najważniejszymi modułami Spring są:
Kontener zapewniający odwrócenie sterowania(ang. Inversion of Control) – Główny
kontener dostarczany przez Spring może zarządzać wszystkimi rodzajami obiektów
POJO, oraz działać z innymi komponentami framwork’u, aby zapewniać usługi oraz
konfigurację.
Programowanie aspektowe AOP(ang. Aspect-Oriented Programming) – ułatwia
zachowanie logicznego porządku. Funkcje, które w przeciwnym razie byłyby rozsiane
po różnych metodach, są zebrane w moduły w jednym miejscu. AOP używany jest np.
przy deklaratywnym zarządzaniu transakcjami.
Warstwa abstrakcyjna dostępu do bazy danych – Spring wspiera spójny dostęp do
danych, w tym celu udostępnia funkcjonalną warstwę abstrakcyjną ułatwiającą jego
wykonanie. Zawiera bogatą hierarchię wyjątków dostępu do danych oraz zapewnia
szeroki zasób serwisów wspomagających mapowanie obiektowo-relacyjne JPA(ang.
Java Persistence API).
Uproszczenie łącza do baz danych JDBC(ang. Java DataBase Connectivity) – dostarcza
abstrakcyjną powłokę JDBC, w znaczący sposób uproszczoną, oraz mniej błędogenną
w stosunku do JDBC. Wspiera bezpośredni dostęp do relacyjnych baz SQL.
Zarządzanie transakcjami – Framework zapewnia abstrakcję transakcji, która może
działać ponad globalnym interfejsem transakcji JTA(ang. Java Transacion API),
zarządzanymi przez serwer lub lokalnymi transakcjami przy użyciu JDBC, Hibernate
oraz innych interfejsów dostępu do danych.
Sieciowy framework Model Widok Kontroler MVC(ang. Model View Control) – Spring
zawiera framework MVC oparty o przeglądarkowe żądania. Używa współdzielonych
10
instancji wielowątkowych kontrolerów w sposób analogiczny do frameworka Struts,
lecz w sposób bardziej elastyczny. W prosty sposób integrują się one z kontenerami IoC.
Wszystkie ze Springowych komponentów mogą również współdziałać z innymi
frameworkami takimi jak Struts, czy JSF(ang. JavaServer Faces).
Uproszczenie pracy z interfejsem usług katalogowych Javy JNDI(ang. Java Naming and
Directory Interface), JTA oraz innymi interfejsami korporacyjnej Javy – Spring pomaga
w zwalczaniu zalegającego w programie kodu, który nie jest bezpośrednio używany ale
jest wymagany dla poprawnego działania. Odpowiednia konfiguracja Spring może w
100% pomóc pozbyć się wyszukiwania komponentów JNDI. Tak, aby programista mógł
skupić się na pisaniu kodu, który jest związany z tym co chce osiągnąć.
Lekki klient usług zdalnych – zapewnia wsparcie dla opartych na prostych obiektach
Javy POJO(ang. Plain Old Java Objects) usług zdalnych, bazujących na różnych
protokołach. Takich jak zdalne wywoływanie metod RMI(ang. Remote Method
Invocation), wymianę danych przez Internet IIOP(ang. Internet Inter-ORB Protocol),
protokół serwisów internetowych Hessian oraz innych usługach sieciowych.
Wsparcie dla interfejsu przesyłaniu komunikatów w Javie JMS(ang. Java Messaging
Service) – Spring pomaga w wysyłaniu oraz odbieraniu wiadomości JMS w sposób
dużo prostszy niż jest to zrealizowane w wersji korporacyjnej Javy.
Wsparcie dla technologii zarządzania oraz monitorowania aplikacji JMX(ang. Java
Management Extensions) – udziela wsparcia przy zarządzaniu JMX dla obiektów, które
konfiguruje.
Wsparcie dla zaawansowanych strategii testowania – Spring nie tylko pomaga we,
wprowadzeniu dobrego planu, umożliwiającego efektywne Unit testy, ale zapewnia
także kompleksowe rozwiązania umożliwiające testowanie aplikacji poza serwerem
aplikacji.[6]
1.2.2. Hibernate
11
Hibernate jest frameworkiem wykorzystywanym podczas implementacji warstwy dostępu do
danych. Zawiera rozwiązania dotyczące mapowania obiektowo-relacyjnego. Oznacza to
technologię, umożliwiającą mapowanie danych pomiędzy modelowym przedstawieniem
obiektów w programie, a ich reprezentacją w relacyjnej bazie danych. Różnice w prezentacji
danych w tych dwóch warstwach wymuszają na programiście sporego nakładu pracy na
rzutowanie, którego można uniknąć poprzez zastosowanie Hibernate.[7] Technologia
rozpoznawana jest poprzez logo widoczne na rysunku 3.
Ideałem, do którego dążą twórcy tej technologii jest sytuacja, gdzie dowolny obiekt POJO
będziemy w stanie bez żadnych problemów ani dodatkowego konfigurowania, zapisać w bazie
danych, a następnie go z niej pobrać. [8] Technologia Hibernate oferuje funkcjonalność
zbliżoną do opisanego założenia, wymagane jest jednak dokonanie konfiguracji. Ważne jest
również rozważenie kwestii wydajności niektórych rozwiązań. Hibernate spełnia swoje
fundamentalne założenie, czyli pozwala na zapisywanie obiektów POJO. Ilustracja 4 pokazuje,
w jaki sposób Hibernate wpasowuje się w aplikację między kod klienta, a bazę danych.
Rysunek 4 Rola Hibernate w aplikacji Java[8]
Podczas wykorzystywania Entity Java Beans zmuszeni jesteśmy do przestrzegania wielu
Rysunek 3 Logo Hibernate[23]
12
skomplikowanych konwencji nazewniczych, Hibernate nie nakłada na nas takich ograniczeń.
Jedynym, wymogiem jest posiadanie przez zapisywany obiekt domyślnego konstruktora[8].
Hibernate udostępnia proste w użyciu narzędzia, pozwalające na wygenerowanie schematu
bazy danych, bezpośrednio na podstawia obiektów POJO, które chcemy tam przechowywać.
Pozwala to na zaoszczędzenie dużej ilości czasu wymaganego wcześniej na żmudne tworzenie
schematu relacyjnej bazy danych. Dodatkowo przy użyciu dostępnych od Javy 5 adnotacji nie
ma potrzeby tworzenia konfiguracji mapowania obiektów w pliku xml[8]. Odpowiednie
obiekty i zmienne oznaczamy poprzez adnotacje, które są łatwe w użyciu, czytelne oraz proste
w utrzymaniu.
Technologia Hibernate przy pobieraniu danych z bazy rekomenduje wykorzystywanie
dostarczanego języka HQL, wprowadza to szereg korzyści. Największą zaletą tego języka jest
jego uniwersalność. Używamy tych samych poleceń i konstrukcji bez względu na to, z jakiej
bazy danych korzystamy, framework sam zadba o zgodność. Ma to niebagatelne znacznie przy
przenoszeniu aplikacji między bazami danych. Dzięki czemu nie jesteśmy przywiązani do
jednego rozwiązania i zwiększamy elastyczność naszej aplikacji. Język HQL w działaniu
wykorzystuje informacje zawarte w mapowaniu obiektów, pozwoliło to na skrócenie składni
oraz jej uproszczenie. W przypadku gdy nie chcemy z niego korzystać, Hibernate pozwala
również na pobieranie danych z wykorzystaniem natywnego języka SQL naszej bazy danych.
1.3. Javascipt
Javascript jest językiem programowania wykorzystywanym głównie na stronach internetowych.
Korzysta z niego większość witryn, jest również interpretowany przez wszystkie przeglądarki
w wielu urządzeniach takich jak komputery, smartfony, konsole oraz wielu innych. Stanowi
jedną z trzech podstawowych technologii, na których opiera się tworzenie stron internetowych.
Pierwszą z nich jest HTML, dzięki któremu jesteśmy w stanie zdefiniować zawartość, którą
chcemy zamieścić na stronie. Do technologii tych zaliczamy również CSS pozwalający na
zdefiniowanie tego, w jaki sposób zawartość naszej strony ma się prezentować. Ostatnią jest
Javascript, dzięki któremu określamy, w jaki sposób strona komunikuje się z użytkownikiem,
określa zachowanie strony. Technologia nie ma swojego
Javascript jest bez typowym, dynamicznym, interpretowalnym językiem wysokiego poziomu,
doskonale nadającym się do programowania zarówno obiektowo-zorientowanego jak i
13
funkcyjnego. Jego składnia bazuje na Javie, dziedziczenie oparte na prototypach było
inspirowane językiem Self, natomiast model budowania klas działa tak jak w Scheme. [9]
Nazwa Javascript jest nieco myląca i często prowadzi do nieporozumień. Po za
powierzchownym podobieństwem składni, nie ma on tak naprawdę wiele wspólnego z Javą.
Na początku swojego istnienia był to prosty język skryptowy, jednak dzięki rosnącej
popularności znacząco się rozwinął. Obecnie jest wydajnym językiem programowania
ogólnego zastosowania. Najnowsze wersje języka pozwalają na zastosowanie go również w
dużych, skomplikowanych projektach. Jest technologią, która nie ma właściciela lecz
społeczność programistyczna wyszła z propozycją nadania technologii loga, jest ono widoczne
na rysunku 5.
Każdy użyteczny język musi posiadać swojego rodzaju platformę, bibliotekę, lub interfejs w
celu wykonywania podstawowych operacji wyjścia-wejścia. Rdzeń Javasriptu definiuje jedynie
minimalny interfejs do pracy z tabelami, datami, tekstem, wyrażeniami regularnymi, lecz nie
definiuje żadnych operacji wyjścia-wejścia, ani innych bardziej wyszukanych narzędzi[9].
Dostarczeniem tych funkcjonalności zajmuje się środowisko klienta, na którym działa program,
czyli zazwyczaj przeglądarka internetowa.
1.3.1. ThreeJs
Nowoczesne przeglądarki powoli otrzymują nowe coraz potężniejsze narzędzia, którymi
można się posługiwać bezpośrednio z Javascriptu. Znaczniki HTML5 (ang. HyperText Markup
Language) pozwalają w prosty sposób dodać na stronie film oraz dźwięk, czy interaktywny
komponent przy pomocy ‘canvas’. Stosunkowo nowym nabytkiem do tego zestawienia jest
wsparcie WebGL. Przy pomocy tej technologii można bezpośrednio uzyskać dostęp do
zasobów obliczeniowych karty graficznej komputera[10]. Daje nam to możliwość tworzenia
wydajnej grafiki 2D oraz 3D w przeglądarce.
Rysunek 5 Nieoficjalne logo Javascript
Źródło: http://www.2ality.com/2011/10/logo-js.html
14
Programowanie w WebGL w przeglądarce bezpośrednio poprzez Javascript jest bardzo
skomplikowane, oraz podatne na błędy. Biblioteka Three.js czyni to zdecydowanie prostszym.
Niektóre z czynności, które upraszcza Three.js:
Tworzenie prostych oraz skomplikowanych geometrii 3D
Animowanie oraz poruszanie obiektami w scenie 3D
Dodawanie tekstur oraz materiału do obiektu
Tworzenie dwu wymiarowych grafik sprite[10]
Three.js posiada następujące narzędzia[11]:
Renderuje: WebGL, <canvas>, <svg>,kaskadowe arkusze stylów pozwalające
formatować obiekty poprzez transformacje 3D CSS3 3D (ang. Cascading Style Sheets),
obiektowy model dokumentu DOM (ang. Document Object Model), Software; efekty
jakie przy tym obsługuje: anaglif, stereoskopia i więcej
Sceny: dodawanie i usuwanie obiektów w czasie działania; mgła
Kamery: perspektywiczna oraz ortograficzna; kontrolery: manipulator kulkowy,
pierwszo-osobowy oraz inne
Animacje: morph oraz klatka kluczowa
Światła: rozmyte, kierunkowe, punktowe, miejscowe, półkula światła; cienie: rzucane i
otrzymywane
Materiały: Lambert(matowy) i Phong(błyszczący)
Shadery: dostęp do pełnych możliwości WebGL; Flara, przejścia w głąb, rozległa
biblioteka postprocesora
Obiekty: siatki, cząstki, linie, wstęgi, kości oraz wiele więcej, wszystkie z poziomami
detali
Geometrie: płaszczyzna, sześcian, sfera, torus, tekst trójwymiarowy i inne;
modyfikatory: tworzenie geometrii poprzez obrót krzywych(ang. lathe), nadawanie
dwuwymiarowym przekrojom głębokości poprzez przesuwanie go po krzywej(ang.
extrude)
Loadery: binarny, obrazów, lekkiego format wymiany danych JSON(ang. JavaScript
Object Notation) i scena(ang. scene)
Dodatkowe funkcjonalności: zestaw matematycznych funkcji do operacji w czasie i
przestrzeni trójwymiarowych w tym przecięcie bryły(ang. frustum), kwaterniony,
macierz, mapowanie UV(ang. UV mapping)
Export/Import: posiada narzędzia umożliwiające stworzenie kompatybilny obiekt
15
JSON z narzędzi takich jak: Blender, FBX(ang. Filmbox), 3D MAX i formatu plików
OBJ
Wsparcie: dokumentacja techniczna w trakcie tworzenia, działające publiczne forum
oraz wiki w serwisie GitHub
Przykład: ponad 150 plików z przykładami programów, dodatkowo gotowe czcionki,
modele, tekstury, dźwięki i wiele więcej
1.4. MySQL
MySQL to najbardziej popularny Open Source’owy system zarządzania bazą danych. Stanowi
on własność firmy Oracle, która zajmuje się jego rozwojem, dystrybucją oraz wsparciem.
Bazą danych nazywamy zbiór danych, który został zapisany z zachowaniem pewnego zestawu
reguł. Sama ich zawartość może być dowolna, mogą być to informacje zebrane w wyniku
eksperymentu naukowego, asortyment oraz lista klientów niewielkiego sklepu internetowego,
czy dane sprzedażowe potężnej korporacji. Aby być w stanie je zapisywać, przetwarzać, oraz
edytować wymagane jest posiadanie systemu zarządzania bazą danych takiego jak na przykład
MySQL. Komputery w znaczący sposób upraszczają operowanie dużymi zestawami danych,
często stanowią one kluczową rolę w różnego rodzaju systemach, zarówno jako samodzielne
źródło danych, jak i część większego programu[12].
W relacyjnych bazach danych informacje pogrupowane są według ich logicznych relacji w
tabele, rzędy, kolumny oraz widoki. Relacje między danymi definiowane są przez programistę
podczas tworzenia schematu bazy. Dostępne relacje to na przykład jeden do jednego, jeden do
wielu, wiele do wielu, wymagany, unikalny, opcjonalny, czy wskaźniki na dane miedzy
tabelami. Zadaniem bazy danych jest przestrzeganie ustalonych przez nas zasad. Wymusza ich
zgodność, dzięki czemu unikamy problemów takich jak duplikaty, niezgodność, dane
przestarzałe czy brakujące. Struktura oraz zawartość bazy danych zapisywana jest do plików
na dysku, dostęp do których jest optymalizowany w celu zapewnienia szybkości.
SQL jest strukturalnym językiem zapytań (ang. Structured Query Language),
najpopularniejszym ustandaryzowanym językiem służący do dostępu do bazy danych. Za jego
pomocą jesteśmy w stanie pobrać, dodać, zmodyfikować oraz usunąć dane znajdujące się w
bazie danych MySQL. Może być wykorzystywany w różnoraki sposób, można z niego
korzystać bezpośrednio poprzez tekstową konsolę. Zapytania mogą być zapisane w programie,
a użytkownik ma możliwość korzystać z nich poprzez wykonywanie różnego rodzaju akcji na
16
stronie. Program może też na przykład dostarczać swoją wersję języka, która następnie zostanie
przetłumaczona na ten używany przez bazę danych. Standard języka wykorzystywany obecnie
w MySQL to „SQL: 2003”, który został wydany w 2003 roku. Oprogramowanie udostępnione
jest na zasadach licencji GPL(General Public Licence). Oznacza to, iż każdy jest w stanie bez
ograniczeń pobierać oraz używać oprogramowania bez dodatkowych opłat. Dodatkowo kod
źródłowy jest udostępniony, co pozwala na analizowanie oraz modyfikowanie go wedle
własnych potrzeb. Logo oprogramowania przedstawione zostało na rysunku 6.
MySQL jest ceniony za swoją uniwersalność, z powodzeniem można uruchomić jego serwer
na komputerze stacjonarnym i korzystać z niego podczas tworzenia aplikacji równocześnie z
serwerem aplikacji, środowiskiem programistycznym czy przeglądarką. Po odpowiedniej
konfiguracji może w 100% wykorzystywać zasoby naszego komputera, tak aby wydajnie
dostarczać dane. Ponadto stwarza możliwość wykorzystywania go w klastrze połączonych ze
sobą siecią urządzeń[12].
Producenci od lat starają się rozwijać program w taki sposób, aby bez problemów zarządzać
wielkimi bazami danych. Jego szybkość, niezawodność i prostota użycia powodują, iż
dostarcza usług w Internecie na wysokim poziomie.
1.5. Adina
System Adina jest programem służącym do kompleksowej analizy struktur, płynów, przepływu
ciepła, elektromagnetyzmu oraz problemów złożonych fizycznie za pomocą metody elementów
skończonych[13]. Skrót ADINA oznacza automatyczną, dynamiczną, przyrostową, nieliniową
analizę (ang. Automic, Dynamic, Incremental, Nonlineral Analysys), są to słowa wchodzące w
skład loga oprogramowania rysunek 7.
Rysunek 6 Logo MySQL[25]
17
W skład systemy wchodzi 8 programów składowych odpowiadających za różne części
funkcjonalności. Razem tworzą jeden program oferujący pełen zakres usług. Struktura
programów składowych przedstawiona została na rysunku 8.
Rysunek 8Moduły systemu ADINA[13]
ADINA Structures – dostarcza najnowocześniejszych narzędzi do analizy naprężeń w
bryłach oraz konstrukcjach, zarówno w dwu- jak i trójwymiarze. Obsługuje modele
statyczne oraz dynamiczne, analiza może być liniowa lub nieliniowa, włączając w to
efekty nieliniowości materiału, dużych deformacji i warunków styku. [14] Adina
Rysunek 7 Logo Adina[26]
18
dostarcza nowoczesnych gotowych do użycia rozwiązań dla ciał stałych, kratownic,
belek, rur, płyt, powłok, przerw. Modele materiałów dla metali, ziemi i kamieni, plastiku,
tworzyw, drewna, ceramiki i betonu.
ADINA CFD – program, który w zaawansowany sposób wykorzystuje metody
elementów skończonych oraz kontroli objętości dla nieskompresowanych oraz
skompresowanych przepływów. Przepływ może napotykać ruchome elementy miedzy
płynami oraz między płynami i strukturami[15]. Procedura użyta w Adina CFD bazuje
na modelu dyskretyzacji elementów skończonych oraz skończonej objętości, z
najbardziej uniwersalnym i wydajnym podejściem do rozwiązania.
ADINA EM – elektromagnetyzm jest bardzo ważną dziedziną nauki i inżynierii. Jest to
istotne zjawisko zwłaszcza, gdy jego wyniki połączymy z wynikami układów
mechanicznych czy przepływów płynów. Można znaleźć wiele istotnych zastosowań
dla takich rozwiązań, np: silniki elektryczne, bilans energetyczny pieców, zabiegi
medyczne, przełączniki elektromagnetyczne, pompy elektromagnetyczne, przewodniki
fal, anteny, linie transmisyjne, nieniszczące testy metali i wiele innych. Wszystkie te
zjawiska elektromagnetyczne oraz zastosowania są opisywane przez ogólne równanie
Maxwell’a. Adina rozwinęła program ADINA-EM, aby umożliwić rozwiązywanie
równania Maxwell’a dla różnych danych początkowych oraz warunków
brzegowych[16]. Jest to funkcja szczególnie przydatna w przypadku problemów
wielofizycznych, czyli połączonych z deformacją struktur czy przepływami płynów.
ADINA Thermal – jest wykorzystywany w celu rozwiązywania problemów przepływu
ciepła w bryłach oraz konstrukcjach. Posiada przydatne funkcjonalności takie jak
wyliczanie radiacji pomiędzy bezwzględnymi geometriami, funkcje utworzenia,
rozpadu elementów i obsługę nieliniowego zachowania materiału[17].
ADINA FSI – do interakcji płynu i struktury dochodzi, gdy przepływ płynu powoduje
jej deformację. Natomiast odkształcenie to powoduje zmianę warunków brzegowych
przepływu. Adina posiada możliwość rozwiązywania tego typu problemów w
pojedynczym programie, gdzie płyny mogą być całkowicie sprzężone ze strukturą,
która może powodować silnie nie liniowe reakcje pod wpływem dużych deformacji,
nieelastyczności, kontaktu i zależności temperaturowych. Całkowite sprzężenie
struktury z płynem oznacza, że reakcja brył jest silnie uzależniona od reakcji płynu i na
19
odwrót.
Rysunek 9 pokazuje odkształcenie struktury pod wpływem przepływu płynu.
Rysunek 9 Interakcja struktury z płynem[27]
ADINA TMC – jest przeznaczona przede wszystkim do rozwiązywania problemów
termomechanicznych. Program obsługuje całkowicie sprzężone układy, gdzie
rozwiązania termiczne wpływają na rozwiązania strukturalne i odwrotnie. ADINA TMC
obsługuje również jednostronnie sprzężone układy, w których jedna z dziedzin
fizycznych wpływa na drugą, natomiast sprzężenie to nie zachodzi w odwrotnym
kierunku.
ADINA Multiphysics – problemy wielofizyczne są spotykane, gdy na wynik systemu
wpływają oddziaływania pomiędzy kilkoma osobnymi dziedzinami fizycznymi (np.
deformacja bryły, przepływ płynów, pole elektryczne, temperatura itd.). Wiele
problemów inżynieryjnych wymaga na jakimś poziomie współzależności pomiędzy
różnymi dziedzinami fizyki. W przeszłości z uwagi na brak możliwości obliczeniowych
takie oddziaływania były ignorowane lub brane pod uwagę w pewnym przybliżeniu[18].
Wraz z obecnymi możliwościami analitycznymi dostępnymi w Adinie wiele ważnych
efektów związanych z połączeniem różnych domen fizycznych może być teraz
wykorzystywanych w obliczeniach z większą dokładnością. Dzięki temu analizy
dostarczają dogłębnego wglądu w wydajność modelu, prowadzą do wydajniejszych
ekonomicznie i bezpieczniejszych produktów.
ADINA User Interface –dostarcza kompletnych narzędzi do przetwarzania
początkowego i końcowego dla wszystkich programów wchodzących w skład systemu
Adina[13].
20
ADINA Modeler – jest dodatkiem do interfejsu użytkownika. Dostarcza narzędzi do
tworzenia modeli oraz do integracji modeli z systemami CAD.
CAD/CAE Interfaces –w programie ADINA Modeler możemy bezpośrednio wczytać
geometrię CAD(np. NX, SolidWorks i Solid Edge), a także dodatkowo Adina dostarcza
programów umożliwiających wczytanie danych z systemów takich jak I-DEAS i Femap.
Pośrednio istnieje również możliwość wczytania informacji z innych programów
poprzez interfejs IGES(np. CATIA) [13].
Poza post- i preprocesorem Adina całkowicie wspiera obliczenia równoległe.
Dekompozycja dziedziny jest dokonywana automatycznie, a zrównoleglanie wspiera
obliczenia, składnie macierzy elementów, rozwiązywanie równań, oraz wyliczanie
wyników elementu[19]. System Adina jest globalnie stosowany w badaniach, przemyśle i
nauczaniu. Coraz częściej jest wykorzystywana wspólnie z programami CAD.
21
2. Cel pracy
Celem niniejszej pracy magisterskiej jest stworzenie aplikacji internetowej, która
umożliwiałaby wizualizację oraz dostarczała podstawowych narzędzi pomagających w analizie
modelu. A także testy wybranych technologii pod kątem przydatności w wizualizacji modeli.
Aplikacja do działania nie powinna wymagać od użytkownika instalowania żadnego
dodatkowego oprogramowania po za przeglądarką. Powinna być dostępna dla wielu
użytkowników równocześnie. Aplikacja powinna być intuicyjna i prosta w użyciu.
Do wizualizacji wykorzystywane będą modele tworzone w komercyjnym oprogramowaniu The
ADINA System. Modele wybrane zostaną pod kątem atrakcyjności modelu i jego
skomplikowania, w celu stworzenia jak najdokładniejszego narzędzia do konwersji.
Do budowy aplikacji internetowej wykorzystany zostanie szereg technologii. W części
serwerowej wykorzystany zostanie język programowania Java, z użyciem framework’a
aplikacji Spring, oraz Hibernate’a do realizacji warstwy dostępu do danych. Są to narzędzia
dostępne na rynku od wielu lat, które bardzo często są wykorzystywane w tego typu
programach. Interfejsem użytkownika będzie strona internetowa. Do jej budowy zastosowany
będzie framework CSS Bootstrap. Jest to zestaw prostych w użyciu narzędzi CSS, HTML oraz
Javascript ułatwiających tworzenie responsywnych stron internetowych.[20]. Modele
wizualizowane będą z wykorzystaniem biblioteki Javascript’owej Three.js. Natomiast
wszystkie wczytane dane zapisane zostaną w relacyjnej bazie danych MySQL.
22
3. Wykonanie przykładowych symulacji w programie komercyjnym.
Wszystkie symulacje zawarte w niniejszej pracy zostały wykonane przy wykorzystaniu
programu The ADINA System. Rozwiązane problemy pochodzą z dołączonej do programu
dokumentacji i są przykładowymi problemami, których rozwiązanie ma za zadanie nauczyć
użytkownika obsługi programu. Poniższy opis ma na celu przybliżenie czytelnikowi
wykorzystywanych modeli w celu łatwiejszego i dokładniejszego zrozumienia pracy.
3.1 Analiza FSI uproszczonej turbiny z wykorzystaniem siatki przesuwnej
Uproszczona turbina jest zanurzona w płynie tak jak na rysunku 10.
Na początku analizy turbina jest w spoczynku. Następnie na jej wejście zostaje nadane ciśnienie.
Płyn przepływa przez obudowę turbiny, przez co wirnik zaczyna się obracać.
Model jest dwuwymiarowy i płaski.
Rysunek 10 Uproszczona turbina[26]
23
W związku z tym, że turbina może się obracać nieokreśloną ilość razy wygodnie jest
modelować płyn otaczający turbinę razem z elementami, które się w niej obracają. Te elementy
poruszają się przez obiekty, które są w pobliżu obudowy tak jak na rysunku 11.
Rysunek 11 Rodzaje siatek naniesionych na model turbiny.[26]
Płyn może przepływać przez granicę poruszającej się siatki.
Istotne parametry części symulacji opisującej ruch płynu:
Właściwości fizyczne płynu:
o Gęstość – 1000 [kg/m3]
o Lepkość – 0.01 [kg/m∙s]
o Współczynnik sprężystości objętościowej – 1∙1020[Pa]
Siłą ciągu – stałą w czasie, 10000[Pa]
Czas – 120 kroków czasowych – 24 sekundy
24
Gotowy model wygenerowany w programie Adina został przedstawiony na rysunku 12.
Właściwości fizyczne opisujące ruchomą część modelu:
Materiał:
o Izotropowy liniowy elastyczny
o Moduł Younga – 2.07∙1011 [Pa]
o Współczynnik Poisson’a – 0.3
o Gęstość – 7800 [kg/m3]
o Współczynnik rozszerzalności cieplnej – 0 [1/K]
Granica interakcji FSI – na Rys.13 zaznaczona białą linią.
Punkt stały – w środku modelu, na rys.13 zaznaczony dwoma literami „B”.
Rysunek 12 Obudowa turbiny wraz ze zdefiniowanym płynem
25
3.2 Analiza klejonego wału z wykorzystaniem ADINA-M/PS
Analiza będzie dotyczyć wału oraz obręczy, które zostały przedstawione na rysunku nr 14.
Rysunek 13 Ruchoma część turbiny
26
Rysunek 14 Wał wraz z pierścieniem[26]
Pierścień jest przyklejony do wału.
Taki problem można by rozwiązać przy pomocy jednej geometrii. Jednak w tym przypadku do
rozwiązania użyte zostaną dwie geometrie wału, oraz pierścienia. Kształty zostaną sklejone ze
sobą przy pomocy siatki klejącej(ang. gluemesh).
Właściwości modelu:
Materiał:
o Izotropowy liniowy elastyczny
o Moduł Younga – 2.07∙105 [Pa]
o Współczynnik Poisson’a – 0.29
o Gęstość –0 [kg/m3]
o Współczynnik rozszerzalności cieplnej – 0 [1/K]
Nacisk – 2 [MPa], w kierunku osi Y, na rysunku nr 15 zaznaczony czerwonymi
strzałkami
27
4. Opis implementacji wykonanej aplikacji
4.1 Schemat bazy danych
Rysunek 15 Gotowy model wału i pierścienia, z zaznaczonym wektorem nacisku
28
Rysunek 16 Graf przedstawiający schemat bazy danych
29
Rysunek 16 zawiera graficzną reprezentację wygenerowanej struktury bazy danych. Każdy z
bloków reprezentuje jedną tabele oraz zawarte w nim atrybuty. Natomiast linie między nimi
obrazują zależności tabel.
Na górze grafu znajdują się trzy tabele, w których przechowywane są dane na temat
użytkowników systemu. Posiadanie konta jest konieczne w celu zalogowania się do aplikacji.
‘users’ zawiera loginy i hasła użytkowników, ‘roles’ przechowuje informacje o dostępnych
rolach w systemie, natomiast ‘user_roles’ mapuje użytkowników na poszczególne role.
Połączenia między tabelami informują, że jeden użytkownik może posiadać wiele ról, i na
odwrót. Zapisywane w systemie symulacje nie są w żaden sposób zależne od danych
zgromadzonych w tych tabelach. Jest to uproszczenie zastosowane świadomie, taka
funkcjonalność nie wnosiła by niczego nowego jeśli chodzi o temat pracy . Sposób połącznia
użytkowników z symulacjami w dużej mierze zależy od przeznaczenia oraz wymagań
stawianych końcowemu projektowi.
Na rysunku 16 poniżej tabeli z użytkownikami znajduje się blok o nazwie ‘simulation’. Dla
każdej wczytanej do systemu symulacji tworzony jest w niej pojedynczy wpis. Zawiera
informacje o jej nazwie, opisie, czy rodzaju przestrzeni, jest połączony przez relacje z innymi
tabelami przechowującymi dane modelu. ‘simulation_nodal_point’ zawiera numery oraz
współrzędne węzłów tworzących model. Połączenia między węzłami składowane są w tabelach
‘simulation_element_data’, ‘simulation_element_data_node’ oraz
‘simulation_element_data_node_value’. Pierwsza z nich tworzona jest dla każdej z geometrii
składających się na model, druga dla każdego z prymitywów, a ostatnia dla każdej z wartości.
Za zapisywanie wartości reprezentujących wyniki obliczeń, używane do tworzenia wykresów
odpowiada ‘simulation_deformation’. Zapisywane są w niej informacje o każdym z plików,
‘simulation_deformation_node’ składa się z danych o krokach czasowych, natomiast wartości
dla poszczególnych punktów odnotowane są w tabeli ‘simulation_deformation_node_value’.
Wszystkie tabele bazy danych mają swoje odpowiedniki klas w aplikacji, te obiekty zawierają
identyczne pola oraz zależności między sobą. Wczytywanie oraz zapisywaniem klas w bazie
danych zarządza technologia Hibernate. Dzięki zdefiniowanym relacjom podczas zapisu nowej
symulacji do bazy danych nie ma konieczności zapisywania całej hierarchii obiektów ręcznie.
Do odpowiednich metod technologii przesyłane są jedynie obiekty ’Simulation’, które
zawierają wszystkie potrzebne informacje, a Hibernate sam odpowiednio przygotuje dane do
zapisu w bazie danych.
30
4.2 Eksport danych z Adiny
Podczas czynności związanych z operacjami na symulacji, czyli tworzenia modelu,
wprowadzania danych symulacji oraz przeprowadzania obliczeń program ADINA generuje
duże ilości danych. Wśród nich znajdują się informacje potrzebne do działania postprocesora,
np.:
Informacje o współrzędnych punktów modelu – W zależności od przeprowadzanej
symulacji jedno-, dwu- lub trójwymiarowej do stworzenia graficznej reprezentacji
modelu potrzebne są informacje o punktach go tworzących. Zazwyczaj jest to lista
ponumerowanych punktów oraz ich współrzędne składowe w układzie współrzędnych.
Są to punkty tworzone podczas wprowadzania modelu do systemu.
Informacje o połączeniach punktów - Aby poprawnie odtworzyć model wprowadzony
do programu potrzebne są również informacje o tym, w jaki sposób punkty, które
wchodzą w jego skład są ze sobą połączone. W grafice komputerowej modele składają
się z mniejszych elementów składowych, czyli prymitywów. Połączenia między
punktami zapisuje się w formie grupy numerów reprezentujących punkty, które
wchodzą w skład jednego elementu składowego.
Informacje o wyniku obliczeń – Są to dane, które umożliwią analizę wyników
wykonanej symulacji poprzez wyświetlenie wykresu. Mogą to być informacje o
przesunięci punktów w wyniku działających warunków. Wielkości sił działających na
punkty, czy zmieniające się warunki fizyczne w wyniku zachodzących w modelu
procesów.
Podczas tworzenia modelu oraz wykonywania symulacji powstaje szczereg plików z których
część zawiera informacje, które można wykożystać w dalszym procesowaniu.
Tabela 1Lista możliwych plików do wygenerowania z programu ADINA
Rozszerzenie pliku Pochodzenie Zawarte informacje
in Jeden z formatów, do którego
zapisać możemy gotowy model.
Plik tekstowy zawierający listę
spisanych komend umożliwiających
odtworzenie modelu.
idb Jeden z formatów, do którego
zapisać możemy gotowy model.
Plik bazy danych zawierający dane
w formie binarnej. Nieczytelny bez
znajomości szczegółów zapisu.
31
nas Eksport modelu do programu
NASTRAN
Plik tekstowy zawierający dane
dotyczace modelu. Współrzędne
punktów, ich połączenia, oraz inne
podstawowe informacje takie jak
zdefiniowane w symulacji siły.
unv Eksport modelu do formatu
Universal programu I-DEAS
Zawiera te same informacje co plik
‘nas’. Lecz są inaczej sformatowane
dat Powstaje podczas zapisu
gotowego modelu do
przprowadzenia symulacji
Plik tekstowy zawierający
wszystkie dane na temat modelu i
warunków fizycznych
przeprowadzanej symulacji.
Zawiera współrzedne punktów
składowych, połaczenia między
punktami oraz takie informacje jak
dane własności materiału, funkcje
czasu, warunki początkowe i inne.
mds, res, por Powstaje po przeprowadzonej
symulacji
Zawiera nieczytelne dane binarne.
out Powstaje po przeprowadzonej
symulacji
Zawiera podsumowanie
przeprowadzonej symulacji. Zużytą
pamięć, czas trwania obliczeń itp.
dowolny W trybie post-procesora z menu
List, opcja Value list -> Zone
Możliwość zapisu różnego rodzaju
danych dotyczących
przeprowadzonej symulacji do pliku
tekstowego o dowolnym
rozszerzeniu. Umożliwia zapis od
jednej do 6 kolumn z różnymi
informacjami np. naprężeniem,
przemieszczeniem, ciśnieniem,
czasem.
32
Jak informuje tabela 1 pliki mds, res, por oraz idb nie są użyteczne z punktu widzenia
opisywanej w tej pracy aplikacji. Plik por zawiera najwięcej przydatnych danych. Na jego
podstawie ładowany jest zarówno model jak i wszystkie informacje o wykonanej symulacji, na
bazie których działa postprocessor Adiny. Niestety plik ten zawiera dane zapisane w formacie
binarnym. Ich odczytanie bez kodu źrudłowego byłoby bardzo trudne lub wręcz niemożliwe.
Z pozostałych plików te eksportowane do formatów ‘unv’ oraz ‘nas’ zawierają identyczne dane.
Podobne informacje zawiera plik ‘dat’, zapisane w nim dane są jednak lepiej opisane jest ich
również wiecej.
C*** [4] MASS AND DAMPING CONTROL
0 0 0 0 0.0 0.0 0
0.100000E-3 0 0
0 0 0 0 0 0
C*** [5] EIGENVALUE SOLUTION CONTROL
0 1 0 -1 0 0 0 0 1 0.0 1
50
0 0 0 0 1 0 1 0.0
0.0.540000000
C*** [6] TIME INTEGRATION METHOD CONTROL
0 0.500000000.250000000 0 0 0 0 0.010000000
0
1.900000000.0010000008.00000000 0.0
0.01.00000000.500000000
Każda kolejna sekcja poprzedzona jest znacznikiem ‘C***’ oraz unikalnym tytułem, dzięki
czemu w prosty sposób można skonstruować parser wyciągający z tekstu dokładnie te
informacje, które są nam potrzebne. Dodatkowo tytuły są łatwo zrozumiałe, dzięki czemu w
prosty sposób można wywnioskować, czego dotyczą przedstawione wartości. Dla porównania
w formacie ‘unv’, jako nagłówki wykorzystywane są wartości liczbowe gdzie wartość
‘2411‘ oznacza węzły. Więcej informacji zawartych w pliku ‘dat’ daje większe możliwości
rozwoju programu w przyszłości. Na podstawie przedstawionych argumentów, jako źródło
informacji o wczytywanym modelu oraz o warunkach symulacji wybrano plik ‘dat’.
W przypadku danych dotyczących wyników dokonanych obliczeń jedynym rozwiązaniem było
pobieranie ich poprzez funkcję ‘Value list’. Interfejs ten udostępnia wiele interesujących
danych dotyczących wyniku przeprowadzonych obliczeń. W zależności od rodzaju wybranych
informacji oraz zastosowanych technik przybliżania, program wypisuje wartości różnych
wielkości fizycznych dla węzłów, prymitywów, lub poszczególnych punktów w prymitywie.
33
Wartości te mogą być wyliczone dla poszczególnych osi układu współrzędnych, lub mogą być
od niej niezależne. Przykładowa część wygenerowanych danych.
ADINA: AUI version 9.0.0, 25 August 2015: Primer problem 37: FSI
analysis of a simplified turbine, solid model
Licensed from ADINA R&D, Inc.
Finite element program ADINA, response range type load-step:
Listing for zone WHOLE_MODEL:
Element field variables are evaluated using RST interpolation
and smoothed with nodal average values.
On shell sections, element variables are evaluated on the shell
top layer, t = 1.00
POINT STRAIN-XX STRAIN-YY STRAIN-ZZ
Time 2.00000E-01
Node 1 0.00000E+00 -3.62224E-09 -3.27458E-09
Node 2 0.00000E+00 -2.87238E-09 -2.89191E-09
Node 3 0.00000E+00 -2.15482E-09 -2.50844E-09
Node 4 0.00000E+00 -1.61716E-09 -4.60001E-09
Node 5 0.00000E+00 -2.87702E-09 -2.89566E-09
Node 6 0.00000E+00 -4.13892E-09 -1.18782E-09
Node 7 0.00000E+00 6.15760E-09 -8.15932E-09
Node 8 0.00000E+00 -2.87499E-09 -2.89698E-09
Node 9 0.00000E+00 -1.19133E-08 2.36727E-09
Jak widać nagłówek wygenerowanego pliku zawiera informacje na temat pochodzenia
zawartych danych oraz sposobie ich wyliczenia. Przedstawione dane dotyczą odkształcenia
wirnika turbiny pod wpływem przepływu cieczy. Dane wygenerowane są dla trójwymiarowego
34
układu jednak jak widać wartości dla osi X są zerami, ponieważ model jest dwuwymiarowy.
35
4.3 Wczytywanie danych z dostarczonych plików.
Część kodu odpowiedzialnego za wczytywanie danych przedstawiona jest na diagramie klas na
rysunku 17.
Rysunek 17 Diagram klas części wczytującej dane
36
Dane na temat modelu oraz przebiegu symulacji możemy wczytać do systemu na dwa sposoby.
Podczas dodawania nowego modelu oraz edycji już istniejącego.
Rysunek 18Interfejs - dodawanie i edycja modelu
Na rysunku 18 strzałką wskazany jest panel, poprzez który możemy dojść do ekranu dodawania
oraz edycji symulacji.
37
Rysunek 19Interfejs - Okno dodawania symulacji
Strona dodawania nowej symulacji widoczna na rysunku 19 umożliwia wprowadzenie nazwy,
po której będziemy identyfikować model, oraz opisu słownego, który umożliwi innym
użytkownikom zorientowanie się czego dotyczy wczytany model. Pole ‘Simulation files’ służy
do wczytywania plików z danymi. Akceptowane są pliki ‘dat’ z danymi modelu oraz ‘txt’ z
informacjami o wynikach obliczeń. W przypadku dużej ilości węzłów takie pliki mogą być
bardzo duże, powyżej 100 MB, wiec została wprowadzona obsługa danych skompresowanych.
Piki, które chcemy załączyć można spakować do formatu ‘zip’, a system dokona dekompresji
archiwum już po stronie serwera. Dzięki takiemu rozwiązaniu użytkownik oszczędza dużo
czasu na załączaniu plików.
38
Rysunek 20 Interfejs – okno edycji
Strona edycji udostępnia użytkownikowi te same informacje, co strona dodawania symulacji, a
dodatkowo umożliwia zmianę wczytanych z plików wartości, rysunek 20. Przy kilku tysiącach
węzłów, po stworzeniu dla każdego z nich pola tekstowego strona stała by się nieczytelna. Więc
w zakładce ‘Options’ widocznej na rysunku 21 udostępniona została możliwość ograniczenia
listy wyświetlanych danych.
Rysunek 21 Interfejs – okno edycji, opcje
Po wczytaniu plików wysyłane są one na serwer, następnie archiwa są rozpakowywane, a pliki
umieszczane w liście. W zależności o rozszerzenia pliku są one analizowane w odpowiedni dla
siebie sposób, pliki błędne są ignorowane. Ta funkcjonalność realizowana jest w klasie
‘SimulationDataExtractionADINA’ w następujący sposób.
39
for(Entry<String, List<String>> file:fileList.entrySet())
{
if(file.getKey().endsWith(".dat")){
analyzeDatFile(file);
}
if(file.getKey().endsWith(".txt")){
deformationCounter = analyzeTxtFile(deformationCounter,
file);
}
}
4.3.1 Wczytywanie danych o węzłach
Dane o węzłach modelu znajdują się w pliku ‘dat’ w bloku zatytułowanym ‘NODAL POINT
DATA’. Dla symulacji struktur informacje zorganizowane są w następujący sposób:
C*** NODAL POINT DATA
1 0.000000000000 -1.700000000000 0.1500000000000 0
0 1 0 0
1 0 0 0 0 0 0
0 1 2 0 0 0
2 0.000000000000 -1.700000000000 0.000000000000
0 0 1 0 0
1 0 0 0 0 0 0
0 3 4 0 0 0
3 0.000000000000 -1.700000000000 -0.1500000000000
0 0 1 0 0
W plikach opisujących symulacje zawierające interakcje z płynami wygląda to nieco
odmiennie.
C*** NODAL POINT DATA
1 0 1 2 3 0 0
0
0 0 0 0
0.000000000000 0.1500000000000 1.700000000000 1
2 0 4 5 6 0 0
40
0
0 0 0 0
0.000000000000 0.1500000000000 1.557142857143 1
3 0 7 8 9 0 0
0
0 0 0 0
0.000000000000 0.1500000000000 1.414285714286 1
Na załączonych częściach plików numer węzła został zaznaczony kolorem czerwonym.
Niebieskim kolorem wyszczególnione zostały współrzędne węzła w układzie współrzędnych.
Pozostałe dane są nieistotne z punktu widzenia aplikacji. Numery oraz współrzędne węzłów
pobierane są w klasie ‘ConvertDatFileAdina’, dla modeli struktur kod za to odpowiedzialny
wygląda następująco:
String pointNr = StringUtils.strip(line.substring(0, 10));
String pointX = StringUtils.strip(line.substring(10, 30));
String pointY = StringUtils.strip(line.substring(30, 50));
String pointZ = StringUtils.strip(line.substring(50, 70));
Natomiast dla płynów:
String pointNr = StringUtils.strip(line.substring(0, 10));
String pointX = StringUtils.strip(line2.substring(0, 20));
String pointY = StringUtils.strip(line2.substring(20, 40));
String pointZ = StringUtils.strip(line2.substring(40, 60));
Zmienna ‘line’ zawiera obecnie przetwarzaną linię, natomiast zmienna ‘line2’ zawiera linię
znajdującą się dwa wiersze niżej. Przy przetwarzaniu wykorzystany został fakt, iż odległości
między zmiennymi w pliku są stałe. Pozwala to na wycinanie danych z linii według stałych
wartości. Wycięte informacje przekształcane zostają do odpowiednich wartości liczbowych, a
na końcu umieszczane w obiektach ‘SimulationNodalPoint’, które zapisywane są w bazie
danych.
4.3.2 Wczytywanie danych o prymitywach
Prymitywy zapisywane są w pliku ‘dat’ w bloku o nazwie ‘ELEMENT DATA’, dodatkowe
informacje o siatce znajdują się w rozdziale ‘ELEMENT GROUP’. Obydwie te grupy mogą
znajdować się w jednym pliku wielokrotnie, raz dla każdej zdefiniowanej w modelu siatki. Dla
modelu strukturalnego wygląda to następująco.
41
*** ELEMENT GROUP 2 THREEDSOLID
3 357 0 0 0 0 8 1 0 2 2 0 0 0 1 1
0 0 0 2
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 -1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 26 0 2 0 0 0
0.000000000000 0.000000000000 0.000000000000
0.000000000000
0.000000000000 0.1000000000000E-01 0.000000000000
0.000000000000
0.000000000000 1.000000000000 0.000000000000
0.000000000000
0.000000000000 0.000000000000 0.000000000000
0.000000000000
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0
1
8 17441
W przypadku symulacji zawierających przepływ płynu:
C*** ELEMENT GROUP 1 TWOD
60 0 0 0 0 0 0
0
2 836 0 0 1 0 4
1
111 3 0 0 0 0 1
1
0 0 1 0 0 0 0
0
42
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0
1
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0
1
0 0 0 0
Kolorem czerwonym zaznaczony został numer siatki, niebieski kolor wskazuje na tekst
informujący o rodzaju przestrzeni, w jakiej stworzony został model, dwu lub trój wymiarowej.
Kolorem zielonym wyróżniona została liczba prymitywów w siatce, natomiast fioletowym
największa ilość węzłów wchodząca w skład prymitywu.
Formatowanie bloku ‘ELEMENT DATA’ dla modelu nie zawierającego przepływu płynów:
C*** ELEMENT DATA
11 4 0 0 1 0 1 0.0 0 1 0.0 0 0
625 908 560 531
21 4 0 0 1 0 1 0.0 0 1 0.0 0 0
1047 622 854 543
Dla symulacji gdzie modelowana była interakcja z płynem:
C*** ELEMENT DATA
1 4 0 1 0.00000000E+00 0.00000000E+00
1 2 10 9
2 4 0 1 0.00000000E+00 0.00000000E+00
2 3 11 10
Kolor czerwony oznacza numer prymitywu, fioletowy ilość węzłów, a niebieski numer węzła
w wierzchołku prymitywu.
Ilość punktów może się zmieniać w ramach jednego bloku ‘ELEMENT DATA’, stała pozostaje
za to odległość między kolejnymi liczbami oraz ilość danych mieszczących się w jednej linii.
W związku z tym kod wycinający numery z tekstu przyjmuje dość skomplikowaną formę.
for (int i = 0; i < numberOfPointsInt; i++) {
if (i < 8) {
points.add(StringUtils.strip(StringUtils.substring(
line.get(index + 1), i * 10, 10 + (i * 10))));
} else {
43
points.add(StringUtils.strip(StringUtils.substring(
line.get(index + (1 + i / 8)),
(i - (i / 8) * 8) * 10, 10 + ((i - (i / 8) * 8) * 10))));
}
}
Pętla iteruje po ilości punktów w prymitywie, jeśli iterator jest większy bądź równy ilości liczb
mieszczących się w linii, czyli 8, wartości pobierane są z kolejnej linii tekstu. Punkty dodawane
są do listy, z której następnie umieszczane są w obiektach zapisywanych w bazie danych
‘SimulationElementDataNodeValue’.
4.3.3 Wczytywanie danych o wynikach
Wczytywanie danych o wynikach symulacji odbywa się w klasie
‘ConvertDislocationFileAdina’, widocznej na diagramie klas na rysunku 18. Pliki, w których
zawarte są informacje mogą być sformatowane na 3 różne sposoby.
Dane o wynikach obliczeń wypisywane są dla każdego węzła.
POINT X-DISPLACEMENT Y-DISPLACEMENT Z-DISPLACEMENT
Time 2.00000E-01
Node 1 0.00000E+00 -2.63865E-05 -2.99195E-04
Node 2 0.00000E+00 2.64970E-08 -2.99192E-04
Node 3 0.00000E+00 2.64395E-05 -2.99190E-04
Node 4 0.00000E+00 -2.63902E-05 -2.63978E-04
Dane wypisywane dla każdego prymitywu.
POINT STRESS-XX STRESS-YY STRESS-ZZ
Time 8.40000E+00
Element 1 of element group 1
Int point 11 -4.11899E+03 -4.11897E+03 -4.11909E+03
Element 2 of element group 1
Int point 11 -4.09357E+03 -4.09353E+03 -4.09363E+03
Element 3 of element group 1
Int point 11 -3.94421E+03 -3.94415E+03 -3.94428E+03
Dane wypisywane dla każdego węzła w prymitywie
POINT STRAIN-XX STRAIN-YY STRAIN-ZZ
Time 4.00000E-01
44
Element 1 of element group 1
Int point 11 0.00000E+00 -4.73956E-09 -6.50724E-09
Int point 12 0.00000E+00 -5.04839E-09 -6.22597E-09
Int point 13 0.00000E+00 -5.35721E-09 -6.04966E-09
Int point 21 0.00000E+00 -3.31131E-09 -7.61374E-09
Int point 22 0.00000E+00 -4.44028E-09 -6.90496E-09
Int point 23 0.00000E+00 -5.56926E-09 -6.34575E-09
Int point 31 0.00000E+00 -3.23409E-09 -8.72025E-09
Int point 32 0.00000E+00 -4.81865E-09 -7.58395E-09
Int point 33 0.00000E+00 -6.40322E-09 -6.64185E-09
Element 2 of element group 1
Int point 11 0.00000E+00 -7.64786E-09 -2.56067E-09
Int point 12 0.00000E+00 -6.13082E-09 -3.64257E-09
Int point 13 0.00000E+00 -4.61379E-09 -4.50907E-09
Int point 21 0.00000E+00 -7.53694E-09 -3.68807E-09
Int point 22 0.00000E+00 -6.42973E-09 -4.35588E-09
Int point 23 0.00000E+00 -5.32252E-09 -4.81882E-09
Int point 31 0.00000E+00 -6.08388E-09 -4.81548E-09
Int point 32 0.00000E+00 -5.77857E-09 -5.06918E-09
Int point 33 0.00000E+00 -5.47327E-09 -5.12857E-09
Na zielono zaznaczony został moment w czasie, którego dotyczą dane, na czerwono
wyróżnione są numery węzłów, na niebiesko wartości, fioletowy kolor oznacza opis osi.
Wartości mają stałą długość, oddalone są również o tą samą odległość, więc metoda je
pobierająca ‘convertFile’ wykorzystuje wycinanie łańcuchów. Najważniejszą częścią tej
metody jest pętla iterująca po liniach pliku i wycinająca z nich odpowiednie dane w zależności
od tekstów charakterystycznych. Pętla poruszająca się po liniach pliku wygląda następująco:
for (int i = 0; i < fileLines.size(); i++) {
String line = fileLines.get(i);
Pierwszy warunek w pętli ‘line.contains(POINT)’ sprawdza czy linia zawiera słowo ‘POINT’,
jeśli tak oznacza to, że ta linia zawiera opis wartości. Opisy są pobierane i zapisywane w
zmiennej ‘deformation’. Flaga ‘startProcessing' jest ustawiana na ‘true’ oznacza to, iż kolejne
linie będą zawierać informacje o punktach czasowych i wartościach.
45
if (!startProcessing && line.contains(POINT)) {
startProcessing = true;
String[] description = line.split("\\s+");
if (description != null && description.length == 5)
deformation.setPointsDescription(description[2]+"|"
+ description[3] + "|" + description[4]);
else
deformation.setPointsDescription("Unknown");
System.out.println("Deformation nodes description: " +
deformation.getPointsDescription());
}
if (startProcessing) {
Warunek zawierający ‘line.contains(TIME))’ wycina z obecnej linii informacje o przedziale
czasowym, dla którego pobierane będą dane znajdujące się niżej. Każde takie miejsce oznacza
początek kolejnego bloku z wartościami.
if (!startSearchingForNodes && line.contains(TIME)) {
time = Double.parseDouble(findTime(line));
System.out.println("Time: " + time);
startSearchingForNodes = true;
node = new SimulationDeformationNode();
node.setDeformationTime(time);
lastGroup = 0;
lastNumber = 0;
numberToAdd = 0;
}
Jeśli linia zaczyna się od ‘NODE’ zawiera wartość dla węzła budującego model, dane dodawane
są do odpowiedniego obiektu.
if (startSearchingForNodes && line.startsWith(NODE)) {
SimulationDeformationNodeValue val = findNode(line);
val.setSimulationDeformationNode(node);
deformationNodeValue.add(val);
extractingNodes = true;
46
}
‘ELEMENT_FOR_EVERY_NODE’ oznacza, że w linii znajdują się wartości węzłów dla
poszczególnych prymitywów.
if (startSearchingForNodes &&
line.startsWith(ELEMENT_FOR_EVERY_NODE)) {
deformation.setElement(true);
valElem = findElementNode(line);
valElem.setSimulationDeformationNode(node);
extractingNodes = true;
}
Jeśli linia zawiera znacznik ‘ELEMENT_FOR_PRIMITIVE’ znajdują się w niej dane dla
każdego prymitywa.
if (startSearchingForNodes &&
line.startsWith(ELEMENT_FOR_PRIMITIVE)) {
valElem = findElementNodeValue(valElem, line);
valElem.setNodeNr(primitiveCounter);
SimulationDeformationNodeValue copyObject =
new SimulationDeformationNodeValue(valElem);
deformationNodeValue.add(copyObject);
extractingNodes = true;
primitiveCounter += 1;
}
Ostatni warunek zostaje uruchomiony, gdy dwie ostatnie linie są puste. Taka sytuacja oznacza,
że pobrane zostały wszystkie dane, a zgromadzone obiekty należy umieścić w obiekcie
zbiorczym ‘SimulationDeformationNode’. Flagi oraz zmienne pomocnicze są zerowane, aby
przygotować kod do obsługi bloku z danymi dla następnego przedziału czasowego.
if (startSearchingForNodes && extractingNodes &&
StringUtils.isEmptyOrWhitespaceOnly(line) &&
StringUtils.isEmptyOrWhitespaceOnly(exLine)) {
node.setSimulationDeformationNodeValue(deformationNodeValue);
node.setSimulationDeformation(deformation);
deformation.getSimulationDeformationNode().add(node);
deformationNodeValue =
new ArrayList < SimulationDeformationNodeValue > ();
47
startSearchingForNodes = false;
extractingNodes = false;
primitiveCounter = 0;
}
exLine = line;
}
}
Zakończenie się pętli oznacza, że wszystkie dane zostały zgromadzone w odpowiednich
obiektach, co umożliwi zapisanie ich w bazie danych.
48
4.4 Wybór modelu oraz translacja danych
Rysunek 22 Diagram klas części przetwarzającej dane
49
Diagram klas widoczny na rysunku 22 przedstawia całość funkcjonalności odpowiedzialnej za
przetworzenie danych w sposób użyteczny dla biblioteki ThreeJs, która umożliwi wyświetlenie
modelu. Szczegóły implementacji zostaną wytłumaczone w kolejnych podrozdziałach.
Interfejs użytkownika skupiony jest na zakładce ‘Simulations’ w bloku ‘View options’
widocznym na rysunku 23.
Rysunek 23 Interfejs - opcje widoku
Select model to show – umożliwia wybranie modelu, który chcemy zwizualizować. Model
możemy rozpoznać po nazwie nadanej mu podczas dodawania.
Select data to modificate nodes positions – jeżeli podczas dodawania modelu wczytane
zostały dane o dyslokacji, możemy je wybrać, aby przy ich pomocy wizualnie odkształcić
wczytany model.
Select data to modificate model color – jakiekolwiek dane wczytane z plików ‘txt’
eksportowane z Adiny, możemy użyć do zwizualizowania zjawisk działających podczas
symulacji. Informacje służą do naniesienia na części modelu odpowiednich kolorów. Na
podstawie wartości i odpowiadającym im barwom tworzona jest skala umożliwiająca
przeanalizowanie widocznego obrazu.
Select time interval – pozwala na wybranie przedziału czasowego.
Multiply nodes position values by – wartości przemieszczenia często są zbyt małe w stosunku
do modelu, aby zauważyć jakiekolwiek zmiany. Opcja ta umożliwia przemnożenie ich przez
ustaloną wartość tak, aby uwidocznić jakiekolwiek zmiany.
Show element mesh – nanosi na model uproszczoną siatkę prymitywów.
50
4.4.1 Przetwarzanie danych o węzłach
W przypadku gdy w modelu nie zostają wykorzystane dane o przemieszczeniu, przetwarzanie
węzłów sprowadza się jedynie do przepisania wartości z obiektów ‘SimulationNodalPoint’ do
listy tabel, która następnie wysyłana jest do modułu wyświetlania.
for (SimulationNodalPoint node : getSimulationNodalPoint()) {
nodalPoints.add(
new Double[] { node.getX(), node.getY(), node.getZ() });
}
Istotne jest zachowanie oryginalnej kolejności punktów, ponieważ to ona stanowić będzie
numerację węzłów, na podstawie której budowane są prymitywy.
4.4.2 Przetwarzanie danych o prymitywach
W tym miejscu aplikacji najważniejsza jest konwersja elementów skończonych Adiny na
prymitywy używane w grafice komputerowej. Podczas generowania siatki w programie Adina
mamy możliwość wyboru jednego z wielu różnych elementów.
Rysunki 24 oraz 25 przedstawiają 6 różnych elementów podstawowych dla przestrzeni
dwuwymiarowej.
Rysunek 24 Elementy dwu wymiarowe - 3,6 oraz 7
węzłowy trójkąt[28]
Rysunek 24 Elementy dwu wymiarowe - 4,8 i 9 węzłowe
czworokąty[28]
Rysunek 25Elementy dwu wymiarowe - 4,8 i 9 węzłowe
czworokąty[28]
51
Rysunek 26 Elementy trój wymiarowe - bryły 6, 8 oraz 5 węzłowe[28]
Rysunek 27 Elementy trójwymiarowe - bryły 15, 20 oraz 13 węzłowe[28]
Rysunek 28 Elementy trójwymiarowe – bryły 21 oraz 14 węzłowe[28]
Rysunek 29 Elementy trójwymiarowe - bryły 4, 10 oraz 11 węzłowe[28]
Rysunki 26, 27, 28 i 29 przedstawiają 11 elementy programu Adina w przestrzeni
trójwymiarowej. Wszystkie te prymitywy zarówno dwu-, jak i trójwymiarowe muszą być
52
przekształcone na trójwęzłowy trójkątny element, którym operuje biblioteka ThreeJs, taki jak
przedstawiony na rysunku 24. Translacja dokonywana jest w klasie
‘AdinaMeshToPrimitivesConvert’ przy wykorzystaniu abstrakcyjnego obiektu
‘PrimitiveConvert’ oraz dziedziczących po nim klas.
W zależności od ilości węzłów znajdujących się w kształcie podstawowym oraz od rodzaju
przestrzeni dane wysyłane są do odpowiedniej klasy dziedziczącej po ’PrimitiveConvert’. W
każdym z tych obiektów znajduje się lista z odpowiednimi numerami węzłów, mapująca dany
prymityw na trójkąty. Na przykład mapowanie czterowęzłowej bryły przedstawionej na
rysunku 29 wygląda następująco:
template = new ArrayList<Integer[]>();
template.add(new Integer[]{3,0,1,});
template.add(new Integer[]{3,1,2});
template.add(new Integer[]{3,0,2});
template.add(new Integer[]{1,0,2});
Występujące w tablicach numery odpowiadają indeksowi obiektu w liście węzłów danego
kształtu. W efekcie uzyskujemy obiekt zawierający tablicę z numerami odpowiadającymi
indeksom węzłów znajdujących się w kontenerze, którego generowanie opisane zostało w
poprzednim podrozdziale. Na podstawie tych dwóch obiektów jest możliwe wygenerowanie
grafiki modelu.
4.4.3 Przetwarzanie danych o wynikach symulacji
Przetwarzanie danych potrzebnych do stworzenia wykresów odbywa się w klasie
‘DislocationAdina’, która korzysta z ‘ColorArea’. W przypadku przekształcania modelu przy
pomocy danych z przemieszczenia, mechanizm iteruje po węzłach modelu i do współrzędnych
węzłów dodaje wartości przemieszczenia. Mnożone są one przez mnożnik zdefiniowany przez
użytkownika w interfejsie.
deformationVal.forEach(def->{
SimulationNodalPoint node = simNodes.get(def.getNodeNr());
result.add(
new Double[]{node.getX()+(def.getX()*multiplier),
node.getY()+(def.getY()*multiplier),
node.getZ()+(def.getZ()*multiplier)
});
});
Tak wyliczone wartości wysyłane są dalej, jako dane o węzłach i pozwalają na uwidocznienie
na modelu zamian przemieszczenia spowodowanych działającymi na obiekt siłami.
Wyświetlanie danych w postaci kolorów na modelu dokonywane jest w tej samej klasie, w
53
metodzie 'getDislocatedNodesColors()’. Sprawia więcej trudności gdyż wysyłane do niej dane
mogą odpowiadać trzem różnym elementom tak jak to było opisane w podrozdziale 4.3.3. W
pierwszej kolejności z danych dla trzech punktów wyliczana jest średnia i taka wartość
zapisywana jest w liście przy zachowaniu kolejności danych wejściowych. Ze zgromadzonych
danych wyszukiwana jest wartość maksymalna oraz minimalna. Stanowią one górną oraz dolną
granicę skali, ich różnica dzielona jest przez ilość kolorów. W ten sposób uzyskujemy
przedziały wartości oraz kolory jakie im odpowiadają. Każda wartość z wyliczonej wcześniej
listy zostaje podstawiona pod tą skalę, a odpowiadający jej kolor pod tym samym indeksem
zapisywany jest w nowej liście.
Dalsze postępowanie zależy od typu danych wejściowych, jeżeli dane wejściowe odpowiadały
węzłom w modelu, jest to koniec procesu. Dane są wysyłane do aplikacji po stronie klienta, a
podczas budowania modelu dla każdego prymitywu pobierany jest kolor z listy.
W pozostałych przypadkach informacje o kolorach wysyłane są do ‘PrimitiveConvert’, gdzie
dane wykorzystywane są podczas konwersji kształtów. Jeśli danymi wejściowymi są wartości
dla każdego prymitywu ten sam kolor przypisywany jest każdemu z kształtów stworzonych w
metodach dziedziczących. W przypadku danych dla węzła, kolor pobierany jest z listy dla
każdego z węzłów wykorzystanych w prymitywach.
4.5 Budowa modułu wyświetlającego grafikę
Całość kodu służącego wyświetleniu modelu znajduje się w aplikacji po stronie klienta i została
napisana przy użyciu języka JavaScript. W swoim działaniu wykorzystuje informacje wczytane
oraz przetworzone przez program po stronie serwera opisane w rozdziałach 4.3 oraz 4.4.
Struktura tej części aplikacji składa się z 3 plików:
jsUtils.js – znajdują się w nim metody służące komunikacji JavaScriptu z serwerem.
simulationObject.js – zawiera klasę przechowującą wczytane dane na temat symulacji,
wykorzystywane są one do stworzenia modelu, skali oraz innych funkcji.
threeJsAnimation.js – są w nim funkcje budujące scenę, wszystkie jej funkcjonalności,
oraz modele.
Biblioteka ThreeJs pozwala na stworzenie sceny na bazie elementu HTML5 ‘Canvas’, przez
którą udostępniony został szereg funkcjonalności.
Poruszanie kamerą – umożliwione zostało poruszanie kamerą w trójwymiarowej
54
przestrzeni w każdej płaszczyźnie, a także jej przybliżanie oraz oddalanie. Taką
funkcjonalność można uzyskać dzięki użyciu dodatkowej biblioteki o nazwie
‘TrackballControls.js’ znajduje się ona w dodatkach do biblioteki ThreeJs.
Poruszanie modelami – poprzez przytrzymanie prawego przycisku myszy nad modelem
i przesunięciu kursora możemy zmienić położenie wybranego obiektu w przestrzeni
trójwymiarowej.
Programowanie funkcjonalności zostało rozpoczęte od umieszczenia w tle sceny
płaszczyzny, która obracać się będzie razem z kamerą. Umożliwi to zrzutowanie
dwuwymiarowego ruchu kursora myszy na trójwymiarową przestrzeń.
plane = new THREE.Mesh(
Płaszczyzna musi być na tyle duża, aby objąć cały ekran.
new THREE.PlaneBufferGeometry( 2000, 2000, 8, 8 ),
new THREE.MeshBasicMaterial( { color: 0x000000, opacity: 0.25,
transparent: true } )
);
Skonfigurowana jest tak, aby była niewidzialna, żeby nie przesłaniała obiektów.
plane.visible = false;
Biblioteka udostępnia narzędzie wykrywające, który z obiektów wskazywany jest przez
kursor myszy ‘raycaster’. Przy jego pomocy wybierany jest obiekt, a następnie
stworzona wcześniej płaszczyzna zostaje przesunięta w miejsce wybranego obiektu,
która zostanie skierowana prostopadle do kamery.
plane.position.copy( INTERSECTED.position );
plane.lookAt( camera.position );
Przy przesuwaniu wskaźnika przy pomocy funkcji ‘raycaster’ wykrywane jest jego
położenie nad płaszczyzną, a wskazany obiekt przesunięty zostaje we wskazane miejsce
na płaszczyźnie.
Wybór modelu – program udostępnia możliwość wyboru modelu i wskazywanego
prymitywu poprzez prawy przycisk myszy. Po dodaniu modelu do sceny, podstawowe
dane na jego temat zostają wyświetlone w tabeli tak jak widoczne jest to na rysunku 30.
55
Rysunek 30 Interfejs - tabela z wczytanymi modelami
Po wyborze geometrii myszą, wskazywany prymityw zostaje podświetlony na kolor
zielony. Natomiast w tabeli poniżej wybrana pozycja zostaje podświetlona
ciemniejszym kolorem, tak jak to widać na rysunku 30 w przypadku pozycji 3. Niżej
wyświetlone zostają numery węzłów tworzących wybrany prymityw, w tym wypadku
2238, 2181, 2745 oraz współrzędne tych punktów w przestrzeni. Jeszcze niżej
wyświetlona zostaje skala wybranego modelu, w postaci koloru oraz odpowiadającej
mu wartości.
Wyświetlanie modelu – wyświetlone grafiki zaprezentowane zostaną w rozdziale 5.
Za tworzenie geometrii odpowiada metoda ‘createGeometryObject’ w pliku
‘threeJsAnimation.js’. Do metody przekazywane są cztery zmienne: węzły, dane o
56
prymitywach, lista z kolorami, a także skala zapisana w tablicy.
W pierwszej kolejności tworzony jest nowy obiekt geometrii.
var geom = new THREE.Geometry();
Następnie do tablicy ‘vertices’ w obiekcie geometrii dodane zostają węzły modelu z
‘positions’.
for (var i = 0; i < positions.length; i++) {
geom.vertices.push(new THREE.Vector3(positions[i][0],
positions[i][1], positions[i][2]));
}
Listy prymitywów powiększone zostają o przesłane z serwera prymitywy zapisane w
obiekcie ‘indices’.
for (var i = 0; i < indices.length; i++) {
geom.faces.push(new THREE.Face3(indices[i][0],
indices[i][1],
indices[i][2]));
}
Dla każdego kształtu podstawowego modelu dodawany zostaje kolor.
for (var i = 0; i < geometry.faces.length; i++) {
f = geometry.faces[i];
Jeżeli ilość kolorów w liście odpowiada ilości wczytanych prymitywów, barwy są
przypisywane bezpośrednio dla każdego z nich lub jeżeli wartości kolorów jest więcej,
dla każdego wierzchołka.
Pobieranie kolorów dla danego prymitywu.
var colorsArray = colors[i];
Warunek sprawdzający czy ilość wartości odpowiada jednemu kolorowi.
if(colorsArray.length==4){
color = new THREE.Color(0xffffff);
color.setRGB(colors[i][0],
colors[i][1], colors[i][2]);
Kolor przypisywany jest całemu elementowi.
57
f.color = color;
}else{
n = (f instanceof THREE.Face3) ? 3 : 4;
Jeśli wartości w tablicy koloru jest więcej niż 4 oznacza to, że są tam barwy dla każdego
węzła w prymitywie.
for (var j = 0; j < n; j++) {
color = new THREE.Color(0xffffff);
color.setRGB(colors[i][(j*4)],
colors[i][(j*4)+1], colors[i][(j*4)+2]);
Każdemu wierzchołkowi przypisywany jest kolor.
f.vertexColors[j] = color;
}
}
Jeśli ilość kolorów w liście odpowiada ilości węzłów, kod przypisujący kolory wygląda
podobnie do ostatniej pętli, lecz kolory pobierane są na podstawie indeksu wierzchołka
‘vertexIndex’.
for (var j = 0; j < n; j++) {
vertexIndex = f[faceIndices[j]];
color = new THREE.Color(0xffffff);
color.setRGB(colors[vertexIndex][0],
colors[vertexIndex][1], colors[vertexIndex][2]);
f.vertexColors[j] = color;
}
Tak uzupełniony obiekt geometrii zostaje dodany do sceny, a na podstawie tablicy ze
skalą wygenerowane zostają odpowiednie wpisy w tabeli.
Wyświetlenie siatki na modelu – poprzez wybór odpowiedniej opcji podczas
wczytywania modelu (patrz rozdział 4.4) mamy możliwość wyświetlenia na nim siatki
prymitywów go tworzących. Wybranie tej opcji powoduje stworzenie geometrii z
dwoma połączonymi ze sobą materiałami. Jednym zwykłym posiadającym nadany
kolor oraz drugim przeźroczystym zawierającym widoczne jedynie linie na brzegach
powierzchni tworzących obiekt.
58
5 Porównanie stworzonej aplikacji oraz rozwiązania komercyjnego
Wyniki zostaną zaprezentowane na podstawie opisanych w rozdziale 3 przykładowych
symulacji wykonanych w programie Adina. Uzyskane wizualizacje zostaną porównane z ich
odpowiednikami wygenerowanymi w programie komercyjnym
5.1 Uproszczony model turbiny
Model turbiny wygenerowany w obu programach widoczny jest na rysunkach 31 oraz 32.
Rysunek 31 Aplikacja własna - prosty widok turbiny z nałożoną z siatką.
Rysunek 32 Adina - siatka turbiny
59
Geometria wygenerowanych przez obydwa programy jest taka sama, jednak już na pierwszy
rzut oka widać różnice w wygenerowanej siatce. W przypadku prezentowanego w tej pracy
programu jest ona dużo gęstsza. Spowodowane jest to różnicą w elementach podstawowych, z
których zbudowane są oba modele. Tak jak było to tłumaczone w rozdziale 4.4.2 elementy
zdefiniowane w Adinie przekształcane są na kilka prymitywów trójkątnych. Na etapie obliczeń
siatki były identyczne, widoczne różnice są jedynie graficzne.
Rysunek 33 Aplikacja własna - zbliżenie na siatkę
60
Rysunek 34 Adina - zbliżenie na siatkę
Jak widać na rysunkach 33 oraz 34 siatki w obu przypadkach zawierające elementy trójkątne
są identyczne, tak więc model wczytuje się prawidłowo.
Rysunek 35 Aplikacja własna - stan obiektu w 30 kroku czasowym
61
Rysunek 36 Adina - stan obiektu w 30 kroku czasowym.
Obydwa programy umożliwiają zobrazowanie zmian zachodzących w położeniu modelu na
skutek działających przemieszczeń. W programie komercyjnym możemy przewijać
wizualizacje kolejnych wyników poprzez funkcje ‘Previous solution’ oraz ‘Next solution’.
Natomiast w stworzonej aplikacji taki efekt umożliwia wczytanie danych o przemieszczeniu
modelu oraz następnie wybranie ich w opcji 'Select data to modificate nodes positions’.
Położenie wirników w obu turbinach jest analogiczne, można więc stwierdzić, że wczytane
dane zostały w prawidłowy sposób zinterpretowane oraz wyświetlone.
62
Rysunek 38 Skala dla wirnika obiektu
na rysunku 39
Rysunek 39 Aplikacja własna – naprężenie w płaszczyźnie YZ
Rysunek 37Skala dla obudowy
obiektu na rysunku 39 oraz 41
63
Rysunki 39 i 40 obrazują wartości naprężenia modelu jak widać wizualizacje są zupełnie różne.
Dzieje się tak z powodu skali, w aplikacji Adina skala wyliczana jest jedna dla wszystkich
kroków czasowych dla całego modelu, zarówno dla wirnika jak i obudowy. Natomiast w
napisanej aplikacji skala tworzona jest dla każdego elementu osobno. Powoduje to całkowitą
rozbieżność wizualizacji.
Rysunek 40 Adina - naprężenie w płaszczyźnie YZ
64
Rysunek 41 Aplikacja własna – odkształcenie w płaszczyźnie YZ tylko dla obudowy
Rysunek 42 Adina – naprężenie w odkształcenie YZ tylko dla obudowy
W przypadku rysunków 41 oraz 42 zobrazowane zostały te same naprężenia, co w poprzednich
przykładach, jednak tym razem wygenerowane są jedynie obudowy turbin. Różnice w
modelach nadal istnieją, są spowodowane odmiennymi przedziałami wartości, dlatego niektóre
rejony mogą być zaznaczone różnymi kolorami. Mimo to rejony o wartościach granicznych na
obu rysunkach są takie same.
65
5.2 Model wału z przyklejonym pierścieniem
Wał jest modelem stworzonym w przestrzeni trójwymiarowej, udostępnia te same możliwości,
co modele dwuwymiarowe. Obiekty widoczne na rysunkach 44 oraz 45 mają naniesione na
siebie wykresy nacisku, zostały również przemieszczone pod wpływem siły, które na nie
działają.
Rysunek 44 Aplikacja własna - nacisk oraz przemieszczenie
Rysunek 43 Skala do obiektu na rysunku 44
66
Rysunek 45 Adina – nacisk oraz przemieszczenie W obu przypadkach przemieszczenie zostało zwielokrotnione, ponieważ jego oryginalna
wartość nie pozwalała uwidocznić zmian w geometrii. W przypadku Adiny wykorzystana
została opcja ‘Scale displacement’ natomiast w opisywanej aplikacji przemieszczenie zostało
pomnożone przez 1000. Adina nie daje kontroli nad wartością, o jaką zwiększone są liczby. W
wizualizacji stworzonej przez opisywaną aplikację widać, iż prawy koniec modelu jest
nienaturalnie wydłużony, natomiast w przypadku Adiny nie obserwujemy takiego efektu.
Można przypuszczać, iż stało się tak, ponieważ w pierwszym przypadku wartości
przemieszczenia są pomnożone przez podaną wartość. Tego typu odkształcenia, w małej skali
są normalne, ale przy mnożeniu zostają sztucznie wyolbrzymione. Adina może korzystać z
lepszych metod takich jak na przykład interpolacja wyników, dzięki czemu uzyskane efekty są
bardziej rzeczywiste.
Różnice w kolorach nałożonych wykresów, tak jak w przypadku modelu opisywanego w
rozdziale 5.1 spowodowane są różnicami w zdefiniowanej skali. Granice stref wartości w
opisywanej aplikacji są również bardziej postrzępione. Dzieje się tak, ponieważ Adina posiada
funkcję wygładzania wykresu, dzięki czemu przybliża część wyników. W przypadku
stworzonego postprocesora kolory przybliżają się jedynie w ramach zdefiniowanych
prymitywów, przez co uzyskujemy efekt rozmycia. Nie niweluje to jednak zupełnie efektu
poszarpanych stref wartości.
Opisywany program ma dodatkowo możliwość wyświetlania obok siebie każdego rodzaju
modelu, bez względu na rodzaj przestrzeni w jakiej operuje oraz typu symulacji jaki
reprezentuje. Rysunek 46 pokazuje zbiór wczytanych obok siebie modeli z nałożonymi różnego
rodzaju wykresami.
67
Rysunek 46 Aplikacja własna - zbiór różnych modeli w jednej scenie
Zestawienie różnych obiektów ze sobą w Adinie nie jest możliwe, ponieważ do postprocesora
nie da się wczytać dwóch niezależnych modeli. Taka możliwość pozwala na proste
skonfrontowanie ze sobą wyników kilku symulacji, a także na porównanie rozmiarów obiektów.
Modele opisywane są przy pomocy tych samych jednostek, są w tej samej odległości od ekranu,
więc są w tej samej skali. Umożliwia to również zestawienie ze sobą modeli z kilkoma
nałożonymi na siebie wykresami jednocześnie.
68
6. Wnioski
Program przedstawiony w niniejszej pracy pokazał, że technologie internetowe są
wystarczająco zaawansowane, aby wspierać symulacje MES. Aplikacje klient-serwer z
interfejsem użytkownika stworzonym w HTML oraz JavaScript mają wiele zalet.
Nie wymagają od użytkownika instalacji oprogramowania
Pozwalają na równoczesną pracę na tych samych danych wielu użytkownikom. To
również prosty sposób na dzielenie się wynikami pracy dla pracowników naukowych.
Ograniczenia związane z fizyczną odległością osób w Internecie nie obowiązują.
Użytkownik znajdujący się w Polsce może wczytać dane o zakończonej symulacji, a
jego współpracownik z innego kraju minutę później ma możliwość przeglądać gotowy
model.
Stanowi prosty sposób na ominięcie problemów z działaniem programów na różnych
platformach.
Umożliwia wyświetlenie wielu modeli równocześnie, w dowolnej konfiguracji
Pozwala na nałożenie na modele wykresów, analizę skali, a także prostą edycję modelu.
To wszystko możliwe jest z dowolnego miejsca z dostępem do Internetu, także ze
smartfona bez konieczności noszenia ze sobą danych symulacji.
Stworzony program posiada wszystkie cechy aplikacji internetowej, zawiera również część
funkcjonalności komercyjnych postprocesorów. Program przygotowany przez firmę Adina jest
rozwijany od wielu lat przez specjalistów, posiada dużo funkcji, które nie są dostępne w
przedstawianym programie. Stworzenie podobnego systemu wymagałoby wiele czasu i
przerasta możliwości jednego człowieka. Aplikacja ma jednak kilka niedoskonałości, które
wymagałyby poprawy w celu uzyskania lepszej funkcjonalności.
Siatka nie zgadza się z tą zdefiniowaną w programie. Jednak informacje o jej strukturze
znajdują się w bazie danych, potrzebne jest jedynie odpowiednie ich przekazanie do
modułu wyświetlającego grafikę.
Brak możliwości wykonania przekroju modeli trójwymiarowych. Rozszerzenie
aplikacji pozwoliłoby na analizę zmian zachodzących wewnątrz modelu.
Usprawnienia wymaga system wyliczania skali dla wykresu. Poza lepszym
wyznaczaniem przedziałów wartości, warto byłoby umożliwić użytkownikowi większą
kontrolę nad nią. Wybór skali logarytmicznej mógłby pomóc w analizie modeli.
Przydatna również mogłaby być możliwość zdefiniowania własnych przedziałów skali,
69
także kolorów im odpowiadających.
Zbudowany program może służyć, jako baza do budowy forum naukowego dla początkujących
użytkowników technologii MES. Budowa programu pozwala w prosty sposób dodać obsługę
plików eksportowanych z innych programów. Wystarczy stworzyć klasę, która nadpisze
interfejs ‘SimulationDataExtraction’ oraz wczyta dane do obiektów zapisywanych w bazie
danych, reszta aplikacji pozostaje bez zmian. Wykorzystane technologie pozwalają na budowę
zarówno małego forum zrzeszającego kilku entuzjastów jak i dużego portalu dla wielu
użytkowników z całego świata. Są to również technologie powszechnie wykorzystywane,
pozwala to w prosty sposób znaleźć specjalistów, którzy mogliby taką aplikację rozwijać.
70
Spis ilustracji
Rysunek 1 Logo Java[7] 7
Rysunek 2 Logo Spring[22] 9
Rysunek 3 Logo Hibernate[23] 11
Rysunek 4 Rola Hibernate w aplikacji Java[8] 11
Rysunek 5 Nieoficjalne logo Javascript 13
Rysunek 6 Logo MySQL[25] 16
Rysunek 7 Logo Adina[26] 17
Rysunek 8Moduły systemu ADINA[13] 17
Rysunek 9 Interakcja struktury z płynem[27] 19
Rysunek 10 Uproszczona turbina[26] 22
Rysunek 11 Rodzaje siatek naniesionych na model turbiny.[26] 23
Rysunek 12 Obudowa turbiny wraz ze zdefiniowanym płynem 24
Rysunek 13 Ruchoma część turbiny 25
Rysunek 14 Wał wraz z pierścieniem[26] 26
Rysunek 15 Gotowy model wału i pierścienia, z zaznaczonym wektorem nacisku 27
Rysunek 16 Graf przedstawiający schemat bazy danych 28
Rysunek 17 Diagram klas części wczytującej dane 35
Rysunek 18Interfejs - dodawanie i edycja modelu 36
Rysunek 19Interfejs - Okno dodawania symulacji 37
Rysunek 20 Interfejs – okno edycji 38
Rysunek 21 Interfejs – okno edycji, opcje 38
Rysunek 22 Diagram klas części przetwarzającej dane 48
Rysunek 23 Interfejs - opcje widoku 49
Rysunek 24 Elementy dwu wymiarowe - 4,8 i 9 węzłowe czworokąty[28] 50
Rysunek 25Elementy dwu wymiarowe - 4,8 i 9 węzłowe czworokąty[28] 50
71
Rysunek 26 Elementy trój wymiarowe - bryły 6, 8 oraz 5 węzłowe[28] 51
Rysunek 27 Elementy trójwymiarowe - bryły 15, 20 oraz 13 węzłowe[28] 51
Rysunek 28 Elementy trójwymiarowe – bryły 21 oraz 14 węzłowe[28] 51
Rysunek 29 Elementy trójwymiarowe - bryły 4, 10 oraz 11 węzłowe[28] 51
Rysunek 30 Interfejs - tabela z wczytanymi modelami 55
Rysunek 31 Aplikacja własna - prosty widok turbiny z nałożoną z siatką. 58
Rysunek 32 Adina - siatka turbiny 58
Rysunek 33 Aplikacja własna - zbliżenie na siatkę 59
Rysunek 34 Adina - zbliżenie na siatkę 60
Rysunek 35 Aplikacja własna - stan obiektu w 30 kroku czasowym 60
Rysunek 36 Adina - stan obiektu w 30 kroku czasowym. 61
Rysunek 37Skala dla obudowy obiektu na rysunku 39 oraz 41 62
Rysunek 38 Skala dla wirnika obiektu na rysunku 39 62
Rysunek 39 Aplikacja własna – naprężenie w płaszczyźnie YZ 62
Rysunek 40 Adina - naprężenie w płaszczyźnie YZ 63
Rysunek 41 Aplikacja własna – odkształcenie w płaszczyźnie YZ tylko dla obudowy 64
Rysunek 42 Adina – naprężenie w odkształcenie YZ tylko dla obudowy 64
Rysunek 43 Skala do obiektu na rysunku 44 65
Rysunek 44 Aplikacja własna - nacisk oraz przemieszczenie 65
Rysunek 45 Adina – nacisk oraz przemieszczenie 66
Rysunek 46 Aplikacja własna - zbiór różnych modeli w jednej scenie 67
72
Bibliografia
[1] MES:
http://fatcat.ftj.agh.edu.pl/~i6gozdur/MES.pdf[online], Wrzesień 2015
[2] What is an Internet Application?:
https://msdn.microsoft.com/en-us/library/aa733739(v=vs.60).aspx [online], Wrzesień 2015
[3] Aplikacje typu kient-serwer w sieci internet
Agnieszka Węgrzyn, Marek Węgrzyn,
http://www.man.zgora.pl/warsztaty/zielman99/pdf/PZ_klient-serwer.pdf [online], Wrzesień
2015
[4] Java Language Specification
http://docs.oracle.com/javase/specs/jls/se8/html/jls-1.html[online], Marzec 2015
[5] Java Virtual Machine Specification
http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html [online] Marzec 2015
[6] Professional Java Development with the Spring Framework
Rod Johnson, Jürgen Höller, Alef Arendsen, Thomas Risberg, Colin Sampaleanu, Wiley,
Indianapolis 2005
[7] Hibernate QuickStart
Dave Minter, Jeff Linwood, Apress, New York 2010
[8] Beginning Hibernate
Dave Minter, Jeff Linwood, Apress, New York 2006
[9] JavaScript: The Definitive Guide
(6th ed.), David FlanaganPaula Ferguson, O'Reilly & Associates, Sebastopol 2011
[10]Learning Three.js: The JavaScript 3D Library for WebGL
Jos Dirksen, Packt Publishing, Birmingham 2013
[11]What are the major features in Three.js?
https://github.com/mrdoob/three.js/wiki/Features[online], Wrzesień 2015
[12]What is MySQL?
https://dev.mysql.com/doc/refman/5.1/en/what-is-mysql.html[online], Wrzesień 2015
[13]The Adina System
http://www.adina.com/products. shtml[online], Wrzesień 2015
[14]Adina Solid & Structures
http://www.adina.com/adina-structures.shtml[online], Wrzesień 2015
[15]Adina CFD
http://www.adina.com/adina-CFD.shtml[online], Wrzesień 2015
[16]Adina EM
http://www.adina.com/adina-electromagnetics.shtml[online], Wrzesień 2015
[17]Adina Thermal
http://www.adina.com/adina-thermal.shtml[online], Wrzesień 2015
[18]Adina Multiphysics
http://www.adina.com/adina-thermal.shtml[online], Wrzesień 2015
[19] Encyclopedia of Mathematics: ADINA system
73
http://www.encyclopediaofmath.org/index.php?title=ADINA_system&oldid=14399[online],
Wrzesień 2015
[20]Bootstrap
http://www.w3schools.com/bootstrap/[online], Wrzesień 2015
[21] Logo Java
https://java.com/ga/images/auto/1371159372900?image=true[online] , Wrzesień
2015
[22]Logo platforma Spring
https://d1fto35gcfffzn.cloudfront.net/images/trademarks/spring-platform-watermark-
large.png[online], Wrzesień 2015
[23]Logo Hibernate
http://design.jboss.org/hibernate/logo/final/hibernate_logo_whitebkg_600px.png[online],
Wrzesień 2015
[24]Logo JavaScript
http://www.2ality.com/2011/10/logo-js.html[online], Wrzesień 2015
[25]Logo MySQL
https://www.mysql.com/common/logos/includes-mysql-125x64.png[online], Wrzesień 2015
[26]Adina Primer
Report ARD 13-7, Adina R&D, Inc., December 2013
[27]Interakcja struktury z płynem
http://www.aices.rwth-aachen.de/images/wall.jpg[online], Wrzesień 2015
[28]ADINA User Interface Command Reference Manual
Report ARD 13-2, Adina R&D, Inc., December 2013