Przejdź do treści

Rozszerzenia za pomocą podprogramów użytkownika

FrontISTR udostępnia zestaw podprogramów użytkownika umożliwiających rozszerzanie funkcjonalności bez modyfikowania głównego kodu źródłowego. Obejmują one implementacje praw konstytutywnych przez użytkownika oraz integrację zewnętrznych obciążeń definiowanych przez użytkownika. W tym rozdziale zestawiono dostępne punkty rozszerzeń oraz słowa kluczowe w pliku sterowania analizą, które służą do ich wywoływania. Szczegółowy opis argumentów podprogramów i procedur ponownej kompilacji znajduje się w rozdziale Podprogramy użytkownika (przewodnik programisty).

Przegląd funkcji

Punkty rozszerzeń realizowane za pomocą podprogramów użytkownika dzielą się na dwie kategorie: prawa konstytutywne materiału oraz obciążenia zewnętrzne. Po stronie praw konstytutywnych dostępne są cztery niezależne ścieżki wywołania — sprężystość liniowa, hipersprężystość, sprężysto-plastyczność oraz ogólne prawo konstytutywne — aktywowane osobnymi słowami kluczowymi. Po stronie obciążeń zewnętrznych dostępna jest ścieżka odczytująca informacje o obciążeniu z pliku zewnętrznego przygotowanego przez użytkownika i dodająca je do globalnego wektora obciążeń oraz wektora residuum. Każde rozszerzenie staje się dostępne po edycji pliku szablonu dołączonego do dystrybucji FrontISTR i ponownej kompilacji programu głównego.

Kategoria rozszerzenia Słowo kluczowe sterowania analizą Główne podprogramy użytkownika Szablon do edycji
Sprężystość liniowa użytkownika !ELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Hipersprężystość użytkownika !HYPERELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Sprężysto-plastyczność użytkownika (funkcja plastyczności i odwzorowanie powrotne) !PLASTIC, YIELD=USER uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus fistr1/src/lib/user/uyield.f90
Ogólne prawo konstytutywne użytkownika !USER_MATERIAL uMatlMatrix, uUpdate fistr1/src/lib/user/umat.f90
Zewnętrzne obciążenie zdefiniowane przez użytkownika !ULOAD, FILE=<fname> ureadload, uloading, uResidual fistr1/src/lib/user/uload.f90

Prawa umocnienia definiowane przez użytkownika (ścieżka zachowująca wbudowaną funkcję plastyczności i zastępująca jedynie krzywą umocnienia implementacją użytkownika) nie są obsługiwane. Jeśli potrzebna jest krzywa umocnienia definiowana przez użytkownika, należy wybrać !PLASTIC, YIELD=USER i zastąpić implementacją użytkownika całe prawo konstytutywne sprężysto-plastyczne. Nie są również obsługiwane warunki brzegowe użytkownika ani punkty rozszerzeń przeznaczone do przetwarzania użytkownika podczas restartu.

!CREEP z TYPE=USER nie jest obsługiwane. Do implementacji zależnego od czasu prawa konstytutywnego jako rozszerzenia użytkownika należy użyć !USER_MATERIAL.

Prawa konstytutywne użytkownika

Prawa konstytutywne użytkownika stanowią punkt wejścia do implementacji w zewnętrznym podprogramie zależności naprężenie–odkształcenie, których nie można opisać za pomocą wbudowanych modeli materiałowych. Dostępne są cztery ścieżki odpowiadające ramom właściwych wbudowanych praw konstytutywnych: sprężystość liniowa użytkownika, hipersprężystość użytkownika, sprężysto-plastyczność użytkownika oraz ogólne prawo konstytutywne użytkownika. W każdej ścieżce, w bloku !MATERIAL danych sterujących analizą, dla odpowiedniego słowa kluczowego należy podać TYPE=USER lub YIELD=USER. Można podać maksymalnie 100 stałych użytkownika, które są przekazywane do podprogramu.

