17 września 2019


Gdy rozpoczynałem edukację rodzice powtarzali mi, żebym szczególnie przykładał się do nauki języków obcych. Mówili wtedy, że znajomość innego języka niż ojczysty jest gwarancją dobrze płatnej pracy w przyszłości. Od tego czasu minęły niecałe dwie dekady i dziś już wpis w CV podkreślający znajomość np. języka angielskiego jest częściej standardem aniżeli atutem. Podobnie rzecz się ma z językami służącymi do komunikacji z komputerem.

Sławomir Polański

Globalna komputeryzacja spowodowała, że programiści są jedną z najlepiej zarabiających grup społecznych, a pracowników w tym sektorze ciągle brakuje. Czy oznacza to, że wszyscy powinniśmy się przebranżowić i zostać programistami? Oczywiście nie, ale warto pomyśleć nad poszerzeniem swoich kompetencji o podstawy programowania. Nie musimy być komputerowym czarodziejem, aby napisać kilka linijek tekstu, które pozwolą zaoszczędzić cenny czas pracy.

Jaki język programowania na początek?
Pierwszym krokiem, jaki należy wykonać, jest wybór języka programowania. Nie jest to decyzja łatwa, a przed rozpoczęciem nauki warto przejrzeć internet, aby dowiedzieć się jaki język będzie odpowiadał naszym potrzebom. W moim przypadku wybór padł na język Python, który jest obecnie jednym z najpopularniejszych języków programowania. Jego składnia jest na tyle przejrzysta i łatwa do zrozumienia, że niektórzy twierdzą, iż znajomość języka angielskiego wystarczy do zrozumienia dobrze napisanego kodu. Dodatkowym atutem jest fakt, że Python jest rozwijany na zasadach wolnego oprogramowania.

Tym samym jest dostępny dla każdego, a ilość bezpłatnych bibliotek (modułów) wykracza poza nasze najśmielsze oczekiwania. Warto zwrócić uwagę, że jest to język o bardzo szerokim spektrum zastosowania. Z powodzeniem wykorzystać go można przy tworzeniu stron internetowych, gier komputerowych czy podczas prostych symulacji numerycznych. Dlaczego akurat prostych symulacji? Jedną z wad Pythona jest fakt, że programy w nim napisane wykonują się wolniej od odpowiedników w językach C, C++ czy Fortran. Z drugiej strony, coraz częstszą praktyką wśród programistów jest tworzenie szkieletu kodu w języku Python i odwoływanie się do funkcji i bibliotek napisanych we wspomnianych wyżej językach. W taki właśnie sposób zostały napisane biblioteki NumPy i SciPy, które z powodzeniem znajdują zastosowanie w skomplikowanych obliczeniach naukowych.
Dla mnie, jako osoby korzystającej na co dzień z oprogramowania do symulacji Abaqus, wybór Pythona również nie jest przypadkiem. Abaqus ma interfejs, który umożliwia uruchomienie dowolnej komendy z menu graficznego za pomocą skryptu. W rezultacie użytkownik w niesamowicie prosty sposób jest w stanie zautomatyzować wszystkie czynności, które musiałby wykonać manualnie. Chcąc lepiej ukazać potencjał interfejsu programistycznego w Abaqusie, chciałbym odnieść się do projektu, w jakim niedawno brałem udział. Firma, w której pracuję, została poproszona o napisanie zestawu skryptów celem częściowego zautomatyzowania budowy modelu numerycznego silnika motocyklowego. Część z nich służyła do generowania geometrii i aplikacji odpowiednich warunków brzegowych, a pozostałe miały na celu generowanie odpowiednich raportów z przeprowadzonych symulacji. W rezultacie, czas potrzebny na przeprowadzenie pełnego cyklu obliczeń silnika został zredukowany z tygodnia do dwóch dni. Tak wielka oszczędność czasu pozwala na przeprowadzenie dodatkowej iteracji obliczeń i przyspieszenie procesu projektowego. Tym samym ilość błędów, które mógł popełnić użytkownik została zredukowana do minimum, co zdecydowanie zwiększyło jakość i rzetelność otrzymanych wyników.

Pierwsze kroki z Pythonem
Z programowaniem jest trochę jak ze sportem – trzeba próbować i ćwiczyć samemu, ponieważ samo czytanie o tym na nic się nie zda. Oczywiście, najlepiej gdy mamy przy sobie mentora, który podpowie nam od razu co robimy źle. W przypadku programowania sprawa jest o tyle prosta, że internet pełen jest materiałów szkoleniowych. Jeśli chodzi o Pythona to materiałów tych jest tak dużo, że problem polega na decyzji, które wybrać. Osobiście polecam portal internetowy codecademy. com, na którym rozpoczynałem przygodę z Pythonem. Znajduje się tam bezpłatny kurs pozwalający zrozumieć podstawy języka oraz może stanowić wstęp do bardziej zaawansowanych zagadnień. Całość szkolenia przeprowadzona jest online, co oznacza, że nie jesteśmy zmuszani do instalacji czegokolwiek na własnym komputerze.
Uzyskaną w czasie kursu wiedzę warto rozwijać dalej pisząc skrypty, które usprawnią nasze codzienne obowiązki. Jak wspomniałem, Python jest językiem o szerokim spektrum zastosowania, więc może być to cokolwiek. Pamiętam, że jednym z moich pierwszych projektów było wygenerowanie kształtu koła zębatego w programie Abaqus dla zadanych parametrów ewolwenty (Rys. 1).

