지난 며칠 동안이 오류를 디버깅하려고했지만 아무도 진행하는 방법에 대한 조언이 있는지 궁금합니다.
셀 센터에 알 수없는 것이 정의되고 셀면의 플럭스가있는 불균일 유한 체적 메쉬에서 단계 전하 분포 (정전기 / 반도체 물리학의 일반적인 문제)에 대한 푸 아송 방정식을 풀고 있습니다.
청구 프로필 (원본 용어)은
경계 조건은
도메인은 입니다.
advection-diffusion-reaction equation을 해결하기 위해 개발 된 코드를 사용하고 있습니다 ( http://danieljfarrell.github.io/FVM ). 이류-확산-반응식은 포아송 방정식의보다 일반적인 경우입니다. 실제로 포아송 방정식은 대류 속도를 0으로 설정하고 과도 항을 제거함으로써 회복 될 수 있습니다.
이 코드는 균일하고 비 균일하며 임의의 그리드에 대한 여러 상황에 대해 테스트되었으며 항상 advection-diffusion-reaction equation에 대한 합리적인 솔루션 ( http://danieljfarrell.github.io/FVM/examples.html )을 생성합니다 .
코드가 고장 난 곳을 보여주기 위해 다음 예제를 만들었습니다. 20 셀 의 균일 한 메쉬를 설정 한 다음 단일 셀을 제거하여 균일 하지 않게 만듭니다 . 왼쪽 그림 에서 셀을 제거 했으며 오른쪽 가 제거되었습니다. 제 9 셀은 소스 용어 (즉, 전하)가 부호를 변경하는 영역을 커버한다. 반응 용어가 기호를 변경하는 영역에서 그리드가 균일하지 않은 경우 버그가 나타납니다 . 아래에서 볼 수 있듯이.
이 문제를 일으킬 가능성이있는 아이디어가 있습니까? 이산화에 관한 더 많은 정보가 도움이되는지 알려주십시오 (이 질문에 너무 자세한 내용을 담고 싶지는 않습니다).
답변
따로, github 문서는 환상적입니다.
이것은 수치 플럭스를 신중하게 선택하지 않으면 비슷한 문제가 발생할 수있는 DG 방법의 추측 일뿐입니다 (FV 방법은 DG 방법의 하위 집합이라고 생각합니다). 셀 중심에서 보간법을 사용하여 플럭스를 정의하는 경우, 평균을 DG의 숫자 플럭스로 사용하고 구간 별 상수를 사용하는 것과 같습니다. Poisson의 표준 DG 방법의 경우 수치 적으로 고유하지 않은 솔루션으로 이어집니다. 이산 연산자를 위해 사소한 null 공간을 얻을 수 있습니다. DG 측의 이론에 대해서는 이 DG 논문 을 참조하십시오 .
FV에 대한 예제를 모방하여 이것이 어떻게 작동하는지 보여 드리겠습니다.
편집 : 여기에 무슨 일이 일어나고 있는지에 대한 작은 예가 있습니다. 1-9 및 11-20 셀을 고려하십시오.
. 오른쪽 (11-20)부터
그 세포에 대한 보존으로부터 우리에게 알려주는 Neumann 조건 때문에
. 플럭스는 셀 값의 평균이므로, 이것은 우리에게
이 모든 세포에 대해 일정합니다.
왼쪽에서 (1-9)
. 만약
고스트 셀을 사용하고
. 다음 몇 세포에 대한 보존은
(즉, 일정한 기울기). 그러나 이것은 일정한 기울기 일 수 있습니다.
이 문제는 중간 셀에서 발생합니다. Jan이 언급 한 것처럼 두 번째 메쉬에서 강제를 언더 샘플링합니다. 이 시점에서 균형 방정식을 버리고 오류가 발생합니다.
그런 다음 뒤로 전파되어 도메인의 왼쪽 절반에있는 기울기와 값을 모두 엉망으로 만듭니다.
.
강제 오류에 대한이 민감도는 문제가됩니다. FEM 또는 FD 방법과 달리
FV는 고스트 노드를 사용하여 약하게 시행합니다. 직관적으로 고스트 노드 약한 부과는 왼쪽 경계에 Neumann 조건을 설정하는 것과 같습니다. 확산 문제에 대해 두 가지 Neumann 조건이있는 경우, 문제가 잘못되고 고유하지 않은 솔루션이 있습니다 (해당 문제에 상수를 추가해도 여전히 솔루션이있을 수 있음). 여기서는 이산 레벨에서 그것을 얻지 못하지만 실험에서 볼 때 매우 민감하고 메쉬 의존적 인 행동을 얻습니다.
답변
가장 먼저 알아 두어야 할 것은 경계 조건입니다. 기울기와 값을 변경할 수 있으므로 Dirichlet 또는 Neumann 조건이 없습니다.
그런 다음 모든 직선은 오른쪽이 0 인 솔루션입니다. 당신은 그 부분을 얻었다.
플럭스는 아마도
. 올바른 것을 사용하십니까
세포를 어디에서 제거합니까?