1. Forcite 계산 시작하기 

 - 현재 모델은 최적화 된 것이 아님 

 - 따라서 최적화 시키기 위하여 forcite 모듈 이용 

 

 - forcite - calculation 선택 

 

 - 창 생성

 - Task는 DMol3와 거의 유사함 

 

 1) Setup 

 - energy : 싱글 포인트의 에너지 

 - dynamic : DMol은 전자를 움직이면서 온도나 압력을 넣을 수 있음. 그러나 전자가 이동하는 것 까지 다 계산을 해야 하기 때문에 계산 시간과 양이 매우 큼 

               : Forcite의 경우, 아톰마다 본딩해있는 결합 정보가 다 저장되어 있기 때문에, 계산 양이 많이 필요하지 않음

               : 따라서 보통 MM을 이용해서 계산해야 함 

 - Quanchi : 온도를 차츰 내려가면서 폴리머의 안정된 구조를 찾는 기능

 - Anneal : 온도를 높였다가 낮췄다가를 반복함으로써 안정된 구조를 찾는 기능

 

 - 우리가 현재 하는 것은 안정화(최적화)된 구조를 찾는 것이므로 Geometry Optimization을 선택

 - More 버튼을 눌러 상세 조건을 설정함

 

 - Algorithm의 경우, Smart 설정 : 1차 미분, 2차 미분에 대해서 안정된 구조를 찾아낼 수 있도록 혼합된 기능을 가지는 smart 옵션을 사용하는 것 

 - External pressure : 외부 압력을 지정할 수 있음. 필요할 경우에 설정 

 - Optimize cell을 하지 않을 것 (이전에 amophous cell을 계산할 때 처럼)

 - keep motion group : 분자나 폴리머의 움직임을 제한하고 싶을 때 사용 

 

 

 2) Energy Task

 - 중요한 것은 forcefield임 

 - forcefield의 종류는 매우 많은데, 그 중에서 COMPASS와 Universal를 비교 할 것 

 - COMPASS3를 체크하고 more버튼 클릭

 

 - 원소에 따라서 어떠한 원소인지 다 표시하고 있고, 정보가 저장되어 있음 

 - 하단의 체크를 해제하면, 지금 내 스케치에 어떤 원소가 있는지 정보가 나타남

 - COMPASS를 사용하기 전엔, 사용자가 자신의 스케치를 보고 원소를 하나하나 넣어야 했는데, COMPASS는 자동으로 정보가 나오니까 매우 편리함 

 - 그만큼 forcefield를 제대로 설정하지 않으면 정확한 계산 값을 얻지 못하고, 내 스케치의 원소와는 다른 원소를 지정하게 되면 계산에 실패하게 됨

 - 따라서 MM 같은 경우 제대로 된 forcefield 설정(제대로된 원소 정의)을 하는 것이 매우 중요 

 - universal의 경우, 정의되는 원소가 매우 대략적임 (자세하지 않음) 

 

 - 또한 MM은 Charge에 대해서도 별다른 설정을 해야 함 

 - Forcefield assigned : 최근 forcefield에 대해서는 아톰에 따라서 차지 값을 계산해놨음 

 - 반면에, 본인이 양자 계산을 통해 차지 값을 정확히 찾아낸 경우에는 자동적으로 계산 해 놓은 것이 아닌 use current를 설정하는 것이 나음 

 

 - bondinteraction : 본드 결합 정보를 계산

 - 아톰을 하나 기준으로 본드가 세개 이상인 것은 nonbond로 설정 

 - 튜토리얼에서 진행한 것 처럼 Group based로 설정 

 

 

 

