전역 희소 유한 요소 강성 행렬에서 Dirichlet 경계 조건을 효율적으로 구현하는 방법


9

글로벌 희소 유한 요소 행렬의 Dirichlet 경계 조건이 실제로 효율적으로 구현되는 방법이 궁금합니다. 예를 들어 전역 유한 요소 행렬은 다음과 같습니다.

케이=[5201024100016210700020]오른쪽 벡터=[1245]

그런 다음 첫 번째 노드에 Dirichlet 조건을 적용하려면 (엑스1=) 첫 번째 행을 0으로 설정하고 1을 케이11오른쪽에서 첫 번째 열을 뺍니다. 예를 들어 우리 시스템은 다음과 같습니다.

케이=[1000004100016200700020]오른쪽 벡터=[22×0×4+1×50×]

이것은 이론적으로는 훌륭하지만 훌륭하지만 K 행렬이 CRS (압축 된 행 형식)로 저장된 경우 열을 오른쪽으로 이동하면 대형 시스템의 경우 비용이 많이 듭니다 (많은 노드가 디 리클 렛임). 대안은 Dirichlet 조건에 해당하는 열을 오른쪽으로 이동하지 않는 것입니다. 즉, 시스템은 다음과 같습니다.

케이=[1000024100016210700020]오른쪽 벡터=[245]

그러나 이것은 시스템이 더 이상 대칭이 아니므로 더 이상 사전 조정 된 켤레 구배 (또는 다른 대칭 솔버)를 사용할 수 없다는 점에서 큰 단점이 있습니다. 내가 찾은 흥미로운 해결책 중 하나는 Gennadiy Nikishkov의 "Java에서 유한 요소 프로그래밍"책에서 찾은 "다수의 방법"입니다. 이 방법은 배정 밀도에 약 16 자리의 정확도 만 포함한다는 사실을 사용합니다. 에 1을 넣는 대신케이11우리는 많은 수를 배치합니다. 예를 들어 시스템은 다음과 같습니다.

케이=[1.0이자형64201024100016210700020]오른쪽 벡터=[×1.0이자형64245]

이 방법의 장점은 매트릭스의 대칭성을 유지하면서도 희소 한 저장 형식에 매우 효율적이라는 것입니다. 내 질문은 다음과 같습니다.

Dirichlet 경계 조건은 일반적으로 열 / 유체에 대한 유한 요소 코드로 어떻게 구현됩니까? 사람들은 일반적으로 많은 수의 방법을 사용합니까 아니면 다른 일을합니까? 누군가 볼 수있는 많은 수의 방법에 불리한 점이 있습니까? 나는이 문제를 해결하는 대부분의 상용 및 비상업적 코드에 사용되는 표준 효율적인 방법이 있다고 가정하고 있습니다 (분명히 모든 상용 유한 요소 솔버의 모든 내부 작동을 사람들이 알기를 기대하지는 않지만이 문제는 기본 / 기본적 인 것처럼 보입니다. 누군가가 그러한 프로젝트를 수행하고 지침을 제공 할 수있을 정도로 충분히).


2
이것이 실제로 속도를 늦추고 있다는 증거가 있습니까?
Bill Barth

@BillBarth 네, 항상 비효율적 인 일을 할 가능성이 있지만. Gennadily 자신은 명시적인 방법이 완전한 2 차원 배열에 대해 쉽지만 ".. 매트릭스가 컴팩트 한 형식 일 때 매트릭스 행과 열에 액세스하는 것이 항상 쉬운 것은 아닙니다"라고 말합니다. 명시 적 방법은 효율적으로 구현하기가 더 어려울 수 있습니다. 내 코드가 현재 작성되었으므로 명시 적 메서드는 실제 해결보다 시간이 더 걸릴 수 있습니다.
James

1
Wolfgang이 말한 것처럼 조립하고 경계 조건을 요소 행렬에 적용하여 조립하십시오.
Bill Barth

@ BillBarth 네, 그렇게 할 것이라고 생각합니다. 그의 비디오는 훌륭합니다! 방금 각 타임 스텝마다 글로벌 행렬을 다시 조립 해야하는지 여부에 대한 의견 / 질문을 남겼습니다. 그 후 나는 그의 대답을 받아 들일 것이라고 생각합니다.
James

답변:


11

deal.II ( http : //www.dealii.org- 면책 조항 : 나는 그 도서관의 주요 저자 중 하나입니다), 우리는 전체 행과 열을 제거하고 전체적으로 너무 비싸지 않습니다. 트릭은 희소성 패턴이 일반적으로 대칭이라는 사실을 사용하여 전체 열을 제거 할 때 어떤 행을 조사해야하는지 아는 것입니다.

필자의 관점에서 볼 때 더 나은 방법은 셀 행렬에서 이러한 행과 열을 전역 행렬에 추가하기 전에 제거하는 것입니다. 여기서 전체 행렬로 작업하므로 모든 것이 효율적입니다.

나는 많은 수의 접근에 대해 들어 본 적이 없으며 그것을 사용하지 않을 것입니다.

참고로 다루는 알고리즘 II는 http://www.math.colostate.edu/~bangerth/videos.html의 강의 21.6 및 21.65에 개념적으로 설명되어 있습니다. 그들은 당신의 설명과 밀접하게 일치합니다.


2
시간 종속 문제 (열 방정식 등)의 경우 모든 시간 단계에서 글로벌 매트릭스를 다시 조립합니까? 내가 묻는 이유는 0이 아닌 Dirichlet 조건의 경우 오른쪽을 수정할 때 원래 전역 행렬의 정보가 필요하지만 이전 시간 단계에서 해당 열을 제로화하면 저장하지 않는 한이 정보가 손실되기 때문입니다 추가 배열로). 글로벌 매트릭스가 모든 시간 단계마다 재 조립된다면 문제가되지 않을 것입니다. 비록 내가 생각하고있는 것이고 어댑티브 메시를 사용한다면 어쨌든해야 할 것입니다.
James

1
응용 프로그램에 따라 다릅니다. 모든 "큰"코드는 비선형 시간 의존적 문제를 해결하며,이를 위해서는 한 가지 방법으로 다시 조립해야합니다. 선형 코드의 경우 원래 행렬을 저장하고 매 단계마다 다른 곳에서 복사하여 경계 조건을 적용한 다음 솔버에서 사용할 수 있습니다. 이것은 더 많은 메모리를 요구하지만 그렇지 않으면 저렴합니다.
Wolfgang Bangerth

1
아, 나는 그것이 내가 의심 한 것을 본다. 제안한대로 구현하겠습니다. 네 도움이 되었어. 그 deallii 튜토리얼 비디오는 정말 좋은 btw입니다!
James

2

기원전 제로가 쉽습니다. BC가 0이 아닌 경우 Lagrange 승수를 사용할 수도 있습니다. 예를 들어 여기를 참조 하십시오 . LM의 장점 중 하나는 제약 조건 방정식을 사용할 수 있다는 것입니다. 시스템이 무한정으로되어 있으므로 적절한 솔버가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.