Sprężystość liniowa użytkownika

Sprężystość liniowa użytkownika jest ścieżką, w której użytkownik oblicza macierz sprężystości w ramach założenia małych odkształceń. Po podaniu !ELASTIC, TYPE=USER w danych sterujących analizą FrontISTR traktuje ją jako prawo konstytutywne małych odkształceń i podczas obliczania sztywności elementu wywołuje uElasticMatrix (zwracający macierz sprężystości \(D\)), a podczas aktualizacji naprężeń — uElasticUpdate (zwracający naprężenie). Nie należy łączyć tej ścieżki z istniejącym modelem hipersprężystym ani sprężysto-plastycznym.

Hipersprężystość użytkownika

Hipersprężystość użytkownika jest ścieżką obliczania naprężeń i sztywności stycznej z pochodnych funkcji energii odkształcenia w ramach dużych odkształceń (Total Lagrange). W danych sterujących analizą należy podać !HYPERELASTIC, TYPE=USER. Wywoływane są te same podprogramy uElasticMatrix i uElasticUpdate co w przypadku sprężystości liniowej użytkownika, a także współdzielony jest ten sam szablon fistr1/src/lib/user/uelastic.f90. Ponieważ ustawienie słowa kluczowego przełącza sposób traktowania implementacji przez FrontISTR między małymi odkształceniami a Total Lagrange, tego samego szablonu nie można jednocześnie używać dla implementacji małych i dużych odkształceń. Należy zaimplementować go jako jedno z tych dwóch praw konstytutywnych.

Sprężysto-plastyczność użytkownika

Sprężysto-plastyczność użytkownika jest ścieżką, w której użytkownik implementuje funkcję plastyczności oraz procedurę odwzorowania powrotnego (return-mapping). W danych sterujących analizą należy podać !PLASTIC, YIELD=USER. Powoduje to wejście do gałęzi niezależnej od wbudowanych funkcji plastyczności Misesa, Mohr-Coulomba i Drucker-Pragera. Podczas obliczania sztywności elementu wywoływane jest uElastoPlasticMatrix (zwracające sprężysto-plastyczną sztywność styczną \(D\)), podczas aktualizacji naprężeń — uBackwardEuler (odwzorowujące naprężenie próbne na naprężenie rzeczywiste i aktualizujące zmienne stanu), a podczas inicjalizacji punktów Gaussa — uElastoPlasticNumStatus (zwracające liczbę przechowywanych rzeczywistych zmiennych stanu). Ścieżka zastępująca implementacją użytkownika jedynie krzywą umocnienia nie jest obsługiwana. Nawet gdy potrzebna jest wyłącznie krzywa umocnienia definiowana przez użytkownika, należy tą ścieżką zastąpić całe prawo konstytutywne sprężysto-plastyczne implementacją użytkownika.

Ogólne prawo konstytutywne użytkownika

Ogólne prawo konstytutywne użytkownika jest ścieżką implementowania praw konstytutywnych, które nie mieszczą się w ramach sprężystości, hipersprężystości ani sprężysto-plastyczności. W danych sterujących analizą należy podać !USER_MATERIAL. Domyślnie jest ono obsługiwane w ramach metody Updated Lagrange; po podaniu KIRCHHOFF jest traktowane jako Total Lagrange. Liczbę zmiennych stanu określa się parametrem NSTATUS. Podczas obliczania sztywności elementu wywoływane jest uMatlMatrix (zwracające sztywność styczną \(D\)), a podczas aktualizacji naprężeń — uUpdate (aktualizujące naprężenie i zmienne stanu).

Przekazywanie stałych użytkownika i zmiennych stanu

Dla każdej ze ścieżek !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER i !USER_MATERIAL stałe użytkownika zapisane w wierszach danych sterujących analizą (maksymalnie 100) są przekazywane bezpośrednio do podprogramu przez argument matl. W przypadku !PLASTIC, YIELD=USER przekazywane są stałe sprężyste określone przez !ELASTIC oraz stałe użytkownika podane w wierszach danych !PLASTIC.