2. 결과 해석하기 

 - 계산이 성공적으로 된 것을 알 수 있음

 

 1) output (cell.txt)

 - total enthalpy : valence energy(아톰이 갖고 있는 + cross terms + non-bond energy 이 세개의 에너지의 합으로 이 에너지가 결정됨

 - 따라서 양자 계산과의 에너지 용어에 대해서는 구분을 해야 함 

 - 이 에너지 값을 양자 계산에 넣어서 직접적인 비교를 할 수 없음 

 

 - 초기 에너지는 매우 불안정한 값

 

 - 나중 에너지는 최적화가 진행되어 매우 안정한 것을 알 수 있음 

 

 ① valence energy 

 - 폴리머 기준으로 예를 들었을 때, 본드가 세개인 것에 대한 아톰의 에너지 

 - 즉

  - 이 값만 계산한 에너지 

  - 이 세개 이외의 나머지 본드에 대해서는 non-bond energy 값임 

 

  ② non-bond energy

 

  ③ valence energy (cross term)

 

  - 최종적으로 계산이 잘 진행됐는지 확인하기 위해 

  - 정상적으로 계산이 됐음을 알 수 있음

 

 - 처음에 만든 구조가 임시적인 구조였기 때문에, 이 경고창이 뜨지 않도록 여러 번을 반복해줘야 함 

 - 반복작업을 하기 위해서 주의해야 할 점은 처음의 cell의 파일로 하면 안되고, 한 번 최적화가 된 cell 파일을 열어줘야 함 

 

 - 똑같은 조건으로 계산하기 위해서 cell calculation을 클릭하면 됨 

 - 우리가 안정된 구조를 찾는 이유? 불안정한 구조로 dynamics task를 하게 되면 계산이 fail이 될 확률이 높음 

 

 

3. 한 번 더 최적화 하기

 

 - 차트가 계속해서 내려가는데, 불안정한 부분이 보임

 - 따라서 최적화를 계속 할 필요가 있음 

 

 - 최적화를 더 할 필요가 있음을 output 파일을 통해서도 확인할 수 있음

 

 

 

4. Forcite의 모듈에서 Aneal task 진행하기 

 - Aneal을 선택

 - Aneal은 앞서 언급했듯이, 온도를 높였다 낮췄다를 반복하면서 (사인 그래프 형식) 안정화된 구조를 찾는 계산

 

 - 위와 같이 cycle, 온도 설정 

 

 - Energy 창을 다음과 같이 설정 

 - 항상 주의해야 할 점은 마지막에 최적화된 파일로 계산을 진행해야 한다는 것 

 

 - 계산이 완료 되었음

 

 - Aneal의 목적은 안정적인 구조를 찾는 것이므로 cell.xsd 파일을 열어서 안정적인 구조를 확인 

 

 

5. Dynamics 계산

 - cell.xsd 파일을 활성화 한 뒤에, calculation 활성화

 - Dynamcics task는 more 버튼을 보면 앙상블을 선택할 수 있음 

 - N : 아톰의 수가 고정되어 있음

 - V : 부피를 고정하고 싶을 때, E : 에너지, T : 온도 

 - P : 압력, H : 엔탈피 

 - 일반적으로 온도나 압력으로 수렴시킨 다음에, 최종적으로 NVE, 즉 에너지를 수렴시킴 

      " 이 온도, 이런 압력을 받았을 때, 이 구조는 이런 에너지를 가질 것이다."

 

 - dynamics는 오랜 시간이 걸리기 때문에 인내심이 필요 

 

 - 앙상블은 NVT로 먼저 온도에 따른 부피의 수렴값을 알아 볼 것임 

 - Initial velocities : dynamics 계산은 F = ma, 즉 운동 방정식에 기반을 하기 때문에 임의의 속도 값을 지정했을 때, 그 때의 a값이나 F값을 계산해서 그 다음 위치값을 예측함. 따라서 초기 속도를 랜덤하게 주겠다는 얘기 

 

 

 - 위 설정으로 함 

 - 컴퓨터 사양이 좋지 않기 때문에 5ps로 정함 (마력 단위, 일률이나 동력)

 - Frame output every : 몇 스텝마다 캡쳐본을 찍을거냐? (아웃풋을 만들어낼거냐)

 - 따라서 3개의 아웃풋 (초기, 그리고 2번)이 나올 것 

 

 - Thermal 같은 경우, 내가 온도를 어떤 method를 통해 300K에 수렴시킬 것인지?

 - 위키피디아에 자세히 나왔으니 그것을 참고 

 - 온도 조절 장치라고 보면 됨 

 

 - 계산이 성공적으로 완료됐음

 

 - .xtd 파일을 열어서 애니메이션 버튼이 있는지 확인

 

 

 

6. MSD 계산하기

 - 지금 폴리머와 메탄이 결합된 구조에서 메탄 분자만 찾아내야 함 

 - 초기에 스케치 했던 methane.xsd 파일 클릭 

 - 또 최종 파일인 cell.xtd 파일을 활성화 

 

 - 메탄 창을 누른 상태에서 edit sets 버튼 클릭

 

 - set이 정의가 안 되어있기 때문에 edit sets 아래에 있는 find patterns 클릭

 

 - 위와 같이 설정하고, 최종 파일이었던 cell.xtd 파일을 클릭하면 find 버튼이 활성화 됨 

 

 - 자동으로 메탄 분자를 찾아주었음 

 

 - 여기서 우클릭을 누르고 select substructure items 를 클릭 

 

 - 그럼 찾아준 분자를 자동으로 선택해주었음

 

 - 그리고 나서 new sets 클릭

 

 - 이름을 methane으로 정의

 

 - 추가된 것을 알 수 있음 

 

 

 - 애니메이션 버튼을 누르면 다음과 같이 움직임을 알 수 있음

 

 - Forcite 모듈의 analysis 클릭

 

 - 오른쪽 카테고리의 의미 : 분자 구조만 있어도 계산할 수 있음 / dynamics task를 진행해야 계산할 수 있음

 - sets는 아까 정의했던 methane을 찾기 

 

 - 그러나 사실 현재는 시간 설정이 매우 짧음 

 - 또 충분히 수렴을 시켜서, 정말 안정한 구조에서 이 분석을 하는게 맞음 

 - 그래야만이 정말 정확한 값을 얻을 수 있음

 

 - 이 기울기 그래프를 가지고 확산성 값을 알 수 있음

 - 이 MSD값

 - 이 수식을 자동으로 다 계산해서 얻은 기울기임 

 - 어떤 용도로 사용하냐에 따라 다르겠지만, MSD는 가장 많이 사용하는 모듈임 

 

 

1. dict의 다양한 생성 방법

  - 딕셔너리의 기본적인 생성 방법

 

 - 빈 딕셔너리를 전달하면서 type 함수 호출

 - 딕셔너리는 dict라는 클래스의 객체임 

 

 - dict 클래스의 객체를 직접 생성하는 형태로도 딕셔너리를 만들 수 있음

 - 생성 방법 중 하나일 뿐, 결과는 동일함

 

 - 키가 문자열인 경우의 딕셔너리를 생성하는 방법

 

 -  같은 값끼리 리스트에 묶어서 딕셔너리를 생성하는 방법 

 - 이 때는 zip이라는 함수를 사용해야 함 

 

 - 위의 방법을 다 정리해보았음

 - True/False를 확인하는 함수를 적용했을 때, 방법이 다를 뿐 결과가 다 같은 것을 알 수 있음

 

 - 원래 딕셔너리 함수는 저장 순서를 보장하지 않았음

 - 그러나 python 3.7버전 부터 저장 순서를 보장하고 있음

 - 즉 위의 예제를 보면, 저장된 값이 먼저 출력됨을 알 수 있음

 - d['d'] = 4 : 추가된 값은 맨 뒤에 저장됨

 

 

2. zip 함수

 

 - 예제 1 : 두 개의 리스트에 저장된 값들을 조합함 

 

 - 예제 2 : 두 개의 튜플에 저장된 값들을 조합함 

 

 - 예제 3 : 문자열과 튜플에 저장된 값들을 조합함 

 

 

 - 위의 예제를 통해서, zip이 반환하는 객체는 for 루프에 둘 수 있음

  → iterator 객체 

 

 - 또 zip은 인자로 전달된 리스트 또는 튜플 또는 문자열을 조합해서 다수의 튜플을 만들어 내는데, 같은 위치에 있는 값들끼리 조합해서 튜플을 만들어 냄 

 - 따라서 zip과 list 함수의 호출을 조합하면 zip에 의해 만들어진 튜플들을 리스트에 담을 수 있음 

 

 - 또 tuple 함수와 조합하면 tuple에 담을 수 있음

 

 - 또 dict 함수와 조합하면 딕셔너리에 담을 수 있음

 

 -  셋 이상의 값들을 조합해 내는 것도 가능함

 

 - 사실 zip함수가 없으면 위와 같은 함수의 조합을 못하는 것은 아님

 - 그냥 조합을 하나하나 명령어로 입력하면 됨

 - 그러나 zip을 사용하면 여러 줄에 걸쳐서 해야 할 일을 한 줄에 처리할 수 있음 

 

1. 개요 

 ① Quantum mechanics

   - 전자에 대한 상호작용을 기준으로 얘기함

   - 원자가 가지고 있는 전자의 양에 계산의 양도 비례하게 됨 ==> 양자계산의 숙명

   - 일반적으로 하나의 서버에서 Quantum mechanics에서 계산할 수 있는 원자의 개수는 약 200개 

   - 그 이상이 되면, 계산에 걸리는 시간이 너무 오래 걸림 

   - 고체 안에 있는 원소들의 수만큼 계산 시간도 늘어남 

   - 따라서 적은 규모에서만 볼 수 있는 한계점 존재

   - 그러나 전자 특성을 확인할 수 있는 장점 존재 

 

 ② Molecular mechanics

   - 큰 규모에서의 원자를 통해 물성학을 계산해야 할 때 

   - Forcite 모듈 : 분자 시스템, 폴리머에 대한 계산 

   - GULF 모듈 : 고체 영역에서 계산 엔진 

 

 

2. Quantum Mechanics와 Molecular Mechanics의 차이

 1) Quantum Mechanics

   - 전자가 이동을 함으로써 본딩이 끊어지고 붙는 현상에 대해서 표현 가능

 

 2) Molecular Mechanics

   - 분자를 표현할 때 원소는 공, 원소와 원소 사이의 본딩에 대해서는 스프링으로 표현하기 때문에 본딩이 끊어지고 붙는 현상을 표현하는데 어려움 

   - Forcite에서 polymer system에서 일정 거리 안에 들었을 때 본딩이 될 수 있도록 추가적인 기능이 존재하긴 하지만, 일반적으로 본딩의 현상을 볼 수 없음 

  - 반대로 GULF인 경우에는, 반도체나 도체 시스템에서 고체 계산을 하다 보니 전자 특성이 필요함 

       : 일부 시스템, 특정적으로 본딩이 끊어지거나 붙는 표현을 가능하게 해놨음 

 

 

