Jak usunąć sztywne ruchy ciała w liniowej elastyczności?

9

Chcę rozwiązać Ku=b gdzie Kjest moją macierzą sztywności. Jednak może brakować niektórych ograniczeń i dlatego w systemie może nadal występować sztywny ruch ciała (z powodu wartości własnej zero). Ponieważ używam CG do rozwiązywania układu liniowego, jest to niedopuszczalne, ponieważ czasami CG nie zbiega się w przypadku problemów częściowo dodatnich (ale czasami mogę się zbiegać).

Właściwie stosuję karę za przemieszczenie w tym sensie, że dodam karę za formę α||u||2do energii sprężystej. Tak więc energia czyta

W(u):=12uT(K+αI)ubtu
gdzie αprzyjęty jako proporcjonalny do pewnego wejścia po przekątnej macierzy sztywności. Ale w rzeczywistości powoduje to tłumienie trybu deformacji, który kiedyś chciałbym mieć.

Niektóre moje pytanie brzmi:

a) czy mógłbym przekształcić oryginalny system, więc musi on być wolny od osobliwości i pozytywnie określony (taki jak transformacja współrzędnych lub transformacja zgodności, czy cokolwiek innego)? Moim pomysłem jest użycie takiej transformacji, aby nadal używać CG w przekształconym problemie

b) Czy istnieje jakiś standardowy sposób radzenia sobie z tymi osobliwościami?

Dziękuję Ci bardzo !

Z poważaniem,

Tomek

Tomek
źródło

Odpowiedzi:

6

Standardowym sposobem jest dodanie ograniczenia u(x0)=0 dla dowolnie wybranego węzła x0. Zapewnia to, że twoje ciało nie może się tłumaczyć ani obracać, a zatem zabiera zerową wartość własną. Wynikowy system z tym ograniczeniem jest dodatni, nawet bez kary.

Wolfgang Bangerth
źródło
1
Dziękuję Ci! Tak, ale w moim przypadku mam kilka pływających podstruktur i nie wiem, które węzły (3 węzły nieliniowe w 3D) należy naprawić. Dlatego zastanawiam się, czy nie ma rozwiązania wyższego poziomu, ponieważ w moim przypadku pusta przestrzeń jest dobrze znana.
Tom
Jeśli masz kilka struktur, musisz naprawić jeden węzeł dla każdej struktury. Nie ma znaczenia, który z nich, po prostu wybierz jeden na strukturę.
Wolfgang Bangerth
3
@WolfgangBangerth Jest to elastyczność 3D, dlatego należy przypiąć trzy punkty nieliniowe, aby kontrolować zerową przestrzeń wymiaru 6. Przypięcie tych trzech przemieszczeń jest zaburzeniem rangi 9 i nie jest łatwo zapewnić, że modyfikacja rangi 3 wykraczająca poza pusta przestrzeń nie zmienia rozwiązania. Dla dowolnego wyboru punktów i wartości do przypięcia, istnieje trójwymiarowa rodzina prawej strony, w której twój przypięty problem daje poprawną odpowiedź tylko dla jednego członka.
Jed Brown
Nie, nie możesz przypiąć 3 punktów dla 9 wiązań, ponieważ wtedy również ustaliłbyś ich względne odległości. Jeśli twoje warunki brzegowe naprawdę nie zapewniają żadnych innych ograniczeń (np. Jeśli nie mają one normalnego przemieszczenia na okręgu), musisz naprawić 1 punkt + różne kąty obrotu w dwóch innych punktach, co daje w sumie 6 wiązań.
Wolfgang Bangerth
6

Jeśli znasz spację zerową, możesz ustawić zgodność prawej strony i ustawić metodę Kryłowa na zapobieganie zanieczyszczeniom przez kondycjoner, zobacz Dlaczego przypinanie punktu, aby usunąć spację zerową, jest złe? do dalszej dyskusji. W PETSc odbywa się to za pomocą MatNullSpaceobiektu. Pamiętaj, że możesz podać własną funkcję do rzutowania pustej przestrzeni, co byłoby przydatne w celu zmniejszenia kosztów projekcji, gdy masz wiele struktur pływających.

Jeśli nie znasz spacji zerowej i nie możesz uniknąć niezgodnej prawej strony, istnieją wyspecjalizowane metody Kryłowa, takie jak MINRES-QLP, które mogą znaleźć rozwiązanie normy minimalnej. Takie podejście może być przydatne, jeśli masz zawiasy i połączenia jednopunktowe, które łączą tylko niektóre tryby. Należy pamiętać, że nadal należy zachować ostrożność, aby czynnik przygotowujący powodował zanieczyszczenie (np. Ze względu na faktoryzację LU znajdującą zero osi, być może na grubym poziomie multigrid).

Jed Brown
źródło
Dziękuję Jed! Myślałem o usunięciu przez rzutowanie pustej przestrzeni bezpośrednio w mojej metodzie iteracyjnej. Zastanawiałem się jednak, czy nie było to zbyt kosztowne (mogę stworzyć operator, który rzutuje przestrzeń zerową, ponieważ jej elastyczność jest naprawdę trywialna). Uważam też, że reszta również powinna być wyświetlana?
Tom
2
Dopilnuj, aby prawa strona była zgodna i rzutuj puste miejsce po każdej aplikacji wstępnego kondycjonowania (ponieważ wiele wstępnych zanieczyszczeń zanieczyści puste miejsce). To daje operator KryłowaK=(IN)P1A takie, że {b,Kb,K2b,}jest prostopadła do spacji zerowej. Ponieważ twój problem jest symetryczny, nie potrzebujesz innej procedury dla lewej i prawej spacji zerowej. To właśnie robi PETSc, jeśli zadzwonisz MatSetNullSpace().
Jed Brown