1
Rys. 1

W moim odczuciu, tworzenie jakichkolwiek brył i obiektów w przestrzeni pozwala poczuć frajdę z programowania.
Chcąc zachęcić Czytelnika do sprawdzenia swoich sił przygotowałem skrypt służący do uruchomienia symulacji belki jednostronnie utwierdzonej w programie Abaqus. Choć jest to program komercyjny to w internecie z łatwością pobrać można jego wersję bezpłatną do nauki symulacji.

Przepis na skrypt uruchamiający symulację belki
Skrypt, który przedstawię poniżej ma na celu budowę prostego obiektu, jakim jest belka, w sposób parametryczny. W programie Abaqus istnieje kilka sposobów uruchamiania kodu. Najprostszym z nich jest napisanie skryptu do pliku z rozszerzeniem .py, a następnie uruchomienie go poprzez wybranie File – > Run script z menu rozwijanego (Rys. 2).

2
Rys. 2

Pierwszym krokiem, który należy wykonać jest stworzenie parametrów definiujących modelowany obiekt. W naszym wypadku będą to wymiary geometryczne, materiałowe i globalny rozmiar siatki. Nawet jeżeli nie zamierzamy być programistami na pełen etat to dobrym zwyczajem jest tworzenie kodu w języku angielskim. W innym przypadku nasz skrypt będzie mało czytelny, ponieważ praktycznie nie istnieją biblioteki napisane po polsku.

height = 30.0
width = 30.0
length = 300.0
youngsModulus = 2.1e5
poissonRatio = 0.3
globalMeshSize = 10.0

Gdy parametry są już zdefiniowane , powinniśmy stworzyć geometrię belki. W przypadku skryptu cały proces będzie wyglądał tak samo jak gdybyśmy tworzyli ją manualnie w programie CAD. Pierwszym krokiem jest stworzenie szkicu z przekrojem (w naszym przypadku będzie to prostokąt), a następnie jego wyciągnięcie celem stworzenia objętości.

from abaqus import mdb
model = mdb.models[‚Model-1’]
mySketch = model.ConstrainedSketch(name = ‚__profile__’,
sheetSize = 200.0)
mySketch.rectangle(point1 = (0.0, 0.0), point2 = (width, height))

from abaqusConstants import THREE_D, DEFORMABLE_BODY
beam = model.Part(dimensionality = THREE_D, name = ‚Beam’,
type = DEFORMABLE_BODY)

beam.BaseSolidExtrude(depth = length, sketch = mySketch)
del mySketch

Warto zauważyć, że nazwy parametrów długości, szerokości oraz wysokości zostały zmyślnie użyte w linijce 11 i 17. Tym samym, wartość podana w górnej części kodu zostanie użyta przy każdorazowym użyciu nazwy jakiegokolwiek parametru. Po uruchomieniu powyższego kodu wygenerowana zostanie geometria belki (Rys. 3).
Częścią każdej symulacji metodą elementów skończonych jest wygenerowanie siatki. Dla tak prostego przypadku jakim jest belka, proces ten można wykonać za pomocą dwóch linijek.

beam.seedPart(size = globalMeshSize)
beam.generateMesh()

 

Kolejnym krokiem, który należy wykonać, jest przypisanie właściwości materiałowych do modelu. W Abaqusie odbywa się to w trzech krokach. Najpierw tworzony jest obiekt, który zawiera informację o danych materiałowych. Następnie zdefiniować należy jakiego rodzaju przekrój geometryczny będzie użyty (przykładowo, czy ma to być objętość, powierzchnia, pręt jednowymiarowy itp.). W ostatnim kroku przypisywany jest materiał, wraz z danymi geometrycznymi, do obiektu naszej części. Nie dzieje się to jednak bezpośrednio – wcześniej należy zdefiniować obiekt Set, czyli zbiór geometrii, dla których definiować będziemy własności materiałowe.

steel = model.Material(name = ‚Steel’)
steel.Elastic(table = ((youngsModulus, poissonRatio), ))

model.HomogeneousSolidSection(material = ‚Steel’,
name = ‚SteelSection’)
allSet = beam.Set(cells = beam.cells[:], name = ‚All’) 


beam.SectionAssignment(region = allSet, sectionName = ‚SteelSection’)

 

Kolejną konwencją w Abaqusie jest podział na moduły Part i Assembly. Assembly jest modułem, w którym tworzone jest złożenie modelu, przy czym do uruchomienia symulacji wymagane jest umieszczenie w nim przynajmniej jednej części z modułu Part. Krok dodania części do złożenia przedstawiony został poniżej.

from abaqusConstants import CARTESIAN
assembly = model.rootAssembly
assembly.DatumCsysByDefault(CARTESIAN)