3. 이번 튜토리얼

  - molecular mechanics를 이용하여 폴리머 안에서 온도와 압력을 조절했을 때 가스의 확산 정도나 속도를 확인하는 것 

  - 폴리머 안에서의 메탄의 움직임을 볼 것 

 

  - 메탄 분자 생성

 

 - 호모 폴리머 생성 

 

 - 어떠한 라이브러리와 어떠한 유닛을 사용할 것인지 설정할 수 있음

 - number of chane : 체인의 길이를 몇 개의 그룹으로 만들것인지?

 

 - 위와 같이 설정하였음

 

 - 폴리머 구조 생성 

 

 - 빈 곳에 폴리머와 메탄을 넣을 것이기 때문에 위의 모듈 사용해서 공간 생성하기 

 - Amophous cell : 폴리머나 메탄 분자를 랜덤하게 위치를 변경하면서 만드는 것 

 

 - 위 창이 생성되면 먼저 왼쪽에 폴더를 선택해야 함 

 - 어떤 폴더 안에서 (경로에서) 만들 지 먼저 선택하는 것 

 

* set up 

 1) Task

  - Constructure : 빈 공간 안에 내가 어떻게 메탄과 폴리머를 넣을 것인가?

  - packing : 나노튜브나 고체 표면 사이에 먼저 구축이 되어 있을 때, 채워 넣는 기능

  - Confined Layer : 양위상하에 층이 있는 경우 

 

 - more 버튼 클릭 시 오른쪽 창 활성화

 - 우리는 Qubic(큐비트, 양자학에서 최소 단위)으로 진행  

 

 2) Density 

  - 박스에 대한 크기 조정 가능

  - 폴리머의 질량과 메탄의 질량을 가지고 그 밀도 값을 통해 자동으로 박스의 부피가 정해짐 

  - 일단 실험값으로 진행 

  

 

 3) Composition

 - 이 안에 메탄과 폴리머를 가져올 것 

 - 이 메탄분자와 폴리머 분자 창을 활성화 시켜야 함 

 

 - 둘 다 선택

 

 - Loding 값 : 몇개를 넣어줄 것인지?

 - 튜토리얼대로 설정

 - 질량 비율을 알 수 있음 

 - 창 아래 하단에 

 - 이렇게 박스의 부피가 정해짐 

 

 - Amophous cell은 랜덤하게 위치를 변형시키기 때문에 고리 구조도 형성할 수 있을 것이고, 너무 가까워서 서로 척력이 일어날 수도 있음 

 

 - 따라서 option 버튼을 누르면 amphous cell option을 설정할 수 있음

 - 링과 링간의 스피어링, 볼 안에 구조가 투과되는 현상 그런 것들을 체크하여 그런게 있을 땐 제거하겠다, 너무 가까울 땐 반데발스를 증가시켜 서로 띄워놓게 하겠다 하는 것들을 설정 가능함 

 - 그러나 지금 튜토리얼에는 링이 없기 때문에 별 다른 설정 안 해도 됨

 - Optimize geometry 체크를 해제 하겠음 : 그 이유는 추후에 설명할 것

     ( 체크를 할 경우 시간이 오래 걸리게 됨)

 

 

