Lammps 기본 사용법 정리 5편 (MD 시뮬레이션) Compute & Fix 명령어 사용법

2023. 7. 23. 16:04게임만 하니 공부도 해야지

반응형

안녕하세요!

오래간만에 돌아왔습니다...

마지막으로 글 쓴게 벌써 7개월이 되었네요 ㅠㅠ 죄송합니다.

댓글 확인 못할 때도 있으니 궁금하신게 있으시면


tkdal2588@gachon.ac.kr


로 메일 부탁드립니다! 바로바로 확인할게요

 

오늘은 이전 편들에서 말씀드렸던 Fix와 Compute에 대해 알려드릴게요

 

사실 이 두 명령어는 종류도 굉장히 많고 목적에 따라 사용해야할 명령어가 많이 달라지기 때문에

이번 편에서는 많이 사용되는 명령어(지극히 제 주관...)의 사용법을 알려드리겠습니다

 

먼저 Compute 부터 알아볼게요!!

 

역시나 compute도 엄청나게 많습니다

혹시나 해서 말씀드리는데

Compute에 없다고 해서 불가능한것은 없습니다!!

직접 하면 됩니다 ㅎㅎ


compute 명령어는

주로 원자나 지역, 청크의 정보를 정리하거나 계산해주는 명령어로 이루어져 있습니다

 

먼저 제 코드에서 compute 명령어를 사용한 부분을 가져와 보았습니다!

Compute 명령어는

compute | 컴퓨트명령어id |계산할그룹명 | 사용할컴퓨트명령어 | 명령어에사용되는옵션들 |

이런 식으로 구성됩니다!

 

제 코드로 보면 일단 컴퓨트 명령어의 id는 Na_Ocoord이고 이것은 컴퓨트 명령어의 id입니다!

의미는 크게 없고 제가 이 컴퓨트의 이름을 결정하는겁니다!

 

계산할 그룹의 이름은 NA

저는 앞에서 Group 명령어를 사용해서 나트륨 원자를 모아서 NA라는 그룹을 만들었습니다.

 

그리고 coord/atom

이것은 컴퓨트 명령어중에 하나로 대상 그룹 주위에 원자가 몇개 있는지 계산하는명령어 입니다!

 

뒤에 cutoff ${na_cutoff} 1 은 coord/atom을 사용할때 추가하는 옵션들입니다

 

예로 든 코드를 설명하면

나트륨 원자 주변의 atom_type 1번의 원자가 ${na_cutoff} 거리 내에 몇개 있는지 계산한다고 보시면 됩니다.

  

컴퓨트 명령어는 이런 식으로 사용됩니다.

하나 더 보여드리면

이 명령어는 rdf로 Radial Distribution Fuction으로

중심 원자와 대상 원자 사이에 발견될 확률?이라고 보시면 됩니다

이걸 보면 물질의 구조나 결합 거리를 알 수 있습니다.

 

compute 명령어의 경우 제가 자세히 설명드리지 않고 간단하게 형식만 알려드리는 것 같아 죄송하네요 ㅠㅠ

컴퓨트의 경우 종류도 많고 사용 방법이 다 다르기 때문에 간단하게 넘어간 것 같습니다

 

사용되는 시스템과 본인이 출력하고 싶은 결과가 있을 경우 필요한 compute 명령어를 찾아서 사용하시면 됩니다!

저도 이런 명령어들을 다 외우는것이 아니고 필요할때마다 메뉴얼을 보고 찾아서 사용합니다

아직 사용하지 않은 명령어가 훨씬 많기 때문에 궁금한 게 있으시면 같이 의논해봐요!

저도 설명하면서 더 알아가는 것 같습니다


다음은 Fix 명령어에 대해 알아볼게요!

 

위의 컴퓨트 명령어는 말 그대로 계산만 합니다

출력은 따로 하지 않습니다 ㅠㅠ 왜 이렇게 만든걸까

 

우리가 출력시키려면 마찬가지로 Fix를 사용해야 합니다.

 

근데 Fix는 저번에 앙상블에 사용한다 하지 않았나요?? 