from abaqusConstants import ON
beamInstance = assembly.Instance(name = ‚Beam-1’, part=beam, dependent=ON)

W momencie gdy złożenie jest gotowe powinniśmy się zastanowić nad tym, jakiego typu symulację chcemy uruchomić. W tym konkretnym przykładzie będzie to analiza statyczna, którą definiujemy w sposób przedstawiony poniżej.

model.StaticStep(name = ‚StaticStep’, nlgeom = ON, previous = ‚Initial’)

Użytkownik przypisując warunki brzegowe w Abaqusie automatycznie tworzy zbiory obiektów geometrycznych (analogicznie do operacji przypisania materiału, opisanej wcześniej). Aby wykonać tę operację za pomocą skryptu sami musimy stworzyć taki zbiór, który będzie odpowiadał naszym potrzebom. W tym przypadku zdecydowałem, że przednia powierzchnia belki będzie unieruchomiona, a na tylnej zostanie zaaplikowane przemieszczenie 2,5 mm, w kierunku Y. Obie powierzchnie zdefiniować można przy pomocy funkcji findAt(), która dosłownie przeszukuje współrzędne do niej wprowadzone.

3
Rys. 3

Na tym etapie warto zauważyć, że funkcja służąca tworzeniu zbiorów Set() wywoływana jest na rzecz obiektu złożenia, a nie jak miało to miejsce w linijce 27, na rzecz obiektu części. Jest to kolejna konwencja zastosowana w programie Abaqus – zbiory mogą być tworzone zarówno w module Part, jak i Assembly.

fixedFace = beamInstance.faces.findAt
(coordinates = ((width/2.,height/2.,0.0), ) )
fixedFaceSet = assembly.Set(faces = fixedFace, name = ‚FIXED’)

dispFace = beamInstance.faces.findAt
(coordinates = ((width/2.,height/
2.,length),))
dispFaceSet = assembly.Set(faces = dispFace, name = ‚DISP’)


W oparciu o wcześniej zdefiniowane zbiory wywołujemy funkcje, które mają na celu zdefiniowanie warunków brzegowych.
model.DisplacementBC(createStepName = ‚StaticStep’, name = ‚FIXED’,
region = fixedFaceSet, u1 = 0.0, u2 = 
0.0, u3 = 0.0)

model.DisplacementBC(createStepName = ‚StaticStep’, name = ‚DISP’,
region = dispFaceSet, u2 = – 2.5)

Kończąc nasz skrypt dobrym zwyczajem jest uruchomienie komendy regeneracji modelu. Tym samym będziemy mieć pewność, że wszystkie z uruchomionych komend się wykonały. Ostatecznym krokiem jest stworzenie obiektu symulacji i jej uruchomienie za pomocą komendy submit().

assembly.regenerate()

simulation = mdb.Job(model=’Model-1’, name=’BeamSimulation’)
simulation.submit() 

Przy pomocy tak napisanego skryptu w prosty sposób możemy modyfikować kształt czy wartości materiałowe naszej belki. Możemy również w szybki sposób przeprowadzić studium zbieżności siatki, zmieniając wartość zmiennej globalMeshSize na taką, która nam odpowiada (Rys. 4).

4
Rys. 4

Na tym etapie część z Państwa może się zastanawiać skąd wiedzieć, jakich funkcji należy użyć i skąd, jako początkujący, mamy znać biblioteki, w których się one znajdują. Najprostszym ze sposobów na „odgadnięcie” jak napisać skrypt jest uruchomienie opcji nagrywania makra w Abaqusie. Nagrywając makro automatycznie zapisujemy wszystkie wykonane kroki do pliku abaqusMacro.py. Innym ze sposobów jest otworzenie pliku .jnl lub .rpy znajdującego się w katalogu naszego projektu. W plikach tych zamieszczone są wszystkie czynności, które użytkownik wykonuje w trakcie trwania sesji.

Ćwiczenia z Pythonem – co dalej?
Przypuszczam, że lektura powyższego artykułu może pozostawiać niedosyt u niektórych czytelników. Przedstawiony przykład miał jedynie zademonstrować fakt, że Python jest bardzo prostym i przystępnym językiem. Osobom na co dzień pracującym z Abaqusem polecam zaznajomienie się nie tylko z dokumentacją (przedstawiającą gotowe przykłady), ale również ze stroną internetową SIMULIA Learning Community. Platforma ta zawiera mnóstwo przydatnych samouczków oraz gotowe skrypty i pluginy. Jednakże wszystkich chcących zgłębić tajniki Pythona zachęcam do wymyślenia sobie projektu i wdrożenia go w życie.
Z pewnością każdy z nas ma wśród swoich obowiązków do wykonywania jakąś niesamowicie żmudną czynność, którą musimy powtarzać w jakimś odstępie czasu. W moim przypadku było to tworzenie raportu w postaci pliku Excel, co manualnie zajmowało mi około kilku godzin. Nieszczególnie skomplikowany skrypt pozwolił skrócić ten czas do niecałej minuty. Polecam uczucie, które towarzyszy takiej zmianie!

Sławomir Polański

 

artykuł pochodzi z wydania 1/2 (136/137) styczeń/luty 2019