* energy 

 - DMol3와는 다르게 Forcefield라는 부분으로 분자를 표현

 - 메탄의 C가 카본인지 옥시젠인지는 컴퓨터는 잘 모르기 때문에, forcefield를 통해 어떠한 결합을 하고 있고 어디에 위치하는지 정확하게 알려줌 

 - 위와 같이 설정하였음

 

* Job Control 

  - DMol3와 다른 점 : 싱글 코어로만 계산해야 함 

 - 따라서 이전에 Optimize geometry를 체크했다면, 그것 또한 싱글 코어로 계산했기 때문에 계산 시간이 엄청 오래 걸릴 것 

 

4. Amophous cell 계산 결과 확인하기  

 - 랜덤하게 배치했다보니 안정한 구조인지 알 수 없음

 - 따라서 Forcite 모듈을 이용해 최적화된 구조를 찾아야 함 

 

 1) output

 - Amophous cell의 계산 결과 창

 - output은 methane.txt를 통해 확인할 수 있음

 

 - Molecular mechanics 모듈 (Forcite, GULF 등)은 Dmol3와 달리 normarl로 표기가 됨 

     : 계산이 잘 됐다 = normal 

 

 2) methane.xtd

 

5. Forcite 하기 전 작업 

 - methane.xtd 파일을 copy함

 - 새로운 창 하나 생성 

 - 이 창의 이름을 "cell" 명명 

 - 새로 생성한 창에 복사한 것을 붙여 넣음 

 - 이렇게 하는 이유? 파일이 겹쳐져 있는 확장자 파일(.xtd)을 가지고 계산을 하다 보면 각각 결과에 대한 내용을 표기하지 않고, 생략된 내용이 많기 때문에 단일 파일에 넣어서 계산하는게 세밀한 정보를 얻을 수 있음

 

 

1. 결과 보기 

 - 성공적으로 계산이 된 것을 확인 

 - 탭도 생성됨

 - 경로 하나하나 폴더를 찾기 힘드니까 아무 파일이나 선택해서 우클릭하면 container folder 창이 있음

 

 - 그럼 바로 설정된 경로를 열 수 있음 

 

 

 

2. 결과 확인 

 - CASTEP 에서는 ALAs.castep 파일이 output 파일임

 

 - 별 이상 없이 맨 아래에서 계산이 잘 된 것을 확인할 수 있음

 

 - 찾기를 통해 아까와 똑같이 진행

 

 - 총 계산이 성공적으로 마무리 된 것을 알 수 있음

 

- 최종 에너지도 확인할 수 있음

 

 

1) AlAs.param

 - 선택 했던 계산 옵션을 텍스트로 보여주는 것 

 

 

2) AlAs.xsd

 - output으로 생성된 구조 

 - 하늘색 구 구조는 추후에 확인할 수 있음 

 

- 구 구조를 끄고 싶으면

 - 다음과 같이 설정하면 됨 

 

- 체크를 해제해 주면 됨

 

 

3) AlAs.xtd & AlAs Energies.xcd

 - 에너지 스텝에 따른 구조 변화를 클릭해서 확인할 수 있음 

 

4) BandStr.param & DOS.param 

 - param이라는 것은 모두 input 파일을 얘기하는 것 

 - 계산하기 전 설정했던 것들을 텍스트로 보여주는 값

 

 

 

3. 결과 분석

 - output 파일을 활성화 한 뒤에, castep analysis 클릭

 - 일단 band structure만 보자면, 

 

 - 밴드 갭과 지점을 확인할 수 있음 

 - methal의 경우 밴드 갭이 없기 때문에 숫자가 뜨지 않을 것 

 

 - show DOS를 체크하면 DOS의 결과도 같이 볼 수 있음

 

- 지금 Band 그래프에서 에너지 부분이 0으로 된 것은 전자가 가득 차 있는 최상단을 0으로 지정한 것임

 

 

- 아까 계산하기 전 Density of states 창을 활성화 시켰으므로, 이번에는 Density of states의 결과를 plot할 것임 

 - 구조 파일을 활성화시켰음

 -

 - partial 부분 체크 

 

 - d랑 f 오비탈에는 전자가 존재하지 않음을 알 수 있음 

 

 

- Band Structure에서 그냥 output 파일을 활성화 시켜놓고 할 때는 partial 창이 활성화 되지 않았는데, 구조 스케치를 활성화시키면 partial을 볼 수 있음

 

 

- 계산하기 전, parameter의 변화를 확인했었는데, 실제로 parameter에 변화가 생겼는지 확인

 - 원래 Conventional cell이었기 때문에 다시 변경해줌 

 - 미세하지만 약간의 변화가 있는 것을 확인할 수 있음

 - 조금 더 안정한 구조를 가지도록 최적화 된 것을 알 수 있음

 

 

- 만약 이 구조에 들어있는 아톰의 개수가 몇개인지 확인하고 싶을 때, 

- primitive cell로 설정하면 

 

 - 아톰 수가 줄어든 것을 알 수 있음 

 

 

- 모든 옵션 창에는 help라는 버튼이 활성화되어 있음

- 그곳에 모든 사용법과 설명, 이론적인 부분까지도 확인할 수 있음

 

- 양자 계산의 경우, 0K라는 조건에서 실행하는 것이기 때문에, 온도나 압력과 같은 정보는 포함되어 있지 않음 

- 온도나 압력 조건은 molecular mechanics에서 설정가능 

 

- 특정 아톰별로 보고 싶다면, 특정 아톰을 선택하고 castep analysis를 누르고, 궁금한 기능을 plot하면 됨 

 

 - 위 파일 불러오기 

 

 - 다음과 같은 구조 열림 

 

- CASTEP 툴 열기 

- 또는 위 아이콘 클릭 

- CASTEP도 양자 계산 tool이기 때문에 DMol3와 거의 유사함 

- 단지 하나 다른 점이 있다면 properties라는 기능이 있음

