화학: PES using Diabatic States

이번에 논문을 준비하면서 diabatic state 두 개를 포개서 adiabatic potential energy surface (PES)를 그려야할 일이 있었다.

Screen Shot 2017-04-07 at 2.29.40 PM

Image source: Wikipedia

파워포인트로 대충 그리니까 기울기가 달라서 마음에 들지 않아가지고, 엑셀로 2차 곡선과 4차 곡선 두개를 그려보았다.

Screen Shot 2017-04-07 at 2.52.12 PM.png

대충 형태는 비슷하게 나오는데 두 개의 2차 곡선을 겹친 느낌이 전혀 나지 않았다.

수학전공인 친구한테 물었더니 두 개의 2차 곡선을 그린 다음에 위의 그래프는 max로 아래의 그래프는 min으로 하라고 했다. 이건 사실 수학을 전공했기 때문에 줄 수 있는 어드바이스가 아니라 센스가 좋아서 떠오른 아이디어 같다. 어쨌든 머리가 트인놈은 다르다.

Screen Shot 2017-04-07 at 2.53.37 PMx=0에서 스무스하지가 않다. 그래서 저 부분만 임의로 값을 바꿔주면 꽤 그럴듯한 adiabatic PES를 얻을 수 있다. 두 그래프 간격이 너무 벌어진다 싶으면 max graph를 일정한 값만큼 낮춰주면 된다.
Screen Shot 2017-04-07 at 2.54.10 PM

조금 더 신경쓰면 점선으로 diabatic states까지 표현 가능.Screen Shot 2017-04-07 at 2.50.04 PM.png

Asymmetric parabola 두개를 겹쳐도 잘 된다.

Screen Shot 2017-04-07 at 3.16.33 PM.png

어디선가 나같은 고통을 겪고있을 영혼들을 위해 엑셀 파일 공유. AdiabaticPES


두 parabola의 minimum y값 차이가 커질수록 그래프가 급격하게 개판이 된다.

Screen Shot 2017-04-07 at 4.29.01 PM.png

저렇게 되는 이유는 기본전제가 두 그래프가 x=0에서 cross한다는 것이기 때문이다. 하나의 그래프가 아래쪽으로 내려가면 두 포물선이 교차하는 x값이 점점 작아지게 되고, 그 지점을 따로 찾아서 그곳을 기준으로 모양을 다듬어야한다.

이것이 너무나 번거로워서 결국 python 출동!

##################

#### VARIABLE ####

##################

# Range of x-value

x_min=-10

x_max=10

# position of reactant and product on x-axis

x_react=-4

x_prod=4

# Delta G

# If negative (positive) value is given, the product (reactant) form is more stable

# dG should be k*2*x_react*x_prod

dG=-16

# shift of max curve

max_shift=-20

######################

def first_parabola(x):

    y=(x-x_prod)**2+dG

    return y

def second_parabola(x):

    y=(x-x_react)**2

    return y

printx diabatic1 diabatic2 adabatic1 adiabatic2

for x in xrange(x_min,x_max+1):

    x_cross=(x_react**2+dG+x_prod**2)/(2*x_react*x_prod)

    fpx=first_parabola(x)

    spx=second_parabola(x)

    fpxc=(first_parabola(x-1)+first_parabola(x+1)-max_shift)/2

    spxc=(second_parabola(x-1)+second_parabola(x+1)-max_shift)/2

    if x==x_cross:

        print x, fpxc, spxc, “#“, “#

    else:

        if x<x_cross:

            print x, fpx-max_shift, spx, min(fpx,spx), max(fpx,spx)-max_shift

        else:

            print x, fpx, spx-max_shift, min(fpx,spx), max(fpx,spx)-max_shift

print\nMessage

printTwo parabola cross at x=“, x_cross

printNeed to adjust value near that point

여전히 x_cross와 그 주변에서의 값들을 손 보아야하는 번거로움이 있다..

Screen Shot 2017-04-07 at 4.26.13 PM.png

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s