연구 프로젝트
완료됨

우주론 시뮬레이션

PNU Cosmology Group · 심준섭 교수님 지도 · 2026년 봄학기 보조 연구

우주론 시뮬레이션

소속

부산대학교 PNU Cosmology Group

협업

심준섭 교수님

기간

2026년 4월 - 2026년 6월

수정됨:
태그:cosmologysimulation

프로젝트 개요

2026년 봄학기 약 두 달 동안, 부산대학교 사범대학교 지구과학교육과의 심준섭 교수님께서 Fortran 시뮬레이션으로 생성하신 Friends-of-Friends (FoF) 헤일로 카탈로그 바이너리 파일을 Python 환경에서 읽고, 플롯으로 정리하는 보조 연구를 수행했습니다.

주요 목표는 완성된 그림을 단순히 재현하거나 히스토그램만 그리는 것이 아니라 바이너리 데이터와 그 구조를 이해하고, 카탈로그의 입자 수, 좌표, 보조 텐서 정보를 질량, 거리쌍, 방향성 및 시각화 척도로 바꾸어 플롯으로 구성해 보는 것이었습니다. 이 과정에서 고윳값 분해, 행렬·텐서 대칭화, 추정량, 주기적 경계 조건, 대량 배열 처리도 함께 배웠습니다.

제가 작성한 코드의 일부는 GitHub, youngjinphys/FoF_Simulation_Plot 레포지토리에 업로드 예정입니다.

공개 범위 안내

이 문서는 인턴십 과정에서 진행한 학습 및 구현 범위만 요약합니다. 제게 공개 권한이 없거나 peer review를 거치지 않은 바이너리 데이터, 실제 데이터의 플롯, 연구 결과 해석 및 결론은 포함하지 않습니다.

역할 및 활동 범위

우주 거대 구조 및 암흑물질 헤일로 시각화 이미지
우주 거대 구조 시각화 (AI 개선)

약 두 달간의 학부 인턴 연구 경험을 요약했습니다.

GroupPNU Cosmology Group
Advisor심준섭 교수님
Period2026.04.17 - 2026.06.30
Role학부 인턴 (보조 연구)

작업 범위

바이너리 카탈로그 읽기와 스케일 변환

코드에서는 헤일로별 입자 수, 격자 좌표, 그리고 COM 중심 블록을 명명된 필드로 분리했습니다. 좌표는 격자 단위에서 Lbox/NgridL_\mathrm{box}/N_\mathrm{grid}를 곱해 Mpc/h 단위로 옮겼습니다.

FoF 질량과 HMF 플롯

카탈로그의 헤일로별 입자 수를 이용해 를 만들고, 이를 로그 질량 구간으로 묶어 로 표시했습니다.

2pCF와 estimator 학습

좌표를 시뮬레이션 길이 단위로 변환하고, 주기적 경계 조건을 고려한 거리 구간별 pair count를 계산했습니다. 이후 를 통해 무작위 기준선과 정규화가 왜 필요한지 학습했습니다.

헤일로 크기 보조 시각화

카탈로그의 second-moment tensor를 대칭화하고 고윳값을 이용해 주요 RMS 척도를 계산했습니다. 이 값은 로만 사용했으며, 공개 결과나 경계 측정값으로 해석하지 않았습니다.

원본 데이터가 계산에 들어간 방식

코드 기준으로 공개 가능한 입력은 헤일로별 입자 수 NpN_p, 격자 좌표 xgrid\mathbf{x}_\mathrm{grid}, 그리고 카탈로그의 xx, qq second-moment tensor 블록이었습니다. 기본 변환은 MFoF=NpmpM_\mathrm{FoF}=N_p m_p, x=xgridLbox/Ngrid\mathbf{x}=\mathbf{x}_\mathrm{grid}L_\mathrm{box}/N_\mathrm{grid}였습니다.

HMF 플롯은 로그 질량 bin마다 ΔN\Delta N을 세고, dn/dlog10MΔN/(VboxΔlog10M)dn/d\log_{10}M \approx \Delta N/(V_\mathrm{box}\Delta\log_{10}M) 형태로 부피와 bin 폭을 나누었습니다. 2pCF는 거리 bin별 DDDD, DRDR, RRRR을 세고, 정규화된 pair count에 대해 ξ^LS(r)=(DD2DR+RR)/RR\hat{\xi}_\mathrm{LS}(r)=(DD-2DR+RR)/RR를 적용했습니다.

헤일로 크기 표시는 xxqq를 각각 3x3 대칭 행렬로 만든 뒤 고윳값 λi\lambda_i를 사용했습니다. 코드의 스케일 진단에 따라 xx는 입자 수가 곱해진 Eulerian second moment로 보고 ai=Lboxλi/Npa_i=L_\mathrm{box}\sqrt{\lambda_i/N_p}, qq는 입자 평균 Lagrangian second moment로 보고 ai=Lboxλia_i=L_\mathrm{box}\sqrt{\lambda_i}를 principal RMS half-axis로 사용했습니다. shape 통계에서는 s=c/as=c/a, q=b/aq=b/a, T=(a2b2)/(a2c2)T=(a^2-b^2)/(a^2-c^2)를 계산했지만, 이 값들은 시각화와 학습용 요약량이지 peer-reviewed 물리 결론으로 공개하지 않았습니다.

주요 학습 내용 및 인사이트

  • 대규모 Python 연산 경험: Python으로 처음 대규모 과학 배열을 다루며, NumPy/SciPy/Matplotlib 기반 처리, 청크 단위 pair count, 멀티코어 Pool 실행, 캐시 재사용, figure close 같은 운영 습관을 익혔습니다.

트러블슈팅 및 디버깅

  • MLX 가속 시도와 CPU 경로로의 회귀: Pair Count 계산 시간이 길어 Apple MLX로 GPU 가속을 시도했지만, 전체 N×NN \times N 거리 행렬을 만든 뒤 일부만 histogram에 쓰는 방식이어서 메모리 사용량과 레이턴시를 줄이지 못했습니다. 최종 2pCF 경로는 cKDTree.count_neighbors 기반 CPU pair count, 청크 처리, 캐시 재사용으로 구성했습니다.
  • 3D 텐서의 2D 투영 처리: 3D 고유벡터를 단순히 평면에 투영한 뒤 그리는 대신, 투영 평면의 2x2 텐서를 다시 대각화해 화면상의 장축을 구했습니다. 이는 시각화 방향 오류를 줄이기 위한 수학적 보정입니다.

감사의 글

짧은 기간이었지만 연구 데이터를 다뤄볼 기회와 적극적으로 지도해주신 심준섭 교수님께 감사드립니다.