- Properties : 앞에서 이미 구조 계산하기 위한 설정이나 최적화를 다 했을 때, 그 구조를 기반으로 단순히 properties만 계산할 때 사용 

 

1) Setup

 - 위와 같이 설정하였음

 

 

2) Electronic 

 - setup에서 medium으로 설정하였기에 모두 medium을 띰 

 - Energy cutoff : 일정 구간까지 cutoff를 설정해서 그 구간까지 계산하겠음, 고체에서는 낮을 수록 시스템에서 표현하기 어렵기 때문에, fine이나 ultrafine이상으로 설정해야 함. 지금은 빠른 계산을 위해 medium으로!

 - Pseudoportentials : OTFG - 핵에 대한 부분을 더 고려할 것인가? (ultrasoft - 빠른 계산 가능)

 

 - more 버튼 클릭

 - 문헌 정보를 보고 자유롭게 설정하면 됨 

 - 보통 FFT는 디폴트 값으로 사용 

 

 

- Obital accupancy에서 more 버튼 클릭

- smearing : 에너지를 어느 레벨까지 줄 것인지, 이것을 사용하면 계산이 빨리 끝나지만 정확한 값을 얻기 힘듦

 

 - 한 곳에 점을 찍어서 그 지점에서의 오비탈의 결과를 볼 수 있음 

 

 

3) Properties 

 - Band structure, Density of state, 참고로 CASTEP에서는 Population analysis 가 자동으로 체크되어 있음

 

4) Job Control 

 - parallel 2개로 설정

 

 

- 나중에 cell parameter가 바뀌는지 바뀌지 않는지 미리 확인

 - 빈 화면 우클릭하여 lactice parameters 확인 

 - 하나를 변경하면 자동으로 변경됨 

 

 - 아톰 수가 너무 많으면 계산이 느리므로 primitive cell 설정해야 함 

 - 보통 run(실행하기)을 누르면 경고 창으로 primitive cell을 생성할거냐 물어보는데, 실행하기 전에 설정하는 방법도 있음

 - 아톰 수가 훨씬 줄어든 것을 알 수 있음

 - 이대로 계산을 실행해 보겠음 

 

 

1. 결과 확인

 - 계산이 완료되면 다음과 같은 창이 뜬 것을 알 수 있음

 

 

1) phenol - Calculation 창

- 파란색 글씨를 더블 클릭하면 다음과 같은 창이 뜸

- 이 창에선 아까 계산하기 전 설정했던 것들을 다시 볼 수 있음 

- 다음 step의 계산을 한다고 했을 때, 설정을 동일하게 맞춰야 하므로 이전에 설정했던 옵션 창을 보면 좀 더 수월함

 

 

2) phenol.input 창

 - 이전에 설정했던 계산 옵션들을 텍스트로 보여주는 창 

 

 

3) phenol.xsd

 - 구조가 매우 간단하기 때문에 최적화를 계산해서 얻은 결과와 우리가 처음 시도했던 스케치와 크게 다르지 않음

 

- 위의 페놀 구조가 내가 스케치한 구조임 

- 별 반 다른 것이 없음

 

 

4) Status.txt 

 - 작업이 진행될 때, 현재 어느 step을 계산하고 있는지 현황을 업데이트하면서 보여주는 파일

 

 

5) phenol Convergence

 

 - 아까 계산하기 전 기준을 설정하였음 

 - 셋 중 어느 하나라도 기준보다 떨어지게 되면, 계산이 끝나게 됨 

 - 특정 하나만 보고 싶으면 아래 체크버튼을 풀면 됨 

 - 점점 step이 진행 될 수록 수렴이 잘 돼서 끝난 것을 알 수 있음

 

 

6) phenol Energies & phenol.xtd

 

 

 - xtd : 처음 보는 확장자명

 - 두 창을 함께 띄워 확인하는 경우 

 

 - 이 처럼 각각의 꼭짓점에서 phenol 구조가 어떻게 변하는지 확인할 수 있음

 - 따라서 아이콘 모양이 다음과 같이 사진이 여러개 중첩된 모양임

 

 - 예를들어 에너지 최적화를 계산하는데 실패했다면, 실패하기 전 가낭 낮은 에너지 값의 페놀 구조를 클릭하여 확인

 - 그리고 그 구조를 다시 인풋 구조로 설정하고, 계산 설정을 올바르게 해서 다시 계산할 수 있음

 

 

7) phenol.outmol

 

 - 가장 중요한 파일

 - 사실은 계산이 끝나자 마자 가장 먼저 확인해야 하는 파일

 - 실질적인 output 파일임

 - 반드시 스크롤을 맨 아래로 내린 후, 성공적으로 끝났다는 것을 확인해야 함 

 

 - 그리고 나서 계산 결과를 키워드를 통해 찾아야 함 

 - 키워드 찾는 방법 , window 찾기 기능 이용 ( 단축키 ctrl + F)

 

 

 - 위처럼 입력

 - geometry가 8번의 step만에 성공적으로 계산이 된 것을 알 수 있음 

 - 약간 위로 올리면 총 에너지가 얼마인지도 계산 가능함

 

2. 결과 해석 

 

 - 구조 파일 열기 

 

 - analysis 클릭

 

 - 일단 오비탈 먼저 보기 

 - 아래에 많은 결과들이 쭉 나열돼있음

 - filter를 available로 설정

 

 - available : 실제로 import해서 볼 수 있는 결과

 - 이 중에서 HOMO를 먼저 import할 것 

 

 

 - phenol 구조의 오비탈 확인 가능 

 - 투명도를 조정하고 싶다면 display style 클릭

 - 아까 없던 isourface탭 생성

 

 

- 씌여진 오비탈을 지우고 싶다면 그냥 오비탈을 눌러서 delete를 누르면 됨

