Posts

분자동역학(Molecular Dynamics)에서 Time Integration의 개념.

분자동역학 (molecular dynamics, MD) 시뮬레이션은 앙상블(ensemble)을 구성해 계산을 진행한다. 앙상블은 가장 기초적인 형태인 NVE ('microcanonical ensemble', 원자수, 체적, 에너지가 일정한 앙상블)부터 NVT ('canonical ensemble', 원자수, 체적, 온도가 일정한 앙상블), NPT ('isobaric-isothermal ensemble', 원자수, 압력, 온도가 일정한 앙상블) 등의 세 가지가 가장 많이 사용된다. 그 중에서도 가장 많이 사용되는 앙상블의 종류는 NVT인데, 이는 일반적으로 우리가 실제로 어떤 실험을 하거나 어떤 시스템을 제어하는 경우에 '에너지'를 기준으로 측정/제어하지 않고 대체로 온도를 지표로 이용하기 때문에 NVE ensemble로 실조건을 모사하는데 어려움이 있고, 반대로 NPT의 경우에는 압력 조건을 강제하기 때문에 원치 않는 인위가 발생하여 compressive / tensile stress와 같은 기계적 물성치 예측이나 phase transformation 등 내부 응력에 민감한 실험을 진행할 경우 적절한 결과를 얻기 어렵기 때문이다. 아무튼 간에, 우리가 계를 해석하는데 적절한 앙상블 종류를 선택하고 나면, 실제로 MD 계산을 돌리기 위해서는 앙상블 형태에 맞는 time integrator를 준비해야 한다. Time integrator란 현재 우리가 관찰하고 있는 계의 거동을 지정된 time step의 크기마다 한번씩 예측해나가는 장치로서, 이를 통해 한 단계 한 단계 계산해 나가면 (= time evolution) 결국 우리가 예측하고자 하는 계의 평형상태를 계산해 낼 수 있다. 앞서 소개한 NVT 앙상블에서 time integrator의 사용을 예로 들어보자. 우리가 MD 코드에 넘겨주는 정보는 각 원자들의 초기 좌표값과 온도이다. (MD의 기본원리와 개념에 대해서는 나중에 포스팅 하겠다.)

Reciprocal lattice란 무엇인가?

Image
오늘은 reciprocal lattice와 물리 공간상에서 격자구조를 기술하는 Bravais lattice, 이 두 가지 격자가 어떻게 다르며, 또 어떻게 연결되어 있는지 알아보겠다. Reciprocal lattice의 도입은 아래와 같이 간단한 한가지 생각에서 출발했다. "결정 구조는 특유의 대칭성과 반복성으로 인해 배열구조가 특정 방향을 따라 주기적인 특성을 갖고 있다. 그렇다면, 이 구조가 갖는 물리적인 특성들도 주기성을 띄지 않을까?" 주기성 하면 자동으로 떠오르는 것이 파형 아닌가.  따라서 주기성을 염두해 결정구조체의 물성을 이해하고자 하는 시도는 plane wave를 이용해 격자 배열을 기술하는 방식, 즉, reciprocal lattice를 도입하는 것으로 이어졌다. 자, 그럼 이제부터는 천천히 reciprocal lattice의 기술 방식을 살펴보겠다. 우선 파형을 사용하기로 했으니 'k'라는 임의의 wave vector로 기술되는 간단한 plane wave 식을 가져오자. $$ \Psi_{k}(r) = \Psi_{0} \cdot e^{i \bf{k} \cdot \bf{r}} $$ 이 때, 'r'은 임의의 위치벡터이며, 위치 공간 내에 존재하는 이 결정구조의 Bravais lattice는 정의에 따라 아래와 같은 벡터 집합으로 정의되어 있다. 여기서 m, n, o는 정수이며, a1부터 a3 까지의 벡터는 Bravais lattice의 basis vectors이다. $$ \textbf{R} = m \textbf{a}_{1} + n \textbf{a}_{2} + o \textbf{a}_{3} $$ position vector에 대응하는 Bravais lattice가 'R'이고, wave vector에 대응하는 reciprocal lattice는 'k'이다. (이후에 알 수 있지만, reciprocal lattice도 Bravais lattice임)

비리얼(virial)이란 무엇인가?

Image
비리얼, 'virial'이란 표현은 'force'를 뜻하는 'vis'에서 유래됐다. 오늘은 비리얼에 대해서 이야기를 해보고자 한다. 지금까지 분자동역학(molecular dynamics, MD)을 공부하면서 '비리얼'이란 단어는 종종 들어봤지만, 내가 직접 비리얼 계수(virial coefficient)나 비리얼 응력(virial stress), 비리얼 압력(virial pressure) 등을 계산하거나, 이를 통해 퍼텐셜을 피팅해 본 적이 없기에 그냥 위키피디아에 한번 쳐보고 뭔지 모르겠다며 지나간 기억이 있다. 그런데 최근에 여러 통계역학적인 기초들, 그리고 분자동역학의 기초 기술들을 차근차근 공부하다보니 한번쯤 짚고 넘어가야 하는 주제라 생각해서 정리해보고자 한다. 내가 비리얼을 구글링하여 처음에 마주친 것은 'virial coefficient'라는 것이었다. 고등학교 시절, 우리는 이상기체의 거동을 나타내는 상태방정식으로 다음의 등식을 배웠다. $$PV  = nRT$$ 헌데, 이 상태방정식은 이상기체를 해석하는데에만 유효하며, 우리는 실재하는 분자들로 구성된 기체를 해석하기 위해 압축인자(compressibility factor) 'Z' 라는 것을 도입했다. 압축인자는 아래와 같이 정의된다. $$Z = \frac{PV}{nRT}$$ 여기서 압축인자는 상태방정식에 곱해지는 hyper parameter이며, 현재 관찰하는 기체의 거동이 이상기체의 거동으로부터 얼마나 벗어나 있는가를 나타내는 척도로 사용된다. 당연한 얘기지만 압축인자가 1일 경우 상태방정식이 정확히 이상기체상태방정식과 동일해진다. 다시 virial로 돌아가서, 'virial coefficient'는 이 압축인자를 결정하는 하나의 방법으로 'virial expansion'이라는 방식을 사용할 때, 이 expansion set의 항에 들어가는 계수들(

격자구조 내 변형률, 응력 및 탄성계수(elastic constants)의 분석, analysis of elastic strains

이 포스팅은 Kittel의 저서 Introduction to Solid State Physics의 3장 내용의 일부를 따라가는 과정을 정리해 둔 것이다. 최근에 퍼텐셜 피팅을 진행하면서, 퍼텐셜 함수의 계수들을 결정하기 위해 탄성계수를 계산해야 하는 상황을 마주했다. 급한대로 결과를 내야 했기 때문에 Baskes의 1984년도  EAM 논문을 참고해서 일단은 명시된 수식을 그대로 코딩하고 탄성계수를 계산하긴 했으나, 그 당시에는 식의 의미를 100% 이해하고 넘어가진 못했다. 이번 포스팅은 그러한 점을 보완하기 위한 공부이다. 우리가 다루는 물질이 등방성 물질이라고 가정하자. 학부 시절, 우리가 변형률이나 응력을 계산할 때는 보통 연속체로서 물질을 다뤘다. 그러니까, 물질이 원자 하나하나의 결합으로 만들어진 구조체라고 보는 것이 아니라 그냥 하나의 덩어리라고 가정했다. 하지만 이러한 연속체 역학적 관점으로 변형을 해석하는 것은 최소한 elastic wave의 파장이 10^-8 m 이상일 때나 가능한 얘기이고, 이러한 문제가 미시적인 세계로 넘어가면, 이러한 해석 방법은 더이상 맞지 않게 된다. 우리는 연속체 역학에서 변형률과 응력을 계산하기 위해 Hooke's law와 Newton 제2법칙을 사용할 것이다. 다만, Hooke's law는 변형이 아주 작은 (= 변형이 선형적인) 구간에서만 유효한 법칙이며, 우리가 다루는 미시세계는 변형이 비선형적이라고 가정할 것이다. 앞으로는 여러가지 벡터를 정의할 것이다. 뻔한 이야기를 수식으로 풀어쓰는 과정이지만 수식 자체보다는 그 수식이 내포하는 의미를 잘 이해하는 것이 중요하다. 우리가 해석하고자 하는 고체 물질이 놓여있는 공간에 orthogonal한 세 개의 unit vector를 정의한다. $$\textbf{x}', \textbf{y}', \textbf{z}'$$ 이 고체 물질에 균일하면서도 작은 변형이 가해지면, 위에서 세 벡터로 정의한 축들의 방향과 길이는 다

텐서플로우를 이용한 간단한 다항식 피팅(regression): 텐서플로우 기초 요소 이해

사실상 전통적인 분자동역학 분야에서는 딥러닝을 필요로 하지 않는다. 머신러닝이라 부르든, 그냥 regression이라고 부르든, 아무튼 '주어진 목적함수에 대해 목표치와 예측치 사이의 오차를 최소로 줄여나가는 fitting process에 대해서만 알고 있다면, 누구나 퍼텐셜을 피팅 할 수 있다. 텐서플로우가 주목을 받은 이유는 다양한 deep layer 구조를 쉽게 구현할 수 있도록 코드가 잘 짜여져 있기 때문인데, 그러한 연유로 만약 당신이 potential fitting을 한다면 굳이 텐서플로우를 이용할 필요는 없다. 허나, 나는 이번에 EAM potential을 피팅하는 프로젝트를 진행하면서 텐서플로우를 작업 툴로 선정했다. 그 이유는 여러가지가 있는데, 어쨌든 학문에 몸담으로 사람으로서 세간의 방법론적인 유행에 발은 맞춰놔야 하지 않나, 하는 생각도 들고, 또 앞으로 퍼텐셜의 형태가 종래의 형태와 같이 수식의 형태를 띄지 않고 인공신경망 구조로 학습되어 일종의 예측 프로그램 형태로 발전되지 않을까, 하는 생각도 들었기 때문이다. 이번 포스트는 텐서플로우 공식 홈에 있는 regression 예제 코드를 면밀히 살펴보면서, 텐서플로우의 특징, 사용방법들을 한꺼번에 알아볼 생각이다. 그러면서 나도 텐서플로우와 조금은 친해져 봐야지. 예제 코드는 다음에서 확인할 수 있다[ 예제코드 ]. 먼저 코드의 맨 윗 단을 보면 다음과 같이 세 개의 모듈이 import 되어 있다. import numpy as np import tensorflow as tf import matplotlib.pyplot as plt 'numpy'는 굳이 쓰지 않아도 되는 모듈이지만, 행렬을 많이 사용하는 코드에서 이 모듈을 쓰지 않으면 코딩이 굉장히 귀찮아진다. 여러가지 연산이라든지 행렬 선언, precision 설정 등등에서 numpy를 통한 선언이 훨씬 편하고 유용하므로 numpy를 사용하는 습관을 기르는 것이 좋다. 'matplotlib.

Ergodicity란 무엇인가?

Ergodicity를 이해하기 위해서는 우선 앙상블(ensemble)을 이해해야 한다. 관련글은 블로그의 이전 글을 참고하기 바란다[ 'Statistical Ensemble이란 무엇인가?' ]. Ergodicity의 개념은 간단한 것일지라도, 이 문제는 통계적 분석을 할 때 우선적으로 고려돼야하는 아주 중요한 개념이다. 복잡한 설명 없이, 간단한 예를 통해 ergodictiy를 이해해보자. 우리가 최근 10년간 한국에서 제일 잘팔린 치킨 브랜드를 알고 싶어한다고 치자. 우리가 활용할 수 있는 데이터는 다음의 두 가지가 있다. 첫번째, 영희네 가족이 지난 10년간 쌓아온 5000회의 주문내역. 두번째, 10년 간 한국 국민들이 주문한 내역 중 임의로 샘플링된  5000개. 둘 중 어떤 것을 골라 분석해야 모집단 전체의 통계치에 근접한 추측이 가능할까? 통계를 전혀 모르는 초등학생에게 물어보더라도, 그 사람이 정상적인 지능을 가진 인간이라면 두번째 데이터셋을 고를 것이다. 이유에 대해서는 굳이 설명 않겠다. 대신에 우리는 두 가지 데이터셋이 어떻게 다른지를 살펴볼 것이다. 우선, 두가지 경우 모두 시행 횟수는 오천번으로 동일하다. 하지만 첫번째의 경우는 한사람이 주문한 내역인 반면, 두번째의 경우는 임의로 선택된 오천명이 주문한 정보이다. 위의 상황을 통계학적인 용어로 바뀌 말하자면, 첫번째 경우는 단일 시스템에 대한 시간평균(time-averaged) 거동을 살펴볼 수 있는 자료며(= '영희내 집 치킨 주문 행태, 그 10년간의 기록'), 두번째 경우는 치킨 구매자 앙상블의 다양한 정보를 활용해 앙상블평균(ensemble-averaged) 거동을 살펴볼 수 있는 자료라고 할 수 있다. 내가 예로 든 위의 경우는 앞서 언급 했다시피 두가지 분석 결과가 서로 다를 가능성이 짙다. 분석하려는 대상이 앙상블평균거동에 훨씬 가깝고, 시간평균거동으로 분석하면 특정 앙상블 멤버의 예외성이 두드러지게 발현되기 때문이다. 하지만, 개

Statistical Ensemble이란 무엇인가?

Statistical Ensemble = 통계학적 앙상블 통계역학에서 우리가 살펴보고자 하는 어떤 시스템이 있을 때, 이 시스템을 동일한 조건으로 여러개 복사하여 거대한 집합으로 만들면 '앙상블(ensemble)'이라고 한다. 여기서 핵심은 '동일한 조건'이라는 표현인데, 이것에 대해 아주 섬세한 이해가 필요하다. 현실적으로 모든 실험/계산에는 정밀도의 상한선이 정해져 있다. 예를 들어, 우리가 동전 던지기 실험을 한다고 쳤을 때, 아무리 정밀하게 동일한 방식으로 동전을 던질수 있다 하더라도 모든 조건을 이전 시행과 동일하게 구성할 수는 없다. 즉, 거시적인 관점(macroscopic view)에서 조건을 동일하게 맞추어 준다고 해도 결국 미시적인 관점(microscopic view)에서는 차이가 생기기 마련이며, 앙상블이란 개념은 이러한 상황을 반영해주는 통계적 장치라고 볼 수 있다. (하지만, 앙상블이라는 개념이 단순히 실험에서 발생하는 정밀도나 분해능의 문제로 발현된 개념이라고 보면 곤란하다!) 예를 들어, 내가 연구하고 있는 분자동역학(molecular dynamics, MD) 분야에서는 앙상블을 정의할 때 시스템의 원자 개수, 시스템의 부피, 온도 등등 (거시적인 조건들)을 고정 하더라도 실제로 각각의 원자들이 점유하는 위치나 운동에너지 등은 끝도없이 다양해 질 수 있어, 이러한 잠재적 다양성이 통계역학적 앙상블을 이루게 되는 것이다. 그런데, 만약 이러한 조합들이 앞서 기술한대로 무한정 많다면, 결과적으로 우리가 어떤 물리적 특성값을 도출하기 위해 시스템이 놓여있는 phase space 상의 모든 가능성을 훑어야 하므로, 계산이 불가능할 것이다. 따라서, 이를 해결하기 위해 우리들은 목적에 맞게 앙상블에 제약조건을 부여하여 상황을 단순화 한다. 통계역학 분야에서 앙상블의 핵심은 해당 앙상블이 가진 조건이 되는데, 예를 들어 내가 연구하고 있는 MD에서 주로 사용하는 NVE, NVT, NPT 앙상블에서는 각각