PYTHON - 반복

Crystal structure를 반복시켜 그릴 필요가 있어서 다음과 같은 code를 짜봤다.

a = ['Zn', 1.9113500000000001, 1.10351844, 0.0]
b = ['Zn', 1.9113500000000001, -1.10351844, 3.13035]
c = ['S', 1.9113500000000001, 1.10351844, 2.3465103599999999]
d = ['S', 1.9113500000000001, -1.10351844, -0.78383963999999995]

for i in xrange(5):
    for j in xrange(5):
        for k in xrange(4):
            print a[0] + " "+ str(a[1]+(i+j)*1.91135000) + " " + str(a[2]+(j-i)*3.31055531) + " " + str(a[3]+ k*6.2607)
            print b[0] + " "+ str(b[1]+(i+j)*1.91135000) + " " + str(b[2]+(j-i)*3.31055531) + " " + str(b[3]+ k*6.2607)
            print c[0] + " "+ str(c[1]+(i+j)*1.91135000) + " " + str(c[2]+(j-i)*3.31055531) + " " + str(c[3]+ k*6.2607)
            print d[0] + " "+ str(d[1]+(i+j)*1.91135000) + " " + str(d[2]+(j-i)*3.31055531) + " " + str(d[3]+ k*6.2607)

Lattice constant와 basis vector에 대한 정보[1].
위의 code는 hexagonal symmetry가 있는 경우에 맞게 짠 거라, i, j, k를 임의로 바꾸면 안 된다.

조금만 더 손보면 일반화된 code도 짤 수 있을 것이다.
예를 들면 lattice vector를 input으로 받는 건 조금만 고치면 된다.

확실한 건, 이런 간단한 프로그램은 python으로 짜는 게 확실히 낫다.

조금 손을 봐서 일반적인 code를 짰다.

(1) basis 입력받고

a.append(['Zn', 1.9113500000000001, 1.10351844, 0.0])
a.append(['Zn', 1.9113500000000001, -1.10351844, 3.13035])
a.append(['S', 1.9113500000000001, 1.10351844, 2.3465103599999999])
a.append(['S', 1.9113500000000001, -1.10351844, -0.78383963999999995])

(2) lattice vector 입력받고

l.append([1.91135000,-3.31055531,0.00000000])
l.append([1.91135000  ,3.31055531  ,0.00000000])
l.append([0.00000000  ,0.00000000,  6.26070000])

(3) 반복.

for i in xrange(5):
    for j in xrange(5):
        for k in xrange(5):
            for m in xrange(4):
                x = a[m][1] + i*l[0][0] + j*l[1][0] + k*l[2][0]
                y = a[m][2] + i*l[0][1] + j*l[1][1] + k*l[2][1]
                z = a[m][3] + i*l[0][2] + j*l[1][2] + k*l[2][2]
                print a[m][0] + " " + str(x) + " " + str(y) + " " + str(z)

예를 들어 C의 좌표는 다음과 같이 하면 얻을 수 있다.

l.append([0.00000000,  1.78500000,  1.78500000])
l.append([1.78500000,  0.00000000,  1.78500000])
l.append([1.78500000,  1.78500000,  0.00000000])
a.append(['C'  ,  0.44625000,  0.44625000,  0.44625000])
a.append(['C'  , -0.44625000, -0.44625000, -0.44625000])
for i in xrange(300):
    for j in xrange(300):
        for k in xrange(300):
            for m in xrange(2):
                x = a[m][1] + i*l[0][0] + j*l[1][0] + k*l[2][0]
                y = a[m][2] + i*l[0][1] + j*l[1][1] + k*l[2][1]
                z = a[m][3] + i*l[0][2] + j*l[1][2] + k*l[2][2]
                if 30 <x < 50 :
                    if 30<y < 50 :
                      if 30 < z < 50:
                          print a[m][0] + " " + str(x) + " " + str(y) + " " + str(z)
                         
ZnS의 좌표는 다음 코드로 얻을 수 있다.

l = []
a = []
l.append([0.00000000,  2.70465000,  2.70465000])
l.append([2.70465000,  0.00000000,  2.70465000])
l.append([2.70465000,  2.70465000,  0.00000000])
a.append(['Zn'  ,  0.00000000,  0.00000000,  0.00000000])
a.append(['S'  , 1.35232500,  1.35232500,  1.35232500])
for i in xrange(300):
    for j in xrange(300):
        for k in xrange(300):
            for m in xrange(2):
                x = a[m][1] + i*l[0][0] + j*l[1][0] + k*l[2][0]
                y = a[m][2] + i*l[0][1] + j*l[1][1] + k*l[2][1]
                z = a[m][3] + i*l[0][2] + j*l[1][2] + k*l[2][2]
                if 30 <x < 50 :
                    if 30<y < 50 :
                      if 30 < z < 50:
                          print a[m][0] + " " + str(x) + " " + str(y) + " " + str(z)

[1] http://cst-www.nrl.navy.mil/lattice/struk.xmol/b4.pos