- 만약에 지운 오비탈을 다시 복구하고 싶다면, 

 

 - volume visulaization 툴 클릭 

 - 또는 다음과 같은 아이콘 클릭

 

 - 체크와 체크 해제를 통해 하면 됨 

 

 

 - LOMO의 모습 

 

 

 

 - 구름 형태 완성 

 

 - potential 값을 추가하여 알록 달록한 형태를 볼 예정

 - import를 하면 아무런 변화가 없을 것

 - 따라서 우리가 display style에서 설정을 해줘야 함 

 

 - 마찬가지로 투명도 조절 가능

 

 

 - 우리가 추가한 potential 기능 선택

 

 

 - 색을 통해 어느 쪽이 positive인지, 어느 쪽이 negative인지 알 수 있음

 - 색이 마음에 들지 않으면, 빈 화면 우클릭 후 

 - color maps 선택한 뒤에 색 조합을 내가 원하는대로 바꿀 수 있음

 

- 각각 아톰이 가지고 있는 차지의 숫자를 화면에 함께 입혀줄 수 있음

- 그 전에 미리 알아야 할 사실 : 계산을 하고 나면, 양자 계산에서 각각 아톰의 차지값을 계산하지만, 그것이 output에서 입혀지지 않은 상태임 

- 직접 해보면서 자세히 살펴보면, 

 

- 빈 화면에서 label 선택

 - Charge를 선택한 뒤에 apply를 적용하면 다 0으로 된 것을 알 수 있음 

 - 이것이 위에 말한 알아야 할 사실임

 - 이미 output에 다 계산이 되어있는 값이지만 업데이트돼서 적용이 되지 않은 것 

 

 - DMol3 Analysis 창 열기 

 

 - Population analysis 설정 후 assign 설정 

 

 - 차지 값이 적용된 것을 알 수 있음

 - Lable 창에서 폰트라든가 색이라든가 개인의 기호에 맞게 변경 가능 

 

 

1. 네임드 튜플의 이해와 작성 

 

 - 튜플의 패킹과 언패킹에서 처음 시작한 예

 - tri_one = (12, 15) : 삼각형 밑변 12와 높이 15를 묶어 놓은 것 

 - 그러나 이것은, 책에 12가 밑변이고 15가 높이라고 말하지 않았다면 그 사실을 몰랐을 것

 - 따라서, 왼쪽에 있는 값이 밑변이고 오른쪽에 있는 값이 높이라는 정보를 튜플에 새기기 위해 주석으로 표시하고자 함  

      ==> 네임드 튜플(named tuple)

 

 - from collections import namedtuple : collections 모듈의 namedtuple 호출 위해서 명령어 작성

 - Tri : 네임드 튜플 클래스 만듦 

 - t : 네임드 튜플 객체 생성

 - print : 일반 튜플과 동일한 방법으로 접근 가능함 

 

Tri = namedtuple('Triangle', ['bottom', 'height'])
'Triangle' Triangle이라는 이름을 붙여서 클래스 생성
'bottom'  첫 번째 위치의(값의) 이름은 bottom으로 정하겠음
'height' 두 번째 위치의(값의) 이름은 height으로 정하겠음

 - t = Tri(3, 7) : 첫 번째 값은 3, 두 번째 값은 7인 네임드 튜플 객체 생성

 - 이렇게 하면 Triangle 클래스의 객체가 생성되어 변수 t에 저장됨 

 - 그러나, 위와 같이 함수가 호출되면 변수 Tri에는 Triangle 클래스에 정보가 담기게 되는데, 이 변수를 이용해서 네임드 튜플 객체(Triangle 클래스의 객체를) 생성해야 함 

 - 즉, 클래스의 이름은 Triangle은 객체 생성에 사용되지 않음 

 - 그렇다면 굳이 Triangle이라는 이름을 굳이 생성한 이유는? 오류가 발생했을 때 오류의 원인을 찾는데 도움이 됨 

 - 이것은 추후에 설명 

 

 - 어쨌든 이렇게 해서 생성한 네임드 튜플 객체는 다음과 같이 사용할 수 있음

  - 일반 튜플과 동일하게 인덱스 값 기반 접근 

 

  - 네임드 튜플의 장점으로, 다음과 같이 이름으로도 접근이 가능함 

 

 - 물론 네임드 튜플도 튜플과 마찬가지로 저장된 값을 수정하지 못함 

 - 수정하려고 하면 다음과 같이 오류가 발생함

 - 위의 오류 메세지에서 Triangle이라는 이름이 보임 

 - 이렇듯 네임드 튜플에서 오류가 발생하면 클래스의 이름이 출력되어 오류가 발생한 원인 또는 위치를 찾는데 도움을 줌 

 - 이것이 네임드 튜플을 클래스에 이름을 붙이는 이유 

 

 - 클래스의 이름과 변수의 이름이 같아도 함 

 - 이것이 필자가 권장하는 방법

Tri = namedtuple('Tri', ['bottom', 'height'])

 

 - 또한 네임드 튜플의 이름을 지정할 때 리스트에 담아서 전달하지 않고 다음과 같이 하나의 문자열에 담아서 전달해도 됨

Tri = namedtuple('Tri', 'bottom height')

 

 

2. 네임드 튜플 언패킹 

 - 튜플과 마찬가지로 네임드 튜플을 대상으로도 언패킹 할 수 있음 

 

 - 일반 튜플과 마찬가지로 함수에 값을 전달할 때에도 *을 붙여서 언패킹을 할 수 있음 

 

1. 계산 진행하기 위해 가장 간단한 페놀 분자 꺼내기

 - 새로 하나 만들기

 

 - 6개의 분자 구조를 가진 링 생성

 - alt + click 

 

- 산소 하나를 붙였음 (OH 구조)

 - 그 뒤에 수소를 붙였음

 

 - 그리고 나서 모든 부위에 수소 붙임

 - 정렬도 해야 함 

 

 

2. 계산 모둘 이용하기 

 - 바로 왼쪽 아이콘을 눌러도 되지만, 위와 같은 경로로도 계산 모듈을 꺼낼 수 있음

 