물론 앙상블에도 사용하고 시뮬레이션에 다양한 변화도 줄 수 있죠

또한 이 Fix에는 출력의 명령어들도 많습니다

 

예를 들면 ave(평균값), print(그냥 출력)

사실 이거 두개만 아시면 왠만한 데이터는 다 출력 가능합니다!

 

근데 이 출력이 참 ㅋㅋㅋㅋ 아마 처음 하시면 오류만 뜰것 같은데

예시 보여드릴게요!

이 Fix 명령어는 ave/time 으로 시간마다 평균을 내주는 명령어 입니다

시간 단위는 스텝으로 저는 총 2 step마다  1번  총  2step동안 평균을 1010.dat 파일에 mode vector 벡터 형식으로 출력해라 라는

명령어 입니다.

 

이 Fix 명령어는 compute 한 결과물을 출력하는데 사용했기 때문에 compute도 세트로 들어갔는데요.

저는 rdf를 사용했지만 물론 다른 명령어도 가능합니다

 

compute의 결과를 넣으려면 컴퓨트id 앞에 c_가 들어가야합니다!

또한 rdf는 데이터가 스칼라값(즉, 숫자 한개) 가 아닌 벡터값(데이터가 여러줄 여러개) 이므로 뒤에 [*]가 들어가야합니다

[*] 이 뜻은 만약에 compute rdf의 결과 데이터가

1  2  3  4  5  6

이렇게 데이터가 한번에 6개가 나온다면

첫번째 열만 출력하고 싶다면

[1]

두번째 열만이라면

[2]

제가 사용한 *표시는 모든 데이터를 표시한다는 의미입니다.

 

또한 variable을 출력할 수도 있습니다!

variable은 마치 파이썬이나 매트랩에 변수 지정과 같은 개념인데 이것도 제가 나중에 알려드릴게요!

 

예시로 보여드리면

가운데 파란줄은 안보셔도 되고 맨 윗줄부터 보면 $i는 제가 위에 미리 지정한 숫자 변수입니다. 1이라고 생각하고 보시면 됩니다

그렇다면 variable 변수이름 equal(=) c_1[4]

변수이름컴퓨트이름14번째 데이터 이다 가 됩니다 

 

다음 fix 1 all ave/time 1 1 1000 v_msd1 file MSD/asd1.dat

 

시간마다 평균을 내주는 명령어이지만 저는 1000스텝마다 한번 뽑으므로 평균으로 사용하지 않고 스텝마다 뽑아주도록 설정했습니다.

이렇게 하면 앞서 variable을 통해 설정한 c_1[4]의 데이터를 100스텝마다 뽑아서 MSD 폴더의 asd1.dat으로 저장되게 됩니다.

 

다음으로 print 명령어도 많이 사용하는데

print와 Fix print 두가지로 나뉩니다.

 

먼저 그냥 print 명령어는 명령어가 사용되는 시점에 한번 출력됩니다.

이는 스텝에 따라 변동되는 데이터를 출력하긴 어렵겠죠?

주로 초기 데이터나 마지막 데이터를 보여주기 위해 사용합니다

예시로 보여드리면 variable 명령어를 통해 초기 시스템의 z축 높이를 알아낸 후 가장 높은 z축의 높이를 출력하는데 사용했습니다.

 

다음은 Fix print 입니다.

그냥 print와 차이점으로는 Fix print는 지정한 스텝마다 변동되는 데이터를 출력합니다!

역시 예시가 있어야겠죠?

이 명령어는 variable로 설정된 변수들 p1 p2 p3 p4를 각각 100스텝마다 기록하고 이것을 파일로 저장하게 됩니다.

뒤에있는 screen no는 로그파일에 출력할지 말지입니다.

저는 파일로 따로 출력했기 때문에 로그에 표시되지 않게 설정했습니다.


오늘은 간단하게 compute 명령어와 Fix를 이용한 데이터의 출력을 알아보았는데요!

궁금하신게 있으시면 메일 부탁드리고 같이 배워요!

 그럼 다음 글로 찾아 뵙겠습니다!!

감사합니다.

반응형