인공신경망을 활용한 결정구조 데이터 기반 결정구조 탐색 by 바죠

인공신경망을 활용한 결정구조 데이터 기반 결정구조 탐색

rdfsearch

문제: 알려진 결정구조들과 유사한 새로운 결정구조들을 찾아라! 
[좀 더 좋은 문제: 초기능성을 가지는 결정구조를 찾아라.]
(예를 들어, matminer를 활용하면 알려진 결정구조들을 다운로드 받을 수 있다. 
다수의 결정구조들이 이미 알려져 있다. 일부는 실험, 일부는 이론으로 제안된 결정구조들이 있다. 
Materials Project가 대표적인 결정구조 보관소이다.)

하나의 풀이 방법: 인공신경망을 활용하는 방법을 소개한다. 물론, 또 다른 풀이 방법들이 가능할 것이다. 
이미 발표된 논문에 나와 있는 것들 중에는 조성비를 입력으로 space group을 예측하는 프로그램도 있다. 
이 경우, 결정구조를 직접 제시하는 것은 아니다. 

결정구조
14 Bravais lattices + 32 point groups = 230 space group(without spin)
원자 위치들: 고정된 위치들과 대칭성을 만족하는 위치들로 두 가지로 분류가 됨. Wyckoff positions
따라서, 결정구조는 몇 가지 정보를 포함한다. 
space group,
chemical species,
Wyckoff sites,
unit cell parameters,
Wyckoff sites를 표현하는 숫자들

Bravais lattice를 예측하는 프로그램도 있다. 하지만, 여전히, 원자 위치를 예측하지 못하는 프로그램도 많다. 
결정구조 예측이 되려면, 적어도, 조성비를 입력으로 space group, Bravais lattice, Wyckoff positions이 나와야 한다. 
그렇지 않으면 진정한 결정구조 예측이라고 볼 수 없다. 
나아가 제일원리 계산도 수반되어야 할 것이다. 동적, 구조적, 열적 안정성 검증도 필요할 것이다. 

먼저 알려진 결정구조들을 확보한다. 
계산결과들, 실험 결과들, 관심이 있는 조성비를 가지는 물질들의 결정구조들을 확보한다. 
무료로 결정구조를 얻어낼 수 있는 하나의 방법 (유료 서비스 업체도 다수 있다.) : 

각각의 결정구조들로 부터 radial distribution function (RDF)를 계산한다. 

\[ \{ crystal ~structure \rightarrow  RDF \} \]

\[ n(r) = g(r) /(\rho 4\pi r^2 dr) \]

밀도
\[ \rho \] 
pair-correlation function
\[ g(r)\]
다수의 RDF 를 모두 모아 둔다. 이를 아래와 같이 표시한다.
\[ \{database~ RDF\} \]

이렇게 준비된 데이터에 대한 기계학습 훈련을 진행한다. 인공신경망의 학습을 진행한다. 
이것은 소위 생성모델은 비지도학습에 속한다. 즉, RDF 속에 담겨진 축약된 정보를 찾아내는 작업이다. 이러한 축약된 정보는 특정한 결정구조를 잘 설명할 수 있는 것이어야 한다. 이 축약된 정보는 또한 RDF를 잘 기술할 수 있는 것이어야 한다. RDF는 회전, 병진, 원자순열 조합에 불변이다. 아울러, 사용하는 단위셀의 크기에도 불변이다. 결정구조를 표현할 수 있는 하나의 표현자(representation)이다. 이 보다 더 좋은 표현자(representation)은 당연히 존재한다. 여러 가지를 만들 수 있을 것이다. 
 