1) Setup

 - Set up, Electronic Properties, Job Control 탭으로 나뉘어져 있음

 - Set up 탭에서는 계산 조건들을 설정해 줄 수 있음 

      : Quality - 촘촘하게, 러프하게 

      : Functional - 문헌에 어떤 방법을 사용했는지 다 나와 있어서, 문헌을 참고하면 됨 

      : Spin - 스핀에 대해서 구분을 할건지 아닌지 (업 다운을 구분해야 하기 때문에 계산할 때 시간이 더 걸릴 수 있음)

      : Metal - 비어있는 오비탈에서도 전자들이 자유롭게 왔다갔다 할 수 있도록 해주는 기능, 고체 구조에서 많이 사용

      : Use symetry - 대칭 구조의 경우, 대칭에 따라 구조가 움직여서 이 옵션을 사용하면 계산이 빠르게 진행되지만 정확한 값을 얻기 힘듦 

      

 - Energy : 구조를 움직이지 않으면서, 이 구조가 어떤 에너지를 갖고 있는지 계산

 - Geometry Optimization : 계산에 가장 기본이 되는 출발점, 구조를 조금씩 움직여가면서 가장 낮은 에너지를 찾음 (구조 최적화)

 - Dynamics : 시간에 따른 분자의 움직임 관찰

 - TS 관련 Task : 반응물과 생성물 사이의 에너지 배위의 꼭짓점에 해당하는 부분을 계산해서 반응의 mechanism을 확인 

 - Elastic Constants(탄성 계수) : 크리스탈 구조가 있을 때, 성질을 확인하는 것 

 - Reaction Kinetics : activation energy를 이용해 반응 속도 상수를 계산할 수 있음

 - Electron Transport : 전자 전달 특성을 계산할 때 사용

 

 - 이번 튜토리얼 계산에서는 위와 같이 설정하였음

 - more 버튼을 누르면 

 

 - 상세 정보를 알 수 있음

 - quality를 어떻게 설정하냐에 따라 (medium / fine / coarse) 값이 일괄적으로 변경됨

 - 이 quality 값의 의미 : 계산하면서 step이 계속 진행되는데, 그 때 전 step과 다음 step의 에너지 차이임

 - Max. Iterations : 반복 횟수, 수렴하는데 꽤 걸릴 것 같다고 생각하면 200정도로 설정

                       : 계산을 반복하는데 수렴이 안되면 계산이 fail하기 때문 

 

 - 위와 같이 설정하였음

 - 값을 정밀하게 계산하려면 fine으로 설정해야 함 

 

 

2) Electronics 

 - 전자의 구조 설정 

 - Setup창에서 설정한 quality 대로 설정됨 (medium인 것을 확인할 수 있음)

 

 - 모든 핵과 base 전자를 모두 고려할 것인지, 전자만을 고려하여 계산할 것인지 하는 것 

 

 - 아래로 내려갈수록 오비탈을 크게 표현하는 것 

 - 무거운 아톰을 가진 시스템이라면 오비탈을 크게 설정해야 함 

 - 보통 DND나 DNP를 많이 사용

 

 - Basis file과 같은 경우, 3.5와 4.4가 있는데 4.4가 최신 파일이라 4.4로 설정해야 함 

 - use solvation model : 용매를 추가하기 위해선 용매를 사실 다 그려야 하는데, 저 기능을 선택하면 직접 그리지 않아도 용매를 추가한 것 처럼 반응을 줘서 계산하는 것 

 

 - 전자 설정의 상세 창을 확인할 수 있음 

 - 원하는 tolerance가 있을 때, 숫자를 조정하면 됨 

 - SCF cycle도 50 이상에서 수렴하게 되면 fail이 뜨게 됨, 따라서 이 숫자도 조정해주는 것이 좋음 

 - 아래 부터는 거의 수정하지 않고, 디폴트 값으로 사용함 

 - 그런데 SCF 수렴에 문제가 있을 때 수정함

 - Obital occupancy : setup창의 metal 기능의 상세 정보임 

 

3) Properties 

 - 어떤 물성을 볼 수 있는지 선택할 수 있음

 

 - 위 튜토리얼에선 일단 위와 같이 설정하였음

 

 

4) Job Control 

 - Gateway location : 작업을 어떤 게이트로 보낼지, 보통은 연구실이므로 my computer로 되어있음 

 - 본인이 가지고 있는 CPU에서 하나만 플러스로 parallel을 설정할 수 있음

 - run 버튼 누름 

 

 

3. 계산

 - 계산이 성공적으로 된 것을 알 수 있음

 

 - 굉장히 많은 탭이 뜬 것을 알 수 있음

 - 따라서 사양이 낮으면 렉이 걸릴 수 있기 때문에, 저장을 먼저 해야 함 

 

1. 패킹과 언패킹 

 - 튜플 패킹(tuple packing)

      : 튜플로 값을 묶는 행위 

 - 튜플 언패킹(tuple unpacking)

      : 튜플로 묶여 있는 값들을 풀어내는 행위 

 

튜플 패킹 하나 이상의 값을 튜플로 묶는 행위
튜플 언패킹 튜플에 묶여 있는 값들을 풀어내는 행위 

 

 - 예를 들어, 삼각형의 정보(밑변과 높이 정보) 튜플로 묶은 것이 튜플 패킹

 

- 또한, 우리에게 익숙한 튜플 패킹 방법 

 

- 튜플 언패킹 예제 

- 주의할 점 : 튜플에 저장된 값의 수와 이를 저장할 변수의 수가 일치해야 함 

 

- 언패킹 과정에서 둘 이상의 값을 리스트로 묶어서 하나의 변수에 저장하는 것도 가능함

- 둘 이상의 값을 리스트를 묶을 때 *를 사용함 

- 튜플이 아닌 리스트로 묶었음 

 

- 뒤쪽 값들만 묶을 수 있는 것이 아니라 중간의 값, 처음 값도 묶을 수 있음 

  

 

