2011년 1월 14일 금요일

GMES 이야기를 시작하며...

내 전공은 정보통신공학인데, 국내의 여느 과와 달리 포토닉스 관련 분야를 다룬다. 그중에서도 컴퓨터 모의실험을 주로 하는데, 그 결과로 개발하고 있는 프로그램이 GMES이다. 모의실험에 사용하는 수치해석 프로그램을 개발하다 보면, 수많은 버그와 만나게 되는데 단순한 자판 입력 실수에서부터 프로그램 언어나 알고리듬의 구현 오류와 물리적 이해의 부족에서 발생하는 오류까지, 유형이 참 다양하다. 앞의 두 이유는 다른 분야의 프로그래밍에도 흔하니, 나는 물리적 이해의 부족으로 발생하는 버그에 대해 다뤄보고자 한다.

GMES는 맥스웰 방정식을 수치해석적으로 푸는 FDTD라는 방법을 구현한 프로그램이다. 맥스웰 방정식을 푼다는 점은 전자기 현상을 다룬다는 의미와 이를 양자역학적 해석보다는 고전역학적 해석으로 다룬다는 의미가 있다. FDTD는 우리가 생활하는 공간과 같은 시공간을 그대로 사용하는 방식으로 주파수 공간이나 파수 공간을 사용하는 방식과는 달리, 실제 실험과 유사한 방식으로 계산 공간을 설정할 수 있는 장점이 있다. 즉, 실험 모형과 입력 광원 등을 모두 머릿속에 쉽게 그려볼 수 있다.

GMES의 검증도 겸할까 해서, 학부 물리학과 2학년에 전자기학에서 배우는 쉬운 실험 모형을 하나 골랐다. 바로 두 유전체의 경계면에 입사하는 평면파 모형이다. 이중에서 입력 광원에 대해 살펴보자. 먼저, 이 모의실험에 사용할, 제대로 된 평면파의 모습은 아래와 같다.
정상적인 평면파의 모습
대략 y축의 0.8부터 -1.2까지 사선 방향으로, 완벽하진 않지만, 일정한 위상을 갖는 평면파의 모습을 관찰할 수 있다. 그림의 위와 아랫부분에 평면파가 없는 것은 흡수경계조건과 입력 광원의 위치 때문이다. x축의 -1.0부터 -2.0까지와 1.0부터 2.0까지는 CPML이라는 흡수경계조건을 사용해서 반사 없이 전자기파를 흡수하고, x축의 0.8에 위치한 입력 평면에서 오른쪽 위를 향해 평면파를 입력한다. y축의 왼쪽과 오른쪽 끝은 주기적경계조건(Periodic Boundary Conditions, PBC)이 설정되어 있어서 오른쪽 끝에 다다른 전자기파는 다시 왼쪽으로 입력된다. 그런데 이렇게 나와야 하는 녀석이 아래 그림처럼 나왔다.
허수부 위상을 맞추지 못해 변형된 평면파
사실 연구실에서 직접 만든 모의실험 프로그램은 뭔가 새로운 것을 시도할 때마다 한번에 제대로 된 결과를 내놓는 경우가 거의 없다. 앞에서 말한 세 가지 버그의 유형 중의 하나 이상이 꼭 말썽을 부린다. 이번에는 내 세심함이 부족해서 생긴 문제인데, 세 가지 유형 중의 하나로 따지자면, 물리적 이해의 깊이 부족이지 않을까 한다.

첫 그림의 왼쪽과 오른쪽 끝을 비교해보자. 오른쪽 경계에 다다른 전자기파는 다시 왼쪽 경계로 다시 입력된다고 했는데, 뭔가 이상하지 않은가? 왼쪽과 오른쪽의 경계를 맞춰보면 일치하지 않고 약간 틀어져 있는 것을 알 수 있다. 즉, 어느 정도의 위상차가 있다. 평면파의 위상을 맞추려면, 오른쪽 끝의 전자기파와 왼쪽 끝의 전자기파에 일정 위상차를 주어야 하는데, 이런 위상차를 주려면 전자기파를 복소수로 나타내야 한다. 복소수로 나타낸 전자기파는 단순한 곱셈으로 진폭의 변화 없이 일정 위상만큼 변화를 줄 수 있다.

그럼, 위에서 열거한 것 중에서 뭐가 문제일까? 개별 요소들은 각기 다른 환경에서 검증을 진행해 온 상태이다. 아직 검증하지 못한 부분에 버그가 존재할 수도 있고, 이들의 조합에서 문제가 발생할 수도 있다. 아니면, 내가 뭔가 잘 못 생각하고 있을 수도 있다. 내가 뭘 놓치고 있을까? 모든 가능성을 염두에 두고 print를 이용한 디버깅 정보 수집에 나섰다. 그러던 중 우연히 프로그램 일부가 실수 전자기파를 사용하고 있음을 알 수 있었다. 그리고 그 부분을 찾아보니 입력 광원 구현부였다. 입력 평면을 따라 전자기파의 실수부는 계속 변하는데, 허수부는 일정 위상(0)을 유지하고 있으니, 당연히 문제가 되었던 것이다. 이를 수정하니, 첫 번째 그림과 같은 정상적인 평면파를 볼 수 있었다.

댓글 없음:

댓글 쓰기