W ogólnym prawie konstytutywnym użytkownika oraz dla !PLASTIC, YIELD=USER informacje historii z poprzedniego kroku (takie jak odkształcenie plastyczne, naprężenie wsteczne i uszkodzenie) mogą być przekazywane do implementacji użytkownika przez zmienną stanu fstat i zapisywane z powrotem na końcu kroku. Liczbę zmiennych stanu określa, dla ogólnego prawa konstytutywnego użytkownika, !USER_MATERIAL przez parametr NSTATUS, natomiast dla !PLASTIC, YIELD=USER — wartość zwracana przez uElastoPlasticNumStatus.

Zewnętrzne obciążenia definiowane przez użytkownika

Zewnętrzne obciążenia definiowane przez użytkownika umożliwiają definiowanie w podprogramie użytkownika sił zewnętrznych, których nie można wyrazić za pomocą wbudowanych obciążeń skupionych, rozłożonych ani sił masowych. Gdy w danych sterujących analizą zapisano !ULOAD, FILE=<fname>, FrontISTR przekazuje wskazaną nazwę pliku do ureadload, a informacje odczytane przez implementację użytkownika są przechowywane jako dane modułu.

Wywołaniu !ULOAD odpowiadają następujące trzy podprogramy.

  • ureadload: Na początku analizy odczytuje obciążenia definiowane przez użytkownika z pliku zewnętrznego wskazanego w pliku sterującym. Implementacja użytkownika otwiera plik i zapisuje wymagane dane w zmiennych modułu.
  • uloading: Jest wywoływane podczas składania wektora obciążeń zewnętrznych dla każdego kroku i dodaje obciążenie użytkownika do globalnego wektora obciążeń. Jako argumenty przekazywane są numer bieżącego kroku i współczynnik obciążenia.
  • uResidual: Jest wywoływane podczas składania wektora residuum w każdej iteracji i dodaje wkład obciążenia użytkownika do globalnego wektora residuum. Wywoływane jest zarówno z iteracji nieliniowych, jak i obliczeń równowagi.

Nie udostępniono punktu rozszerzenia dla warunków brzegowych użytkownika (rozszerzeń użytkownika dla zadanych przemieszczeń lub warunków kontaktu). Jeśli potrzebne jest rozszerzenie użytkownika inne niż siła zewnętrzna, należy użyć odpowiedniego wbudowanego słowa kluczowego albo ścieżki prawa konstytutywnego użytkownika.

Procedura implementacji podprogramów użytkownika

Aby użyć podprogramu użytkownika, należy zmodyfikować plik szablonu zawarty w dystrybucji kodu źródłowego FrontISTR, a następnie ponownie skompilować FrontISTR. W dystrybuowanych plikach binarnych nie można podmieniać podprogramów użytkownika, dlatego użycie rozszerzenia użytkownika wymaga środowiska umożliwiającego kompilację FrontISTR ze źródeł.

Szablony podprogramów użytkownika znajdują się w fistr1/src/lib/user/, a dla każdej kategorii rozszerzenia określony jest plik przeznaczony do edycji (nazwy plików podano w tabeli w sekcji Przegląd funkcji). W stanie początkowym pliki zawierają puste ciała podprogramów albo przykładową implementację sprężystości liniowej; użytkownik dodaje w nich własne prawo konstytutywne lub definicję obciążenia. Po edycji szablonu należy ponownie skompilować FrontISTR w zwykły sposób za pomocą CMake i uruchomić analizę wynikowym plikiem wykonywalnym fistr1.

Szczegółowe informacje, takie jak znaczenie argumentów podprogramów, sposób obsługi tablic zmiennych stanu oraz uwagi dotyczące ponownej kompilacji, znajdują się na odpowiednich stronach przewodnika programisty.

Zobacz także