구체적인 기계학습으로, 이번에는, 자기 학습을 진행한다. [ self-learning 을 수행한다. ]
\[ \{ RDF \} \rightarrow  \{ RDF'\} \]
이 때, 의도적인 정보손실을 수반하는 자기 학습을 진행한다. 
자기학습은 공식적으로 지도학습으로 분류되지 않는다. 하지만, 학습자체는 지도학습과 같은 방식이다. 

정보가 좌측 신경망에서 우측 신경망으로 흐른다고 가정한다.
좌측의 인공신경망(인코더, 암호기)은 RDF를 암호화한다. 정보 손실을, 의도적으로, 감수하고 최대한 간략한 정보로 암호화한다.
우측의 인공신경망(디코더, 해독기)은 RDF를 최대한 원본에 가깝도록 복원하려고 한다. 그것이 거의 불가능할 것이다. 하지만 최대한 가깝게 되도록 노력한다. 가능 한도내에서 인코더와 디코더를 동시에 동원하여 훈련시킨다. 즉, 인공신경망을 훈련시킨다. 즉, 두 개의 인공신경망들이 동시에 훈련된다. 암호화는 신경망, 해독하는 신경망이 동시에 훈련된다.
용량이 축소되어, 많은 정보를 버린 상태로 얻어진 암호로부터 출발하여 원본을 확보하려고 노력한다.
나는 누구인가를 학습하는 것이다. 많은 것을 버려야 나는 누구인가라는 질문에 대답할 수 있다. 
이 때, 학습을 위해서 원본 정보를 활용한다. 그래야만 인공신경망을 학습시킬 수 있다.

의도적으로 학습 중간단계에서 정보의 손실을 유도하는 것이 핵심이다.
같은 뜻으로 아주 효율적인 RDF 함수들의 표현자, "representation"을 찾는 작업을 수행하는 과정이다. 
결정구조를 잘 표현할 수 있는 fingerprint 또는 좋은 representation을 찾고자 한다.
정확하게는 VAE (variational autoencoder) 방법을 활용한다. 

하나의 결정구조, 즉, 하나의 RDF가 2차원 공간(latent space)에서 하나의 점이 되도록 한다. 
이것이 그 결정구조에 대한 암호이다. 이 암호는 숫자 두 개로 이루어진 것이다.
예를 들어, 10개의 RDF 들이 있다면 (즉, 10개의 결정구조가 있다면), 2차원 공간(latent space)에 10개의 점들이 존재할 것이다.
이들 10개의 점들은 각각이 10개의 알려진 결정구조들을 대표하는 것이다. 훈련을 통해서 10개의 암호를 만드는데 성공한 것이다.
10000개의 구조가 있다면 10000개의 점이 존재한다.
이것은 정확히 하나의 결정구조를 2차원 평면의 한 점으로 암호화한것이다. 
아울러, 동시에, 원본 자료를 복구할 수 있는 인공신경망도 훈련을 완성한 경우이다. 
해독 신경망도 동시에 확보한 상태에 도달하였다.

이러한 작업을 수행하는 인공신경망의 구조는 아래와 같다.
우측의 인공신경망(디코더, 해독기)을 활용하면 기존의 데이터 RDF와 유사한 RDF를 만들어 낼 수 있다. 
replica RDF라는 말로서 새롭게 생성된 RDF를 지칭하고자 한다. 실제 결정구조로부터 얻어낸 것이 아니라는 점에 주목해야 한다. 
replica RDF를 만들어 낼 수 있다. 이들을 아래와 같이 표시한다.
\[ \{replica ~RDF\} \]

binary_crossentropy,  mse 두 가지 모두 동일한 점을 지향하기는 한다. 

\[ mse = \frac{1}{N} \sum_{i=1}^{N}  (t_i-y_i)^2 \]
\[ bce=  \frac{1}{N}\sum_{i=1}^{N} \{ -t_i log(y_i) -(1-t_i) log(1-y_i) \}  \]



임의의 결정구조를 만드는 루틴을 만든다. 
3차원 결정구조의 경우 230개의 결정군이 존재한다. 
230개 공간군에 대해서 임의의 Wyckoff positions들을 만들어 낸다. 
공간군마다 Wyckoff positions을 정의하는 방법이 모두 다 다르다.

이렇게 무작위로 생성된 구조로 부터 RDF를 직접 계산한다. 이 작업은 항상 진행할 수 있다. 
일반적으로, 그 반대는 항상 진행할 수 없다. 8 Angstrom까지만 진행한다. 
RDF는, 결국, 원자-원자 거리의 함수로 특정 거리에서 확인되는 원자-원자들의 분포로서 히스토그램에 해당한다.

아래의 Pearson correlation coefficient 공식을 적용하면, 서로 다른 두 가지 RDF 함수들 사이의 유사성을 계산할 수 있다.
마찬가지로 1-r_P를 거리라고 정의한다. https://en.wikipedia.org/wiki/Pearson_correlation_coefficient
A key mathematical property of the Pearson correlation coefficient is that it is invariant under separate changes in location and scale in the two variables. That is, we may transform X to a + bX and transform Y to c + dY, where abc, and d are constants with bd > 0, without changing the correlation coefficient. 


첫번째 결정구조로부터 얻어낸 RDF: 
\[\{ x_i \}  \]
두번째 결정구조로부터 얻어낸  RDF:
\[\{ y_i \}  \]


이들 결정구조들 사이의 유사성 계산 공식: 두 구조가 유사할 수록 아래 계산 계산 결과는 1로 수렴한다. ( RDF가 결정구조를 완전히 대표한다고 가정하였다. 
이것이 결정구조를 표시하는 표현자(representation)이기 때문이다. 
이 부분은 가정이라고 볼 수 있다.) 
두 가지 결정구조들 중에서 한 결정구조의 정보가 선형적으로 변형된다고 하더라로 동일한 상관관계를 얻어낼 수 있다.
Pearson distance 정의:
\[ 1-r_P \]

기존의 { database RDF }와 새롭게 만들어낸 { replica RDF }, 이들 두 가지 데이터를 새로운 결정구조 찾는 과정에 이용할 것이다.
 
임의로 생성된 결정구조 하나가 있을 때, 즉시, RDF를 계산한다. 
이렇게 만들어진 RDF와 유사한 RDF를 찾고자 한다. 
위에서 확보한 {database RDF} 또는 {replica RDF}들 중에서 유사한 것이 있는지 체크한다. 

상당히 유사한 RDF를 찾았으면, 해당 임의의 결정구조를 저장한다. 
동일한 결정구조 생성 → RDF 계산 → 비교 과정을 반복한다.

저장된 구조들에 대해서 제일원리계산을 적용한다. 먼저, 구조 최적화 작업을 수행한다. 오렌지 색으로 연결된 선은 병렬적으로 처리 될 수 있는 부분이다. 즉, 무작위로 결정구조를 만들고, RDF를 만들고, 이를 기존의 데이터베이스와 비교하고 비슷하면 결정구조를 저장하는 일련의 컴퓨터 계산 작업은 완전히 독립적인 계산에 지나지 않는다. 완전히 독립적인 폴더에서 별도로 계산할 수도 있다. 
컴퓨터들 사이의 통신이 사실상 필요없기 때문이다.  
오랜지색으로 표시된 선은 병렬적으로 계산이 될 수 있는 부분이다.
이 계산을 위해서 MPI(message-passing interface)를 활용할 수 있다.

오렌지 선으로 연결된 부분이 반복된다. 
다시 말해서, {RDF}, {replica RDF} 이 들 두 가지는 단 한 번만에 만들어 진다. 그리고 변화하지 않는다. 
계속해서 다음의 단계들이 반복 된다. 오렌지 색 선. [병렬적으로 수행이 된다.]
[무작위 결정구조 생성  무작위 RDF 생성]
[무작위 RDF vs {RDF}, 무작위 RDF vs {replica RDF}]
[ 유사한 것이 있을 때, 즉, Pearson correlation coefficient가 클 때, 해당 무작위 결정구조를 저장한다.]

이렇게 얻어진 결정구조들에 대해서 제일원리 계산을 수행한다. 
즉, 얻어진 결정구조로 부터 시작하여 제일원리 계산상으로 완전히 이완시켜서 안정한 결정구조들을 최종적으로 얻어낸다. 
기존에 알려진 결정구조들 이외에 완전히 새로운 결정구조가 있는지 추가 확인 작업을 수행한다.
새로운 결정구조가 나왔다면, 제일원리 계산을 통해서 동적(dynamical), 구조적(mechanical), 열적(thermal) 안정성 검정을 추가로 수행한다. 최종적으로 제일원리 전자구조 계산을 수행한다. 

이러한 계산은 새로운 결정구조를 찾는데 유용한가? yes
과연, 데이터베이스에 존재하지 않는 새로운 결정구조들이 탐색되는가? yes
병렬적으로 탐색이 가능한가? yes
추가적인 제일원리 계산이 필요한가? yes
유용한 물성을 가지는 결정구조들이 발견될 수 있는가? probably yes
무에서 유를 창조하는 것에 해당하는가? probably no [하지만, 추가적인 계산으로 probably yes가 될수도 있음.]

Ab initio random structure search (AIRSS)란 방법은 완전히 무작위로 결정구조를 찾는 방법이다.
어떠한 기존의 데이터를 활용하지 않는다. 원자-원자 사이에 허용된 최소의 거리값만을 입력으로 사용한다. 
그 이외의 어떠한 가정도 사용하지 않는다. 그야말로 완전히 무작위로 결정구조를 생성하는 방법이다. 
다만, 공간군을 고려해서 대칭적 결정구조를 만들어 낸다. 
만들어낸 결정구조들에 대해서 제일원리 계산을 수행하여 결정구조를 최적화한다. 추가적인 물성 계산을 수행할 수 있다.

무작위 구조 생성  제일원리 계산으로 이완

기존의 알려져 있는 데이터를 활용할 경우, 보다 효율적으로 에너지가 낮은 보다 안정된 결정구조들을 쉽게 찾을 수 있다.
{database RDF}, {replica RDF} 모두 새로운 결정구조를 찾는데 큰 도움이 된다. 주지하는대로 기계학습의 3요소는 representation, evaluation, optimization이다.

실리콘으로만 구성된 새로운 결정구조 찾기에 도전:
micrioexplosion 실험 데이터를 설명할 수 있는 새로운 결정구조를 찾을 수 있다.
새로운 위상초전도 결정구조를 찾을 수 있다.

기계학습을 이용하여, 정확히는 인공신경망을 활용하여, 보다 쉽게 기존의 결정구조들과 아주 유사하지만 서로 다른 결정들을 쉽게 탐색할 수 있다. 

cf. 많은 인공신경망 기반 결정구조 제안 시스템이 실질적으로 결정구조를 주지 않는 경우도 많다. 예를 들어, 조성비를 입력으로space group 번호만, 출력으로, 예측하는 알고리듬도 많이 있다. Bravais lattice만 예측하기도 한다. 단위셀 내부의 원자들의 위치를 예측하지 못하는 계산 방법들이 많이 있다. 이것은 인공신경망이 충분히 정확한 수준으로 대칭성을 고려한 원자위치를 제안하는데 한계가 있다는 것을 방증하는 것이다.  하지만, 본 연구에서 제안하는 결정구조 예측 신경망은, 기준 단위셀의 부피, 원자간 최소 거리, 그리고 조성비만을 입력으로 한다. 본 연구에서 제안하는 결정구조 예측 신경망은 출력으로 space group, Bravais lattice, 원자 위치를 제안한다. 새롭게 찾아낸 결정구조가 기존에 발표된 것이 아니라는 것을 서버 탐색으로 알아낼 수 있다.

데이터 기반 결정구조 예측 프로그램,
입력: 기준 단위셀 부피, 원자-원자간 최소 거리(허용값), 조성비
출력: 결정구조를 나타내는 파일 (space group, Bravais lattice, Wyckoff positions), 사실상 가능한 대부분의 공간군에서 가장 유사한 결정구조들을 동시에 제시한다. 특히, 데이터베이스와 유사도가 높은 결정구조들에 더 많은 관심을 가질 수도 있다. 당연히 데이터베이스 속에 있는 결정구조들도 거의 대부분 포함되어 있을 것이다. 
결정구조들로부터 시작해서 새로운 결정구조들이 확보되는 방식의 계산이라고 볼 수 있다. 비지도 학습, 생성모델로 볼 수 있다.
이상적으로는 결정구조 자체가 들어가서 결정구조 자체가 나오는 훈련이 되어야 한다. 
이것은 매우 어려울 수 있다. 그래서 좀 더 간단한 representation을 선택한 것이다.

위에서 소개한 결정구조 탐색 방법으로 찾아낸 결정구조들은 여러 가지가 있다.
새로운 반도체 결정구조들이 다수 있다.

위에서 소개한 결정구조 탐색 방법으로 찾아낸 새로운 가상의 실리콘 결정구조: 위상학적 초전도 (topological superconductivity) 물성을 보유한 결정구조
이 결정 구조는 실온, 상압에서 안정한 실리콘 결정구조이다. 아울러 위상학적으로 단순하지 않은 밴드 구조를 가지며 초전도 특성을 가지고 있다. 동적으로, 구조적으로, 기계적으로 안정한 결정구조이다. 

위상물질이란?: 서로 상반되는 패턴을 가지고 있는 원자 구조들이 서로 마주칠 때, 상반된 파동함수들을 이어주어야만 하는데, 이 때, 가장자리 상태가 반드시 존재할 수밖에 없는 경우가 발생한다. 정수양자홀 효과에서 확인할 수 있는 것과 유사한 이 가장자리 상태는 전도성이 매우 매우 뛰어난 성질을 가지고 있다. 덩어리 상태로 정의되는 전자구조와 별도의 경이로운 전도특성을 가지는 표면 상태를 가지는 물질이 위상물질이다. 절연체가 될 수도 있다. 위상절연체는 덩어리 상태는 절연체이다. 하지만, 표면 상태는 도체이다. 
위상절연체

초전도 물질이란?: 특정한 온도 이하에서 전기 저항이 완전히 사라지는 물질이다. 한 번 전류가 흐르면 영원히 흐를 수 있다.

디락방정식의 해들 중에는 복소해가 아닌 실수해가 존재할 수 있다. 
반입자가 입자 자신이 되는 특이한 입자가 존재 할 수 있다. 
마요라나 페르미온


--------------------------------------------------------------------------------------------------------------
기존의 방법: 광역최적화 방법과 제일원리 계산을 결합한 방법으로 원하는 물성(전자구조)을 가지는 새로운 결정구조를 설계/탐색하는 방법이다. 
이 방법은 데이터베이스 기반 결정구조 탐색 방법이 아니다. 
가장 직접적인 물질 설계 방법(목적함수를 직접 활용한다.)으로 볼 수 있다. 
계산량이 방대할 수 있다. 전형적인 inverse problem을 푸는 것이다. 역방향 설계라고 볼 수 있다. 왜나하면 물성을 먼저 정의하고 해당 물성을 가지는 결정구조를 적극적으로 탐색하기 때문이다. 이러한 방법은 탐색이라기 보다는 설계에 가깝다. 
가장 이상적인 물질 설계라고 볼 수 있다. 
입력: 조성비, 단위셀 내부에 존재하는 원자들의 종류와 갯수 
출력: 결정구조

또 다른 기존의 방법:
알려진 결정구조들의 물성을 regression, classification문제로 전환하여 모델을 만든다.
이러한 모델을 이용해서 알려진 모든 결정구조들에 대해서 물성을 예측한다.
이렇게 예측된 물성이 뛰어난 결정구조들(여전히 알려진 결정구조들)에 대해서 자세한 제일원리 전자구조 계산을 수행한다. 
실험 연구를 수행한다. 새로운 결정구조를 제시하는 방법은 아니다. 알려져 있는 결정구조들을 일차로 먼저 선별해 내는 작업을 기계학습으로 진행하는 것이다. regression, classification 모델들을 활용할 수 있다. 결정구조, 조성비를 잘 표현할 수 있는 representation을 선택하고 물성을 예측하는 인공신경망을 구축할 수 있다. 예를 들어, 배터리, 영구자석 탐색에 활용될 수 있다. high-throughput 계산을 가속화할 수 있는 방법으로 볼 수 있다. 지도학습을 이용해서 물질 탐색을 가속화할 수 있다.

또 다른 방법:
잠재공간에서 물성을 최적화하는 방법도 있다.

생성모델이 아니라 예측모델(회귀/분류)을 만들고 알려진 결정구조들에 대해서 대용량 계산에 적용할 수 있다. 매우 빠른 선별 작업을 수행할 수 있다. 제일원리 계산을 수행하지 않고 선별작업을 조기에 완료할 수 있다.

--------------------------------------------------------------------------------------------------------------


성능지수: 소재가 특정 소자로 사용되었을 때 우리가 계산할 수 있는 성능지수를 지칭한다. 물론, 다양한 근사를 사용할 수 있다. 일차 탐색에서는 간단한 공식을 활용할 수 있다. 물성는 전자구조로부터 나온다는 가정을 하고 있다. 아울러, 그것은 제일원리 계산으로 근사할 수 있다고 가정한다. 결정구조로부터 전자구조 계산하는 연구는 오랜 역사를 가지고 있다. 매우 많은 연구가 수십년 동안 진행되어 왔다.
설계하고자 하는 물성에 따라서 매우 다양한 목적함수 설계가 가능하다.
태양전지 효율을 담당하는 직접갭 크기, 쌍극자 모멘트 크기, LED 성능을 좌우하는 직접갭, 쌍극자 모멘트 크기, 초전도 온도, 위상불변량, 캐리어 이동도, bulk modulus, 밴드갭과 전자구조의 뒤집힘. DOS 유효질량, 페르미준위에서의 상태밀도, 밴드 가장자리들에서 유효질량

목적함수는 전자구조로만 정의되지 않아도 된다.
결정구조에서의 구속 조건이 있을수도 있다. 전자구조, 원자구조로 부터 조합적으로 목적함수가 정의될수도 있다.
예를 들면, 에너지도 낮아야 하고 sp2 결합이 전체 결합의 50%가 되어야 한다. 이렇게 구속조건을 잡을수도 있다.

성능지수를 직접 계산할 수 없을 경우, 유사 성능지수를 정의함.
유사 성능지수를 최적화할 수 있도록 목적함수를 설계함.
결정구조 공간에서 목적함수를 최적화함.
선별된 몇 개의 결정구조들에 대해서 가각 성능지수 계산을 시도함.

붉은색으로 표시된 선은 병렬적으로 계산이 될 수 있는 부분이다.

---------------------------------------------------------------------------------------------------------------------



---------------------------------------------------------------------------------------------------------------------


인공지능 기술들 중에서 진화학습(evolutionary learning)과 인공신경망(artificial neural network)으로 대표되는 기계학습(machine learning), 이들 둘 사이의 유효성과 효율성을 따져 보지 않을 수 없다. 
Genetic algorithms (GAs) vs generative models (VAE or GAN)

model free optimization : genetic algorithm
model based optimization : Bayesian optimization

high-throughput 계산 방식: 알려진 모든 결정구조들에 대해 모두 물성을 정밀 조사하는 방법이다. 
물성에 따라서 이것이 가능할수도 있다. 하지만, 일반적으로 매우 많은 컴퓨터 자원을 필요로 한다.
새로운 결정구조를 제시하지 못한다.

인공신경망 모델을 중간 단계에서 활용하는 방법도 가능하다. 
즉, 근사 모델로서, 물성이 좋을 것으로 예상되는 알려진 결정구조들을 먼저 탐색하는 방법 등이 유용할 수 있다.
여기서 모델은 인공신경망 기반의 regression 함수로서 알려진 물성 데이터로부터 얻어낸 예측 모델이다. 
이 예측 모델을 활용하여 알려진 결정구조들에 대해서 예측을 수행한다. 
이 예측에서 높은 가능성을 가진 결정구조들에 대해서만 정밀 제일원리 계산을 수행한다.


---------------------------------------------------------------------------------------------------------------------

유사 성능지수를 활용한 진화학습 방법:
철저한 제일원리 계산 대신에 간단한 측정자, 유사 성능지수를 계산하여 원하는 물질을 우선적으로 탐색하고 설계한다.
이렇게 해서 우선적으로 선별된 결정구조들에 대해서 정밀한 계산을 수행한다.
새로운 결정구조를 찾을 수 있다.
빠르게 탐색할 수 있다.
추후에 정밀한 계산을 추가할 수 있다. 합성가능성. 합성이 되지 못하면 즉각 응용이 어렵다.

생성모델을 활용하는 방법:
새로운 결정구조를 제시할 수 있다.

high-throughput 계산:
새로운 결정구조를 제시하지는 못한다. 이미 존재하는 물질로 계산이 마무리 되면 즉각 응용이 가능하다.
제일원리 계산을 수행하여 물성을 모두 조사한다.
전통적인 연구의 확장이다. 보다 더 많은 계산 자원을 활용하여 계산/조사를 마무리한다.


---------------------------------------------------------------------------------------------------------------------


 cat ~/rdfsearch/prunSERIAL.py
import numpy as np
import os
if False:
    nfiles=100
    for i in range(nfiles):
        astring=str(i).zfill(4)
        bstring='POSCAR_'+astring
        os.system('cp POSCAR_0001 '+bstring)
if True:
    arr = os.listdir()
    inputs=[]
    i=0
    for i0 in range(len(arr)):
        astring=arr[i]
#       if astring[-4:] =='.txt' :
#           print(arr[i])
#       if astring[-3:] =='.py' :
#           print(arr[i])
        if astring[:7] =='POSCAR_' :
#           print(arr[i])
            inputs.append(astring)
        i=i+1
    inputs=sorted(inputs)
    nfiles=len(inputs)
#   print(inputs)
if True:
    ndir=20
    for i in range(ndir):
        astring=str(i).zfill(4)
        print(astring)
        bstring='mkdir '+astring
        os.system(bstring)
if True:
    for i in range(ndir):
        astring=str(i).zfill(4)
        bstring='cp SERIAL.pbs ./'+astring
        os.system(bstring)
        bstring='cp INCAR_rlx  ./'+astring
        os.system(bstring)
        bstring='cp INCAR_rlxall  ./'+astring
        os.system(bstring)
        bstring='cp INCAR_bs  ./'+astring
        os.system(bstring)
        bstring='cp POTCAR  ./'+astring
        os.system(bstring)
if True:
    dirlist=[ False for i in range(ndir)]
    i=0
    for k in range(nfiles):
        i0=int(np.mod(i,ndir))
        os.system('cp '+inputs[k]+' ./'+str(i0).zfill(4))
        dirlist[i0]=True
        i=i+1
if True:
    for i in range(ndir):
        astring=str(i).zfill(4)
        if dirlist[i] :
            bstring='cd ./'+astring+' ; ls * ; cd ../'
#           bstring='cd ./'+astring+' ; qsub SERIAL.pbs ; cd ../'
            os.system(bstring)

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
 cat struc2cif.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
from pymatgen.core import Structure
from pymatgen.io.cif import CifWriter
def get_cif(filename, tolerance=0.1):
    struc = Structure.from_file(filename)
    cif = CifWriter(struc, symprec=tolerance)
    cif.write_file(filename+'.cif')
if __name__ == '__main__':
    # ---------- argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tolerance', help='tolerance', type=float, default=0.1)
    parser.add_argument('infile', help='input file')
    args = parser.parse_args()
    # ---------- main
    filename = args.infile.split('/')[-1]    # ./aaa/bbb/POSCAR --> POSCAR
    get_cif(filename, args.tolerance)

 cat spg_check.py
#!/usr/bin/env python
import argparse
from pymatgen.core import Structure
def get_spg_info(filename, tolerance=0.1):
    struc = Structure.from_file(filename)
    spg_sym, spg_num = struc.get_space_group_info(symprec=tolerance)
    return spg_sym, spg_num
if __name__ == '__main__':
    # ---------- argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-t', '--tolerance', help='tolerance', type=float, default=0.1)
    parser.add_argument('infile', help='input file')
    args = parser.parse_args()
    # ---------- main
    print(get_spg_info(args.infile, args.tolerance))

 cat get_primitive_cell.py
#!/usr/bin/env python3
#
# get_primitive_cell.py
#   2022/03/08 T. Yamashita
#   get primitive cell using pymatgen
#     - pymatgen is required
#     - input: cif, POSCAR, xxx.vasp, etc. (readable file in pymatgen)
#     - output: standrd output. POSCAR format.
#   example
#     python3 get_primitive_cell abc.cif > POSCAR
#
import argparse
from pymatgen.core import Structure
def get_primitive(infile):
    struc = Structure.from_file(infile)
    # ---------- to primitive
    struc = struc.get_primitive_structure()
    # ---------- output
    print(struc.to(fmt='poscar'))
if __name__ == '__main__':
    # ---------- argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', help='input file')
    args = parser.parse_args()
    # ---------- main
    get_primitive(args.infile)


---------------------------------------------------------------------------------------------------------------------



핑백

덧글

  • 바죠 2021/04/21 11:58 # 답글

    https://arxiv.org/pdf/2104.09764.pdf

    https://www.nature.com/articles/s41524-020-0286-9

    https://arxiv.org/pdf/2005.07609.pdf
  • 바죠 2021/04/27 11:25 # 답글

    https://horizon.kias.re.kr/wp-content/uploads/2021/04/2104_%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0_%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5%EC%9D%98-%EC%8B%9C%EC%9E%91_fin.pdf

  • 2021/04/27 17:39 # 답글 비공개

    비공개 덧글입니다.
  • 바죠 2021/12/16 18:53 # 답글

    https://arxiv.org/ftp/arxiv/papers/2005/2005.07609.pdf

  • 바죠 2022/01/28 20:42 # 답글

    https://arxiv.org/pdf/2201.11188.pdf
    https://arxiv.org/pdf/2201.11168.pdf



  • 바죠 2022/02/11 13:10 # 답글

    https://arxiv.org/pdf/2202.05255.pdf
댓글 입력 영역

최근 포토로그