brunch

You can make anything
by writing

C.S.Lewis

by 제이 Jul 06. 2021

천체물리 석사생이 듣는 수업 -3-

소문과 실제는 다르다

두 번째 학기 때부터는 1 period 당 1 수업만 들었다. 나머지 절반은 연구에 쓰기 시작했다. 봄학기 첫 번째 period에는 Computational Astrophysiscs를 들었다. 말 그대로 천체물리학에서 사용하는 컴퓨터 기법들을 배우는 수업이었다. 이 수업을 듣기 전 주변에서 정말 좋은 수업이고 많이 배우는 수업이지만 너무 어렵고 힘들다는 소문을 들었다. 이 수업을 들었다는 사람들은 다들 학을 떼면서 경고를 줘서 잔뜩 긴장하고 수업을 들어갔다. 결론부터 말하자면 소문보다는 할 만했다. 


이 수업은 이론과 실험으로 나뉘어 있었는데 이론 수업에서는 다양한 시뮬레이션의 기법과 원리 등을 배웠고 실험에선 주어진 과제를 코드로 짜서 결과를 내고 보고서를 쓰는 것이었다. 이론 수업은 쉽진 않지만 그냥 들으면 되는 거니 어렵진 않았다. 하지만 실험에서는 정말 머리를 쥐어짰다. 매뉴얼에는 내가 무엇을 만들어야 하고 어떤 기법을 사용해야 하며 그 결과로 어떤 질문에 답해야 하는지만 적혀있었다. 코드의 구조를 짜고 결과를 어떤 식으로 도출해낼지는 오로지 내가 알아내야 하는 것이었다. 소문이 왜 그렇게 무시무시했는지 알 것 같았다. 


새로운 프로젝트가 시작되고 첫 실험 시간(이라 쓰지만 사실 그냥 다 같이 컴퓨터 앞에 앉아서 각자 코딩하는 시간이다)에 갑갑한 마음으로 앉아있자 옆에 앉은 친구가 팁을 하나 알려줬다. 일단 중력 상수(Graviational constant)를 정의하고 시작하라는 것이었다. 이게 무슨 소리인가 싶었지만 중력 상수가 필요하긴 해서 일단 적었는데 신기하게도 그 후에 한 줄 한 줄 코드를 짤 수 있었다. 그 친구의 진짜 팁은 생각만 하지 말고 일단 시작하라는 것이었던 거 같다.


첫 번째 프로젝트: 태양계 행성의 움직임 계산

첫 번째 프로젝트는 Runge-Kutta Methods를 사용해서 직접 N-body integration을 만들어보고 태양계의 움직임을 계산하는 것이었다. Runge-Kutta라는 것도 거의 처음 보는데 그걸 이용까지 해서 integration을 직접 만들어보라니 눈앞이 깜깜했다. 그래도 중력 상수 팁으로 일단 시작해보면서 어찌어찌 코드를 완성한 기억이 난다. 물론 중간에 수많은 오류와 말도 안 되는 결과로 고생은 했지만 꽤 만족스러운 결과로 첫 번째 프로젝트를 끝냈다. 


첫 번째 프로젝트: 태양계 행성들의 움직임.


두 번째 프로젝트: 목성 트로이 소행 성군의 움직임 계산

두 번째 프로젝트는 첫 번째 프로젝트를 사용해서 목성의 트로이 소행 성군을 만드는 것이었다. 시뮬레이션에 들어가는 물체들의 수도 늘고 새로운 중력의 영향을 계산해야 해서 코드를 많이 바꾸긴 했지만 기본적인 틀은 똑같았기 때문에 이 프로젝트는 큰 어려움 없이 끝낼 수 있었다. 


세 번째 프로젝트: The Shock Tube Problem 풀기

세 번째 프로젝트는 Smoothed Particle Hydrodynamics (SPH) 코드를 직접 만드는 것이었다. SPH 코드를 1D로 만들어서 The Shock Tube Problem을 풀어내는 프로젝트였다. The Shock Tube Problem의 1D 버전은 한 파이프에 가스 입자들이 채워져 있는데 중간의 차단막을 기준으로 입자들의 압력, 온도, 움직임이 다르다고 할 때 차단막이 사라지면 일어나는 물리적 현상을 예측하는 시뮬레이션이다. 쉽지 않은 프로젝트였지만 코드만 잘 정리해서 짰다면 큰 어려움 없이 완성시킬 수 있었다. 이다음 프로젝트가 악명 높은 SPH 코드의 3D 버전이란 걸 모르기만 했다면 꽤 즐겁게 이 프로젝트를 했을 것이다. 


네 번째 프로젝트: 행성 간 충돌 계산

대망의 마지막 프로젝트는 이 전 프로젝트에서 만들었던 SPH 1D 버전을 3D로 만들어 행성 간의 충돌을 시뮬레이션하는 것이었다. 처음엔 그렇게 어렵지 않을 줄 알았다. 이미 1D가 있으니 그걸 그냥 조금 업데이트만 하면 될 줄 알았다. 하지만 한 줄 한 줄 쓰다가 아 구조를 아예 다시 짜야한다 라는걸 깨달았을 땐 소문이 진짜일 수도 있겠다 싶었다. 이 프로젝트를 시작하기 전에 교수도 이미 이 프로젝트는 너무 어렵고 코드를 한 번 돌리는데도 시간이 너무 많이 든다고 경고도 했었다. 일주일 정도는 1D 버전의 코드를 어떻게든 업데이트하려고 붙잡고 있었다. 두 번째 주에는 1D 버전의 코드를 버리고 처음부터 다시 짜기 시작했다. 세 번째 주가 되어서야 내 코드에 구조적으로 큰 오류가 있다는 걸 알았고 다시 처음부터 코드를 짰다. 세 번째 주가 끝나갈 때쯤 교수를 붙잡고 조교를 붙잡고 매달린 끝에 겨우 코드를 완성했다. 코드가 돌아가고 제대로 된 결과를 보여줬을 때의 감동이란.... 세 번째 주가 가장 다이내믹했는데 코드가 돌아가긴 하지만 결과가 너무나 이상했다. 구의 형태를 지녀야 할 행성이 느닷없이 십자가 모양을 만들어서 서로 충돌했기 때문이다. 그때 교수와 조교를 얼마나 들들 볶았던지 지금도 조금 미안하다. 

네 번째 프로젝트: 행성 간 충돌 영상 스냅샷
네 번째 프로젝트: 행성 간 충돌 영상


그래도 내 코드는 교수가 경고했던 것보다 훨씬 빠르고 간단하게 돌아갔다. 몇 번을 다시 쓰고 다시 쓴 결과, 코드가 최고의 효율을 내게 된 것이었다. 그렇게 무사히 마지막 프로젝트를 끝나고 기말 시험으로 천체물리학에 사용되는 컴퓨터 기술들에 대한 문헌조사와 그에 대한 발표를 했다. 모든 과제를 마친 후 다시 생각해보니 이 수업이 그렇게 힘들었다고 생각되지 않았다. 물론 쉽진 않았지만 소문에서 경고했던 것처럼 대부분이 시간 내에 프로젝트를 끝내지 못하고 밤을 새우고 코드가 너무 무거워 컴퓨터가 다운되어버리는 일은 일어나지 않았다. 물론 내가 교수와 조교를 달달 볶기도 했고 그들도 작년 학생들의 의견을 듣고 더 열심히 학생들을 도왔겠지만 나는 소문이 조금 과장된 거 같기도 하다고 생각했다. 물론 입 밖으로는 꺼내지 못한 말이지만. 

매거진의 이전글 천체물리 석사생이 듣는 수업 -2-
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari