NOTE 32-05-00 · 5단계 시뮬레이션 프로토콜
1. 일반 사항
A. 목적
- 이 노트는 Cu 표면 벤젠-에탄올 계를 다섯 단계로 준비하고 통계를 수집하는 절차를 다룬다.
- 이 노트는 각 단계가 필요한 이유와 입력 명령을 함께 다룬다.
주의 단계마다 필요한 이유가 있다. 하나라도 건너뛰면 계가 불안정해지기 쉽다.
참고 5단계의 모듈식 입력 구성과 실행 흐름은 예제 E4 — Cu 벤젠-에탄올 흡착 에 한데 모아 두었다 (데이터 파일이 없어 그대로는 실행되지 않는다는 점도 거기 적었다).
B. 적용 범위
inputs/의 다섯 stage 파일(01_soft.in~05_prod.in)에 적용한다. 아래 입력은 모두 이 파일에서 발췌했다.- 정전기 PPPM 과 MSM, 힘장 OPLS-AA 와 TraPPE-UA 에 적용한다. 프레임워크 전환은 3.F 에서 다룬다.
참고
UROPS run 의 실제 입력(master_wall_pppm.in)은 이 틀과 몇 군데 다르다.
1단계에 pair_style soft 와 fix adapt 를 썼고, 2단계는 steepest descent, 가열은 0.005 → 0.1 → 0.25 fs 로 timestep 을 바꿔 가며 했고,
평형화 1 ns 와 production 2 ns 를 0.5 fs 로 돌렸다.
C. 결과 요약
- 다섯 단계의 적분기, 온도 제어, 압력 제어, 목적은 다음과 같다.
| 단계 | 적분기 (Integrator) | 온도 제어 | 압력 제어 | 목적 |
|---|---|---|---|---|
| 1. 소프트 완화 | NVE/limit | Langevin 0.1 K | 없음 | 원자 중첩 해소 |
| 2. 에너지 최소화 | (정적) | 없음 | 없음 | 국소 최소점 도달 |
| 3. 단계적 가열 | NVT (Langevin) | 0.1 → 300 K | 없음 (정용량) | 운동 에너지 점진 주입 |
| 4. 평형화 | NVT | 300 K | 없음 | 열역학 평형 분포 확보 |
| 5. Production | NVT | 300 K | 없음 | 통계 수집 |
- 가열은 100, 200, 200, 200 ps 의 네 구간이다.
- 평형화는 1 ns + 6.5 ns, production 은 10 ns 이다. 동역학 단계의 timestep 은 모두 0.5 fs 이다.
2. 준비 정보
A. 필요한 개념
- 초기 데이터 파일에 벤젠/에탄올 분자가 무작위로 놓여 있어야 한다.
- 각 stage 는 앞 stage 의 restart 파일(
stageN.restart)이 있어야 시작할 수 있다.
B. 참조 자료
| 참조 | 제목 |
|---|---|
LAMMPS pair_soft |
https://docs.lammps.org/pair_soft.html |
LAMMPS fix nve/limit |
https://docs.lammps.org/fix_nve_limit.html |
LAMMPS minimize |
https://docs.lammps.org/minimize.html |
LAMMPS fix langevin |
https://docs.lammps.org/fix_langevin.html |
LAMMPS fix nvt (fix_nh) |
https://docs.lammps.org/fix_nh.html |
LAMMPS include |
https://docs.lammps.org/include.html |
| Allen & Tildesley (2017) | M. P. Allen, D. J. Tildesley, "Computer Simulation of Liquids", 2nd ed., Oxford University Press (2017). ISBN: 9780198803195. |
| Frenkel & Smit (2002) | D. Frenkel, B. Smit, "Understanding Molecular Simulation: From Algorithms to Applications", 2nd ed., Academic Press (2002). ISBN: 9780122673511. |
| PPPM vs MSM 글 | PPPM vs MSM 글 |
| 예제 E4 | 예제 E4 — Cu 벤젠-에탄올 흡착 |
C. 사용 프로그램
| 항목 | 용도 |
|---|---|
| LAMMPS 22 Jul 2025 | 다섯 stage 입력 실행 확인 |
D. 관련 파일
| 항목 | 용도 |
|---|---|
opls.data |
OPLS-AA 초기 데이터 파일 (공개) |
trappe.data |
TraPPE-UA 초기 데이터 파일 (공개돼 있지 않다) |
master_wall_pppm.in |
UROPS run 의 실제 입력 |
inputs/ |
공통·힘장·kspace 설정과 다섯 stage 파일 (3.F 의 구조) |
3. 절차
A. Stage 1: 소프트 완화 (Soft potential relaxation)
주의 초기 데이터 파일에서 일부 원자 쌍이 LJ σ 보다 가까이 붙어 있을 수 있다. 12-6 LJ는 $r \to 0$에서 발산하므로, 보통의 적분기로 그대로 적분하면 곧바로 수치 폭발(numerical explosion)이 일어난다.
주의
모든 stage 파일은 같은 순서로 시작한다. pair_coeff 는 박스가 있어야 하고 pair_style 이 먼저 정의돼 있어야 한다.
순서를 바꾸면 "Pair_coeff command before simulation box is defined" 같은 오류가 난다.
- 공통 머리를 common.in → read_data → kspace → ff 순서로 작성한다.
include common.in # units, atom_style, boundary, neighbor
read_data ../opls.data # stage 2 부터는 read_restart stageN.restart
include kspace_pppm.in # pair_style + kspace_style
include ff_opls_aa.in # pair_modify, *_style, *_coeff
- 공통 머리 다음에
01_soft.in본문을 작성한다.
# 01_soft.in (공통 머리 다음)
group cu type 12
group organic subtract all cu
fix wall_top organic wall/lj93 zhi EDGE 0.1 3.0 10.0 units box
fix freeze_cu cu setforce 0.0 0.0 0.0
timestep 0.5
fix relax organic nve/limit 0.05 # 한 스텝당 최대 변위 0.05 Å
fix tstat organic langevin 0.1 0.1 100.0 87287
thermo 100
thermo_style custom step temp pe ke etotal press vol
run 100000 # 50 ps
write_restart stage1.restart
참고 소프트 포텐셜은 LJ를 잠시 다음과 같은 부드러운 함수로 바꿔 놓는다.
$$ U_{\text{soft}}(r) = A\left[1 + \cos\left(\frac{\pi r}{r_c}\right)\right] \quad (r < r_c) $$
LAMMPS pair_soft 문서 참조.
$A$ 를 0에서 조금씩 키우면 겹친 원자가 부드럽게 밀려나 떨어진다.
fix nve/limit로 한 시간 스텝의 최대 변위를 제한하는 방법도 있다.
여기서는 fix nve/limit를 쓴다. 변위는 제한하되 실제 힘장을 그대로 쓰므로 다음 단계로 매끄럽게 넘어간다.
참고
fix nve/limit 0.05: 한 시간 스텝에 원자가 움직일 수 있는 거리를 0.05 Å 로 묶는다.
LJ σ(약 2.5–3.5 Å)의 1.5–2 % 정도다.
LAMMPS fix nve/limit 문서에서 자세히 다룬다.
Cu 는 어떤 적분 fix 에도 들어 있지 않으므로 이미 움직이지 않는다. setforce 0 은 출력되는 힘을 0 으로 만들어
최소화 단계에서 Cu 가 움직이지 않게 하는 역할이다.
- 입력을 실행한다. 0.5 fs 로 100000 스텝(50 ps)을 돌린다.
stage1.restart가 생성됐는지 확인한다.- thermo 출력의 퍼텐셜 에너지 감소를 확인한다.
opls.data에서 첫 스텝 퍼텐셜 에너지는 $9.2 \times 10^{14}$ kcal/mol 이다.- 100 스텝 뒤에는 $4.8 \times 10^{4}$ kcal/mol 로 떨어진다.
B. Stage 2: 에너지 최소화 (Energy minimization)
경고
벽 fix 의 에너지는 기본적으로 퍼텐셜 에너지에 들어가지 않는다. fix_modify ... energy yes 가 없으면
최소화기가 보는 에너지와 힘이 서로 맞지 않는다.
read_restart stage1.restart로 시작하는02_min.in을 작성한다.
# 02_min.in (read_restart stage1.restart 로 시작)
fix wall_top organic wall/lj93 zhi EDGE 0.1 3.0 10.0 units box
fix_modify wall_top energy yes # 최소화가 벽 에너지까지 보도록
fix freeze_cu cu setforce 0.0 0.0 0.0
min_style cg
minimize 1.0e-6 1.0e-6 10000 100000
write_restart stage2.restart
minimize 1.0e-6 1.0e-6 10000 100000의 수렴 기준을 확인한다 (LAMMPS minimize 문서).etol = 1.0e-6: 에너지 변화 허용치 (상대값)ftol = 1.0e-6: 힘의 norm 허용치 (kcal/mol/Å)maxiter = 10000: 최대 반복 횟수maxeval = 100000: 최대 힘/에너지 평가 횟수
- 초기 구조가 아주 나쁘면
min_style sd(steepest descent) 로 몇 백 스텝 먼저 돌린다. - 입력을 실행한다.
stage2.restart가 생성됐는지 확인한다.
참고
Stage 1에서 변위를 제한해 큰 힘을 없앴다면, Stage 2에서는
실제 힘장 위에서 conjugate gradient (CG) 나 steepest descent 로
국소 최소점까지 내려간다. 결과는 운동 에너지가 없는 0 K 정적 평형 구조다.
min_style cg (conjugate gradient) 가 대개 가장 효율적이다.
0 K 구조 자체를 통계 평균에 쓰지는 않는다. 다만 이어지는 가열 단계에서 운동 에너지를 안전하게 넣을 수 있는 "안정된 출발점"이 된다.
C. Stage 3: 단계적 가열 (Staged heating)
경고 0 K 정적 구조를 한 번에 300 K 로 올리면 다음 문제가 생긴다.
- 벤젠 π-π 적층 (stacking) 구조 붕괴: 초기 잠재 에너지 곡면의 깊은 우물에서 갑작스러운 운동 에너지가 국소 미세 구조를 무너뜨린다.
- 에탄올 수소 결합 네트워크 형성 지연: 수소 결합은 협동적으로 형성되는데, 고온에서는 이러한 네트워크가 잘 만들어지지 않는다.
- 표면 흡착층의 비물리적 탈리: 0 K 흡착 분자가 갑자기 큰 운동 에너지를 받으면 표면에서 떨어진다.
- 가열을 다음 네 부단계로 나눈다.
| 부단계 | 온도 범위 | 지속 시간 | 주요 변화 |
|---|---|---|---|
| 3.1 | 0.1 → 10 K | 100 ps | 벤젠 π-π stacking 안정화 |
| 3.2 | 10 → 100 K | 200 ps | 분자 진동/회전 모드 활성화 |
| 3.3 | 100 → 200 K | 200 ps | 에탄올 수소 결합 네트워크 재배열 |
| 3.4 | 200 → 300 K | 200 ps | 액체상 평형 분자 운동 도달 |
참고 오른쪽 열은 각 온도 구간에서 기대하는 변화이고, 이 계에서 직접 확인한 것은 아니다.
- 시간 스텝을 0.5 fs 로 정한다. 두 힘장을 맞추려고 가열 단계에서 이 값을 쓴다.
참고 - OPLS-AA: C-H 신축이 약 3000 cm⁻¹, O-H 신축이 약 3600 cm⁻¹ 이라 주기가 9–11 fs 다. 주기의 1/10–1/20 로 잡으면 시간 스텝은 0.5-1.0 fs 다. X-H 결합을 SHAKE 로 묶으면 2.0 fs 까지 늘릴 수 있다 (6장의 예시). - TraPPE-UA: 무거운 united-atom 사이트의 진동만 다루므로 1.0-2.0 fs 도 된다.
주의
fix ID 로 thermo 를 쓰지 않는다. fix nvt 는 <ID>_temp 라는 compute 를 만드는데, ID 가 thermo 면
LAMMPS 가 원래 가진 thermo_temp 와 이름이 겹쳐 "Reuse of compute ID 'thermo_temp'" 오류가 난다.
이 노트는 열욕 fix ID 로 tstat 을 쓴다.
read_restart stage2.restart로 시작하는03_heat.in을 작성한다. 그룹·벽·고정은 앞과 같다.
# 03_heat.in (read_restart stage2.restart 로 시작, 그룹·벽·고정은 앞과 같음)
velocity organic create 0.1 87287 dist gaussian mom yes rot yes sum no
timestep 0.5
fix integrator organic nve
fix tstat organic langevin 0.1 10.0 50.0 12345
run 200000 # 0.1 → 10 K, 100 ps
unfix tstat
fix tstat organic langevin 10.0 100.0 100.0 12346
run 400000 # 10 → 100 K, 200 ps
unfix tstat
fix tstat organic langevin 100.0 200.0 100.0 12347
run 400000 # 100 → 200 K, 200 ps
unfix tstat
fix tstat organic langevin 200.0 300.0 100.0 12348
run 400000 # 200 → 300 K, 200 ps
write_restart stage3.restart
fix langevin T_start T_stop damp seed의 인자를 확인한다.T_start, T_stop: 시작/종료 온도 (K). run 동안 선형으로 바뀐다.damp: 감쇠 시간 (real단위계에서는 fs). 작을수록 열욕과 강하게 묶인다. 50–100 fs 가 흔히 쓰는 값이다.seed: 난수 시드 (스테이지마다 다른 값을 쓴다)
참고 가열 단계에는 Langevin 열욕(thermostat)이 잘 맞는다. 평형화를 앞당기는 random force 항이 명시적으로 들어 있기 때문이다 (LAMMPS fix langevin 문서).
- 입력을 실행한다. 네 구간은 100, 200, 200, 200 ps 다.
stage3.restart가 생성됐는지 확인한다.
D. Stage 4: 평형화 (Equilibration)
read_restart stage3.restart로 시작하는04_eq.in을 작성한다.
# 04_eq.in (read_restart stage3.restart 로 시작)
timestep 0.5
fix tstat organic nvt temp 300.0 300.0 100.0
thermo 500
thermo_style custom step temp pe ke etotal press density
thermo_modify flush yes
run 2000000 # 4a) 1 ns
run 13000000 # 4b) 6.5 ns (필요하면 더 길게)
write_restart stage4.restart
fix nvt temp T_start T_stop damp의 인자를 확인한다 (LAMMPS fix nvt 문서).T_start, T_stop: 평형화 중에는 동일하게 설정 (목표 온도)damp: 시간 단위.real단위에서는 보통 100 fs.
참고 가열이 끝난 시점에 온도는 목표에 도달했어도, 분자 분포는 아직 평형(Boltzmann) 분포를 정확히 따르지 않을 수 있다. 그래서 평형화는 자기 상관 시간(autocorrelation time, $\tau_A$)의 10배 이상 돌려서 관심 물리량 $\langle A \rangle$ 을 믿고 잴 수 있게 만든다.
이 단계부터는 Langevin 대신 Nose-Hoover (fix nvt) 를 쓴다. deterministic dynamics를 유지하면서도 canonical 앙상블을 정확히 샘플링하기 때문이다.
경고
thermo 의 temp 는 기본적으로 모든 원자의 자유도로 나눈다. Cu 371개는 움직이지 않으므로
찍히는 온도가 유기층의 실제 온도보다 낮다(이 계에서는 약 0.85배).
- 유기층 온도를 보려면
compute t_org organic temp를 만든다. thermo_modify temp t_org로 thermo 온도를 바꾼다.
참고
fix nvt 는 자기 그룹(organic)의 온도로 조절하므로 열욕 자체는 맞게 동작한다.
- 입력을 실행한다. 1 ns 를 돌린 뒤 6.5 ns 를 이어 돌린다.
stage4.restart가 생성됐는지 확인한다.
경고
inputs/04_eq.in 의 7.5 ns 는 넉넉히 잡은 값이고, 측정으로 정한 값은 아니다.
UROPS run 은 평형화를 1 ns 만 했는데, production 2 ns 동안 첫 층 벤젠 몰분율이 앞 1 ns 0.83 에서 뒤 1 ns 0.57 로 움직였고
벌크 조성 프로파일도 평평해지지 않았다(PPPM vs MSM 글).
에너지가 아니라 조성 프로파일이 시간에 따라 변하지 않을 때까지 돌리는 것이 기준이다.
- 평형화가 충분한지 다음으로 확인한다.
- 총 에너지의 안정화: log 파일에서 etotal 의 평균이 변동 폭 이내에서 일정한지.
- 표면 흡착층의 정착: 표면 1차 흡착층 (Cu 표면 5 Å 이내) 의 평균 점유율이 일정한지.
- 동경 분포 함수의 수렴: 마지막 50% 와 그 이전 50% 의 g(r) 이 동일한지.
E. Stage 5: Production
경고
fix ave/chunk 는 원자별 값을 빈 안에서 원자 수로 나눈 평균을 낸다. 응력처럼 빈 안의 합이 필요한 양은
compute reduce/chunk ... sum 으로 합을 구해 fix ave/time ... mode vector 로 저장한다.
주의
fix ave/chunk 의 인자에는 bin/1d ... 같은 빈 정의가 아니라 compute chunk/atom 의 ID 가 들어간다.
read_restart stage4.restart로 시작하는05_prod.in을 작성한다.
# 05_prod.in (read_restart stage4.restart 로 시작)
group benzene type 1 2
group ethanol type 3:11 # opls.data: 에탄올은 type 3-11
timestep 0.5
fix tstat organic nvt temp 300.0 300.0 100.0
dump traj all custom 1000 dump.lammpstrj id mol type x y z vx vy vz
dump_modify traj sort id
# z 밀도 프로파일 (0.5 Å 빈)
compute zchunks all chunk/atom bin/1d z lower 0.5 units box
fix dens_b benzene ave/chunk 100 50 5000 zchunks density/mass file profile_benzene.dat
fix dens_e ethanol ave/chunk 100 50 5000 zchunks density/mass file profile_ethanol.dat
# RDF: Cu-C(벤젠), Cu-O(에탄올)
compute myrdf all rdf 200 12 1 12 5
fix rdf_save all ave/time 100 50 5000 c_myrdf[*] file rdf.dat mode vector
# 응력: 빈별 합을 저장하고, 후처리에서 -(합)/(빈 부피) 로 압력 성분을 얻는다
compute stress_per all stress/atom NULL pair bond angle dihedral improper kspace fix
compute stress_sum all reduce/chunk zchunks sum c_stress_per[1] c_stress_per[2] c_stress_per[3]
fix stress_save all ave/time 100 50 5000 c_stress_sum[*] file stress_profile.dat mode vector
# Cu-벤젠, Cu-에탄올 상호작용 에너지
compute e_cb cu group/group benzene
compute e_ce cu group/group ethanol
thermo 500
thermo_style custom step temp pe ke etotal press density c_e_cb c_e_ce
run 20000000 # 10 ns
write_restart stage5.restart
write_data final.data
- 분석 대상에 맞춰 production 시간을 정한다.
| 분석 대상 | production 시간 기준 |
|---|---|
| 표면 흡착 비율 (SEI) | 10 ns 이상 (UROPS run 은 2 ns 에서 블록 표준오차 ±0.03–0.05) |
| 흡착 에너지 평균 | 3-5 ns |
| 계면 장력 (Irving-Kirkwood) | 5 ns 이상 |
| 수소 결합 수명 분포 | 5 ns 이상 |
참고 OPLS-AA는 수소 결합 동역학이 느려서 production을 더 길게 잡아야 할 수 있다.
- 입력을 실행한다. 0.5 fs 로 20000000 스텝(10 ns)을 돌린다.
stage5.restart와final.data가 생성됐는지 확인한다.
참고 통계 평균에는 이 단계의 데이터만 쓴다. 평형화가 충분히 끝난 뒤, 자기 상관 시간보다 넉넉히 길게 돌린다.
F. 프레임워크 전환 (통합 입력 파일 구조)
inputs/디렉토리의 모듈 구성을 확인한다.
inputs/
├── common.in # 단위, atom_style 등 공통 설정
├── ff_opls_aa.in # OPLS-AA 파라미터 (pair_coeff 등)
├── ff_trappe_ua.in # TraPPE-UA 파라미터
├── kspace_pppm.in # PPPM 정전기 설정
├── kspace_msm.in # MSM 정전기 설정
├── 01_soft.in # Stage 1
├── 02_min.in # Stage 2
├── 03_heat.in # Stage 3
├── 04_eq.in # Stage 4
└── 05_prod.in # Stage 5
- 각 stage 파일의 include 라인 두 줄을 수정한다 (LAMMPS include 문서). kspace 파일이 pair_style 을 정하므로 먼저 온다.
# OPLS-AA + PPPM 사용 시 (kspace 파일이 pair_style 을 정하므로 먼저 온다)
include kspace_pppm.in
include ff_opls_aa.in
# TraPPE-UA + MSM 사용 시
include kspace_msm.in
include ff_trappe_ua.in
주의
trappe.data 는 공개돼 있지 않다.
- TraPPE-UA 로 바꿀 때는
read_data ../trappe.data로 바꾼다. - 그룹의 타입 번호를 함께 바꾼다. Cu = 6, 벤젠 = 1, 에탄올 = 2-5 이다.
참고 이렇게 나눠 두면 기존 단계 구조는 그대로 둔 채 프레임워크만 바꿔 가며 비교할 수 있다.
4. 시험 및 검사
A. 입력 실행 확인
- 다섯 stage 파일을 공개된
opls.data와 LAMMPS 22 Jul 2025 로 실행한다. - PPPM 과 MSM 각각
run길이만 줄여 끝까지 돌린다. - 판정: 두 경우 모두 오류 없이 지나가는 것을 확인했다.
5. 종료
A. 결과 정리
- 다섯 단계는 restart 파일로 이어진다.
stage1.restart부터stage5.restart까지 차례로 생성된다. - Stage 5 는 궤적, z 밀도 프로파일, RDF, 응력 프로파일, Cu-분자 상호작용 에너지와
final.data를 남긴다.
B. 후속 작업
- include 두 줄과 데이터 파일을 바꿔 나머지 프레임워크로 같은 프로토콜을 돌린다(3.F).