-  물론 언패킹은 튜플 말고 리스트를 대상으로 동일하게 작용함 

 

2. 함수 호출 및 반환 과정에서의 패킹과 언패킹

 - 패킹과 언패킹은 함수의 호출과 반환 과정에서도 일어남

 

- return문 구상

- 튜플의 패킹에서 소괄호는 생략이 가능함 

- 즉, 패킹되어 반환됨 

 

- 따라서 함수가 반환하는 값을 다음과 같이 저장할 수 있음

 

 

 - show_nums(n1, n2, *other) : 세 번째 이후 값들은 튜플로 묶여 other에 전달됨 

 - 매개 변수 앞에 *가 오는 것 : 나머지 값들은 튜플로 묶여서 이 변수에 저장하겠음 

 

 

 - 따라서 다음과 같이 전달되는 값의 수에 상관없이 모든 정수의 합을 계산해서 반환하는 함수도 만들 수 있음 

 - sum(*nums) : 전달되는 모든 값들을 하나의 튜플로 묶어서 nums에 저장 

 

 - 그러나 위처럼 함수를 호출할 때 *를 사용하면 튜플 언패킹 기능이 된다.

 - 따라서 *는 사용되는 위치에 따라서 패킹을 의미하기도 하고, 언패킹을 의미하기도 함 

 

 - show_man(*p) : 리스트를 전달하는데 *을 붙인 상황 

 - 위와 같이 언패킹은 리스트를 대상으로 작동함

 

- 튜플 안에 또 다른 튜플이 존재하는 경우의 언패킹 방법

 - t = (1, 2, (3, 4)) : 튜플 안에 튜플이 있는 경우 

 - a, b, (c, d) = t : 튜플 안의 값의 구조와 동일한 형태로 변수를 선언 

 - 즉 1, 2, (3, 4) 처럼 네 개의 변수에 나눠서 담을 땐, a, b, (c, d) 와 같이 동일한 형태로 변수를 선언해서 언패킹 해야함

 

p = 'Hong', (32m, 178), '010-1234-56xx', 'Korea'

 - 이름과 키 정보만 필요하다고 가정했을 때, 연패키을 진행한 다음에 이름과 키 정보만 사용하면 됨 

 - 튜플에 소괄호를 생략함 

 - 그런데 위처럼 키 정보를 얻기 위해 불필요한 정보까지 변수에 담는 것은 번거로움 

 

 - 위처럼 이름과 키 정보만 뽑아내는 것이 더 편리함 

 - 불필요한 정보가 있는 위치에 _을 대신 넣었음 : 여기서 사용된 _도 변수임 

 - 다만, 불필요한 정보라는 것을 의미하기 위해서 변수의 이름으로 잘 쓰지 않는 _를 그 위치에 넣어 둔 것임 

 - 이것도 일종의 관례임!

 

3. for 루프에서의 언패킹 

 - for루프에서 제일 처음 변수 n과 h에 저장되는 값 

for n, h in ps ('Lee', 172)에서 'Lee'
for n, h in ps ('Lee', 172에서 172

 

 - 두 번째 튜플의 값이 각각 n과 h에 저장되어 for 루프의 두 번째 반복이 진행됨 

for n, h in ps ('Jung', 182)에서 'Jung'
for n, h in ps ('Jung', 182)에서 182

 

 - 이러한 형태의 언패킹은 리스트를 대상으로도 동일하게 작용함 

 

1. 하나의 문장으로 제너레이터를 구성하는 방법

 - 제너레이터 객체를 생성하는 방법을 언급하였음

  ① 제너레이터 함수(function) : 제너레이터를 만들기 위한 정의 

  ② 제너레이터 표현식(expression) : 제너레이터를 만들기 위한 식 

 

 1) 제너레이터 표현식 

   - 제너레이터 표현식은 제너레이터 함수와 마찬가지로 제너레이터 객체를 생성하는 방법임 

   - 제너레이터 표현식은 문법 구성이 리스트 컴프리헨션과 거의 똑같음 

- 리스트 컴프리헨션을 기반으로 만든 예제

 - def show_all(s) : iterable 객체를 전달하면서 이 함수 호출 

 - st : 구구단 2단을 전부 저장한 리스트 생성

 - show_all(st) : 위에서 정의한 show_all 함수 호출 

 

 

- 제너레이터 함수 기반으로 작성한 예제 

 - def time2() : 제너레이터 함수 정의

 - g = times2() : 제너레이터 객체의 생성

 - show_all : 위에서 정의한 show_all 함수 호출

 

 - 그러나 제너레이터 함수를 사용한 경우, 별도로 제너레이터 함수를 만들어주어야 함 

 - 제너레이터 함수의 장점과 단점은 명확 

장점 메모리를 효율적으로 사용할 수 있음
단점 함수를 별도로 정의해야 함 

 

 2) 제너레이터 표현식

  - 그러나 제너레이터 표현식을 사용하면, 위와 같은 단점을 해결할 수 있음

 

리스트 컴프리헨션 st = [ 2 * i for i in range(1, 10))]
제너레이터 표현식 g = ( 2 * i for i in range(1, 10))

 

- 제너레이터 객체이기 때문에 next 함수를 호출하면 값을 하나씩 출력함

 

 - 리스트 컴프리헨션 : 미리 만들어놓고 하나씩 던지는 것 

 - 제너레이터 표현식 : next 함수가 호출되어야 비로소 값을 만들어서 반환함 

                            : 제너레이터 표현식의 최대 장점인 'lazy evaluation'

 

 

2. 제너레이터 표현식을 직접 전달하기

  - 제너레이터 함수의 가장 큰 장점 : 표현의 간결함 

  - 그러나 제너레이터 함수를 복잡하게 만들면 그 장점을 잃어버려 쓸 필요가 없어짐

  - 결론적으로, 제너레이터 함수도 제너레이터 표현식도 모두 상황별로 더 어울리는 경우가 있으니 둘 다 만들 줄 알아야 함 

+ Recent posts