• 検索結果がありません。

温度を考慮した構造最適化プログラム

ドキュメント内 C60内包カーボンナノチューブの構造 (ページ 47-71)

任意の温度を入力し、その温度でナノチューブの構造最適化を実行するプログラム。

このプログラムでは、結果が出力されるファイルはあらかじめ決まっており(result.xyz)、 アニメーション表示に対応したデータが出力される。

c

c TersoffpotentialforCarbonsystem

c (1998/Jun/8) By R.Matsuo.

c (2000/Nov/8) restoredbyT.Nakamura

c 入力ファイル.xyz 出力ファイルresult.xyz

c このプログラムは別枠のパラメーターファイルを必要とする。

c

c 温度を任意のステップごとに入力し、計算させるプログラム。

PROGRAMMD

INCLUDE'PARAMETER'

C 原子座標のFILE名変数

CHARACTER*50FILENAME

CHARACTER*50FILENAME2

C 原子数の保持変数

INTEGERN

C loop用変数

INTEGERI,J,K

C 温度の変数(k)

REAL*8H,G

REAL*8TEMP1

REAL*8TEMP2

c 繰り返し変数(steps)

INTEGERA,B,M

C ALPHAVV2の宣言vv2(2)1:C602:nanotube

REAL*8ALPHA1,ALPHA2

DIMENSIONVV2(2)

REAL*8VV2

REAL*8SQRT

C 座標用配列

REAL*8 ZAHYO(MAX_ATOM3)

CHARACTER*8 AN(MAX_ATOM)

C 近接リスト配列

REAL*8LIST(0:MAX_LIST_N2,MAX_ATOM)

C 第二2近接リスト配列

REAL*8LIST2(0:MAX_LIST2_N,MAX_ATOM)

C 近接リスト配列

REAL*8LIST_VDW(0:MAX_LIST_VN2,MAX_ATOM)

C 近接データ配列IDXでリストから参照される

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 DIFF1(MAX_ATOM3)

REAL*8 VELO(MAX_ATOM3)

REAL*8 DD(MAX_ATOM3)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

C TERSOFF関数の型

REAL*8TERSOFF

C 系のエネルギー

REAL*8ENERGY,ENERGY_VDW

INTEGERIDX

c itest=1debug

itest=0

C FILE名を取得する

CALLGETFILENAME(FILENAME)

open(STATUS='OLD',unit=20,file='tempmd.log')

write(20,25)FILENAME

25 format(a50)

C XYZ座標を読み込む

CALLREAD_ZAHYO(FILENAME,N,I,ZAHYO,AN)

write(*,*)'I=',I

DO29J=1,MAX_ATOM3

VELO(J)=0.0D0

29 CONTINUE

IDX=0

CALLMAKE_LIST(N,ZAHYO,LIST,KYORI,CUTOFF,IDX)

CALLMAKE_LIST2(N,LIST,LIST2)

CALLMAKE_LIST_VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF,IDX,LIST,

#LIST2,AN)

ENERGY=TERSOFF(N,ZAHYO,LIST,KYORI,CUTOFF)

ENERGY_VDW=VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF)

ENERGY=ENERGY+ENERGY_VDW

WRITE(*,*)'何回繰り返す?A='

READ(*,*)A

WRITE(*,*)'TEMPARATUREofC_60(Real)?H(K)='

READ(*,*)H

WRITE(*,*)'TEMPARATUREofNANO(Real)?G(K)='

READ(*,*)G

WRITE(*,*)'N*3',N*3

WRITE(*,*)'C_60 幾つ入ってるB=?'

READ(*,*)B

WRITE(*,*)'何回ごとに温度入力M=?'

READ(*,*)M

K=0

DO41I=1,A

write(*,*)'I=',I

C 近接リストを生成

IDX=0

CALLMAKE_LIST(N,ZAHYO,LIST,KYORI,CUTOFF,IDX)

C 第二近接リストを生成

CALLMAKE_LIST2(N,LIST,LIST2)

c WRITE(*,*)IDX

c WRITE(*,*)'make_list_vdw'

CALLMAKE_LIST_VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF,IDX,LIST,

#LIST2,AN)

c WRITE(*,*)IDX

c WRITE(*,*)'make_newkyori'

CALLMAKE_NEWKYORI(N,ZAHYO,LIST,KYORI,CUTOFF)

c WRITE(*,*)'make_newkyoriv'

CALLMAKE_NEWKYORIV(N,ZAHYO,LIST_VDW,KYORI,CUTOFF)

c WRITE(*,*)'calc_diff'

CALLCALC_DIFF1(N,ZAHYO,LIST,KYORI,CUTOFF,DIFF1)

c WRITE(*,*)'calc_diff_vdw'

CALLCALC_DIFF1_VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF,DIFF1)

c 共役勾配法

c DO38J=1,MAX_ATOM3

c DIFF2(0,J)=0

c DD(J)=0.0D0

c38 CONTINUE

c CALLCALC_DIFF2(N,ZAHYO,LIST,LIST2,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

c CALLCALC_DIFF2_VDW

C # (N,ZAHYO,LIST_VDW,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

c CALLCONJGRAD(N,ZAHYO,DIFF1,DIFF2,DIFF2_DATA)

c

c 分子動力学法

DO39J=1,N*3

VELO(J)=VELO(J)+DIFF1(J)*CONV_VELO

ZAHYO(J)=ZAHYO(J)+VELO(J)

39 CONTINUE

ccc

c 温度入力

ccc

c

c c_60nanotubeを別けてそれぞれに温度を振り分ける。

c 読み込む ファイル の上から60番目までがc_60

c JJ=1C60,JJ=2NANOTUBE

c c_60

c

c ここでM回ごとにこのループに入るように条件IF文を書く。

c IF文とMOD構文を用いる。

c

IF(MOD(I,M).EQ.0) THEN

JJ=1

NNC60=60*B

NNC603=NNC60*3

VV2(JJ)=0.0

DOJ=1,NNC603

VV2(JJ)=VV2(JJ)+VELO(J)**2

ENDDO

WRITE(*,*)'VV2OFC60=',VV2(JJ)

C

ALPHA1=SQRT(2.08D-7*REAL(NNC60)*H/VV2(JJ))

C ---計算から求めたalphaをここで入力する。

---C ここではC_60用の入力画面。

C

DOJ=1,NNC603

VELO(J)=ALPHA1*VELO(J)

ENDDO

C

C次はnanotube

C

JJ=2

VV2(JJ)=0.0

DOJ=NNC603+1,N*3

VV2(JJ)=VV2(JJ)+VELO(J)**2

ENDDO

WRITE(*,*)'VV2ofnanotube=',VV2(JJ)

ALPHA2=SQRT(2.08D-7*REAL(N-NNC60)*G/VV2(JJ))

C

C ---nanotube用にここでalphaを入力する。

---C

DOJ=NNC603+1,N*3

VELO(J)=ALPHA2*VELO(J)

ENDDO

c

cALPHA=SQRT(3*N*Kb*T/m*VV2)

c =SQRT(3*N*1.38D-23*T/1.99D-26*VV2)

c =SQRT(2.08D3*N*T/VV2)

c m/s A/fsを比較して、係数を10D-10倍する。

c

cALPHAの画面表示

WRITE(*,*)'alpha1,2',alpha1,alpha2

TEMP1=0.48D7*VV2(1)*ALPHA1/REAL(NNC60)

TEMP2=0.48D7*VV2(2)*ALPHA2/REAL(N-NNC60)

WRITE(*,*)'TEMP1,2=',TEMP1,TEMP2

ELSE

ENDIF

cファイルへの出力(.log)

OPEN(STATUS='UNKNOWN',UNIT=30,FILE='tempC_60.log')

write(30,*)TEMP1

OPEN(STATUS='UNKNOWN',UNIT=31,FILE='temp_NANO.log')

write(31,*)TEMP2

OPEN(STATUS='UNKNOWN',UNIT=32,FILE='alphaC_60.log')

write(32,*)alpha1

OPEN(STATUS='UNKNOWN',UNIT=33,FILE='alpha_NANO.log')

write(33,*)alpha2

OPEN(STATUS='UNKNOWN',UNIT=34,FILE='VV2C_60.log')

write(34,*)VV2(1)

OPEN(STATUS='UNKNOWN',UNIT=35,FILE='VV2_NANO.log')

write(35,*)VV2(2)

ENERGY=TERSOFF(N,ZAHYO,LIST,KYORI,CUTOFF)

ENERGY_VDW=VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF)

ENERGY=ENERGY+ ENERGY_VDW

WRITE(20,40)I,ENERGY

40 format(i6,f20.7)

CALLPRINT_ZAHYO(N,J,ZAHYO,I,ENERGY,DIFF1,AN)

41 CONTINUE

C温度読み込みの確認画面表示

WRITE(*,*)'TEMP=',T

close(20)

STOP

END

c

cThisprogramisformdtorunonDecFortran

c

CC

C 座標データのFILE名を取得する サブルーチン

CC

101 SUBROUTINEGETFILENAME(FILENAME)

CHARACTER*50FILENAME

INTEGERI

I=IARGC()

IF(I.NE.1)then

WRITE(*,*)'Usage:opthoge.xyz'

GOTO110

ENDIF

CALLGETARG(1,FILENAME)

RETURN

110 STOP

END

121 SUBROUTINEGETARGU(LINE,I,ARGU)

CHARACTER*80LINE

CHARACTER*80DUM

CHARACTER*80ARGU

INTEGERJ

INTEGERK

INTEGERlenline

DUM=LINE

do128K=1,I

lenline=len(DUM)

DO122J=1,lenline

IF(DUM(J:J).EQ.'')THEN

GOTO122

ENDIF

IF(DUM(J:J).EQ.char(9) )THEN

GOTO122

ENDIF

IF(DUM(J:J).EQ.char(0) )THEN

GOTO122

ENDIF

GOTO123

122 CONTINUE

123 DUM=DUM(J:lenline)

lenline=len(DUM)

DO124J=2,lenline

IF(DUM(J:J).EQ.'')THEN

GOTO125

ENDIF

IF(DUM(J:J).EQ.char(9) )THEN

GOTO125

ENDIF

IF(DUM(J:J).EQ.char(0) )THEN

GOTO125

ENDIF

124 CONTINUE

125 ARGU=DUM(1:J-1)

DUM=DUM(J:lenline)

128 continue

RETURN

c129 STOP

END

130 REAL*8FUNCTIONATOR(STR)

CHARACTER*80STR

INTEGERI

INTEGERJ

INTEGERS

INTEGERD

INTEGERDCU

INTEGER*4R

INTEGER*4E

I=1

S=1

R=0

EC=0

E=0

IF(STR(1:1).EQ.'+')THEN

S=1

I=I+1

ENDIF

IF(STR(1:1).EQ.'-')THEN

S=-1

I=I+1

ENDIF

DO140J=I,80

IF(STR(J:J).EQ.'.')THEN

EC=1

GOTO140

ENDIF

D=ICHAR(STR(J:J))-ICHAR('0')

IF((D.GT.9).OR.(D.LT.0))THEN

GOTO145

ENDIF

R=R*10+D

E=E+EC

IF(R.GT.9999999)THEN

GOTO145

140 CONTINUE

145 ATOR=1.0D0 *S*R/(10.0D0**E)

RETURN

c149 STOP

END

CC

C 座標データ取り込み サブルーチン

CC

201 SUBROUTINEREAD_ZAHYO(FILENAME,N,I,ZAHYO,AN)

INCLUDE'PARAMETER'

CHARACTER*50FILENAME

C 原子数を保持する変数

INTEGERN

INTEGERN3

C FILEIOチェック用変数

INTEGERIOCHECK

C loopvariable

INTEGERI

C 炭素原子の座標用配列

REAL*8ZAHYO(MAX_ATOM3)

C 元素名用変数

CHARACTER*8 AN(MAX_ATOM)

CHARACTER*80LINE,ARGU

C FILEOPEN

OPEN(60,FILE=FILENAME,STATUS='OLD',IOSTAT=IOCHECK)

C FILEOPENのエラーチェック

IF(IOCHECK)THEN

WRITE(*,*)'Fileopenerror.'

GOTO299

ENDIF

C 原子数の制限チェック

READ(60,*)N

IF(MAX_ATOM.LT.N)THEN

WRITE(*,*)"Toomanyatoms."

GOTO299

ENDIF

N3=N*3

READ(60,209)LINE

208 format(f14.8)

209 format(a80)

C 座標読み込み 単位はÅ

DO210I=1,N3,3

READ(60,209)LINE

CALLGETARGU(LINE,1,ARGU)

AN(I/3+1)=ARGU

CALLGETARGU(LINE,2,ARGU)

ZAHYO(I)=ATOR(ARGU)

CALLGETARGU(LINE,3,ARGU)

ZAHYO(I+1)=ATOR(ARGU)

CALLGETARGU(LINE,4,ARGU)

ZAHYO(I+2)=ATOR(ARGU)

C 読み込んだ座標の画面表示(確認)

itest=0

if(itest.eq.1)then

WRITE(*,*)'X,Y,Z=',ZAHYO(I),ZAHYO(I+1),ZAHYO(I+3)

endif

C READ(60,*)AN(I/3+1),ZAHYO(I),ZAHYO(I+1),ZAHYO(I+2)

210 CONTINUE

CLOSE(60,STATUS='KEEP')

RETURN

299 CLOSE(60,STATUS='KEEP')

STOP

END

cc

C 結果出力サブルーチン1

cc

INCLUDE'PARAMETER'

INTEGERN,J,N3

REAL*8TEMP

REAL*8ZAHYO(MAX_ATOM3)

CHARACTER*8 AN(MAX_ATOM)

REAL*8DIFF1(MAX_ATOM3)

REAL*8ENERGY

INTEGERI

c結果のファイルへの出力(result.xyz)

cresult.xyzは一回ずつの原子の座標をプロットする。アニメーションで確認できる。

OPEN(1,STATUS='OLD',FILE='result.xyz')

WRITE(1,*)N

C WRITE(1,*)'TIME=',T*TIME_DIV*1.0D15,'fs ENERGY=',ENERGY

c WRITE(1,*)'fs ENERGY=',ENERGY,'TEMP(K)=',TEMP

WRITE(1,304)'fs ENERGY(eV)=',ENERGY

N3=N*3

DO311I=1,N3,3

WRITE(1,305)AN(I/3+1),ZAHYO(I),ZAHYO(I+1),ZAHYO(I+2)

# ,DIFF1(I)*10.0,DIFF1(I+1)*10.0,DIFF1(I+2)*10.0

304 FORMAT(a20,f15.2)

305 FORMAT(a5,f15.7,f15.7,f15.7,f15.7,f15.7,f15.7)

311 CONTINUE

C

C結果出力サブルーチン2

C

c

c302 SUBROUTINEPRINT_ZAHYO2(N,ZAHYO,T,ENERGY,DIFF1,AN)

c INCLUDE'PARAMETER'

c INTEGERN,N3

c INTEGERT

c REAL*8ZAHYO(MAX_ATOM3)

c CHARACTER*8AN(MAX_ATOM)

c REAL*8DIFF1(MAX_ATOM3)

c REAL*8ENERGY

c INTEGERI

c

c結果のファイルへの出力(result1.xyz)

c OPEN(STATUS='OLD',UNIT=N,FILE='result1.xyz')

c WRITE(N,*)N

C WRITE(N,*)'TIME=',T*TIME_DIV*1.0D15,'fs ENERGY=',ENERGY

c WRITE(N,*)'fs ENERGY=',ENERGY,'TEMP(K)=',T

c

C

N3=N*3

DO312I=1,N3,3

WRITE(N,306)AN(I/3+1),ZAHYO(I),ZAHYO(I+1),ZAHYO(I+2)

# ,DIFF1(I)*10.0,DIFF1(I+1)*10.0,DIFF1(I+2)*10.0

306 FORMAT(a5,f12.7,f12.7,f12.7,f12.7,f12.7,f12.7)

312 CONTINUE

398 RETURN

c399 STOP

END

CC

C 最近接原子のLISTを作成するサブルーチン

CC

C

C LIST(0,N):原子番号Nの近接原子の数

C LIST(I,N):原子番号NI番目の近接原子インデックス

C LIST(I+MAX_LIST_N,N):原子番号N I番目の近接原子番号

401 SUBROUTINEMAKE_LIST(N,ZAHYO,LIST,KYORI,CUTOFF,IDX)

INCLUDE'PARAMETER'

INTEGERN,N3

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERIDX

REAL*8 MAX_X,MAX_Y,MAX_Z

REAL*8 MIN_X,MIN_Y,MIN_Z

INTEGERI,K,J

INTEGERE,F,G

INTEGERL,M

INTEGERMESH_X,MESH_Y,MESH_Z

INTEGERTX,TY,TZ

INTEGERTI,TJ,TI3,TJ3

INTEGERMESH(0:MAX_MESH_ATOM,

# 0:MAX_MESH_X+1,0:MAX_MESH_Y+1,0:MAX_MESH_Z+1)

REAL*8TMP_R,TMP_CUTOFF

REAL*8SIN

N3=N*3

C リスト配列の初期化

DO405I=1,MAX_ATOM

LIST(0,I)=0

405 CONTINUE

C MESH配列の初期化

DO406I=0,MAX_MESH_X+1

DO406J=0,MAX_MESH_Y+1

DO406K=0,MAX_MESH_Z+1

MESH(0,I,J,K)=0

406 CONTINUE

C 系の座標の最大値-最小値を検索する

MAX_X=ZAHYO(1)

MAX_Y=ZAHYO(2)

MAX_Z=ZAHYO(3)

MIN_X=ZAHYO(1)

MIN_Y=ZAHYO(2)

MIN_Z=ZAHYO(3)

DO410I=4,N3,3

IF(MAX_X.LT.ZAHYO(I))THEN

MAX_X=ZAHYO(I)

ENDIF

IF(MAX_Y.LT.ZAHYO(I+1))THEN

MAX_Y=ZAHYO(I+1)

ENDIF

IF(MAX_Z.LT.ZAHYO(I+2))THEN

MAX_Z=ZAHYO(I+2)

ENDIF

IF(MIN_X.GT.ZAHYO(I))THEN

MIN_X=ZAHYO(I)

ENDIF

IF(MIN_Y.GT.ZAHYO(I+1))THEN

MIN_Y=ZAHYO(I+1)

ENDIF

IF(MIN_Z.GT.ZAHYO(I+2))THEN

MIN_Z=ZAHYO(I+2)

ENDIF

410 CONTINUE

c 最大、最小の画面表示(確認)

WRITE(*,*)'MAX_',MAX_X,MAX_Y,MAX_Z

WRITE(*,*)'MIN_',MIN_X,MIN_Y,MIN_Z

WRITE(*,*)'D_.',REAL(MESH_D)

C 一度、大まかに原子をグルーピングする。

C 最大値最小値から、メッシュの個数を決める

MESH_X=1+((MAX_X-MIN_X)/REAL(MESH_D))

MESH_Y=1+((MAX_Y-MIN_Y)/REAL(MESH_D))

MESH_Z=1+((MAX_Z-MIN_Z)/REAL(MESH_D))

C MESH用の配列 に収まらない場合STOP

IF(MESH_X.LE.MAX_MESH_X)THEN

GOTO415

ENDIF

IF(MESH_Y.LE.MAX_MESH_Y)THEN

GOTO415

ENDIF

IF(MESH_Z.LE.MAX_MESH_Z)THEN

GOTO415

ENDIF

WRITE(*,*)'MESHisoverflow:MAX_MESH.', MESH_X,MESH_Y,MESH_Z

WRITE(*,*)'MESHisoverflow:MAX_.',MAX_X,MAX_Y,MAX_Z

WRITE(*,*)'MESHisoverflow:MIN_.',MIN_X,MIN_Y,MIN_Z

STOP

C 全ての原子をMESHに グルーピングする。

415 DO420I=1,N

I3=I*3-2

TX=1+((ZAHYO(I3)-MIN_X)/MESH_D)

TY=1+((ZAHYO(I3+1)-MIN_Y)/MESH_D)

C MESH配列があるれる場合STOP

IF(MESH(0,TX,TY,TZ).EQ.MAX_MESH_ATOM)THEN

WRITE(*,*)'MESH_ATOMisoverflow:MAX_MESH_ATOM.'

STOP

ENDIF

MESH(0,TX,TY,TZ)= MESH(0,TX,TY,TZ)+1

MESH(MESH(0,TX,TY,TZ),TX,TY,TZ)=I

420 CONTINUE

C MESHのブロックの 近接内(27ブロック)

C で 距離を計算し 近接LISTを作成する

C ついでに カットオフ関数の値も計算する

DO443I=1,MESH_X

DO442J=1,MESH_Y

DO441K=1,MESH_Z

IF(MESH(0,I,J,K).EQ.0)THEN

GOTO441

ENDIF

DO433 E=I-1 ,I+1

DO432F=J-1, J+1

DO431G=K-1 ,K+1

IF(MESH(0,E,F,G).EQ.0)THEN

GOTO431

ENDIF

DO425 L=1,MESH(0,I,J,K)

DO424M=1,MESH(0,E,F,G)

TI=MESH(L,I,J,K)

TJ=MESH(M,E,F,G)

IF(TI.LE.TJ)THEN

GOTO424

ENDIF

TI3=TI*3-2

TJ3=TJ*3-2

C

C 原子間距離の計算

C

TMP_R=

# ((ZAHYO(TJ3 )-ZAHYO(TI3 ))**2+

# (ZAHYO(TJ3+1)-ZAHYO(TI3+1))**2+

# (ZAHYO(TJ3+2)-ZAHYO(TI3+2))**2 )**0.5d0

C

C 近接でない場合場合 処理を飛ばす

C

IF(TMP_R.GT.(PRM_CR+PRM_CD) )THEN

GOTO424

ENDIF

C LISTの配列があふれる時STOP

IF((LIST(0,TI).EQ.MAX_LIST_N).OR.

# (LIST(0,TJ).EQ.MAX_LIST_N))THEN

WRITE(*,*)'LIST_Nisoverflow:MAX_LIST_N.'

STOP

ENDIF

IDX=IDX+1

KYORI(IDX)=TMP_R

LIST(0,TI)=LIST(0,TI)+1

LIST(LIST(0,TI),TI )=IDX

LIST(LIST(0,TI)+MAX_LIST_N,TI)=TJ

LIST(0,TJ)=LIST(0,TJ)+1

LIST(LIST(0,TJ),TJ )=IDX

LIST(LIST(0,TJ)+MAX_LIST_N,TJ)=TI

C

C カットオフ関数を計算

C

TMP_CUTOFF=1.0D0

IF(TMP_R.GE.(PRM_CR-PRM_CD))THEN

TMP_CUTOFF=0.5D0*

# (1.0D0-SIN(PI*(TMP_R-PRM_CR)/(2.0D0*PRM_CD)))

ENDIF

IF(TMP_R.GE.(PRM_CR+PRM_CD))THEN

TMP_CUTOFF=0.0D0

ENDIF

424 CONTINUE

425 CONTINUE

431 CONTINUE

432 CONTINUE

433 CONTINUE

441 CONTINUE

442 CONTINUE

443 CONTINUE

C DO452I=1,N

C write(*,*)"--",I

C DO451J=1,LIST(0,I)

C WRITE(*,*)LIST(J+MAX_LIST_N,I)

C451 CONTINUE

C452 CONTINUE

469 RETURN

c499 STOP

END

C

C i原子に関するTersoffポテンシャル

C

501 REAL*8FUNCTIONTERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERI

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERJ,K,L,M

INTEGERI3,J3,K3

INTEGERIDXJ,IDXK

REAL*8G,GCOS

REAL*8ZETA

REAL*8I_X,I_Y,I_Z

REAL*8J_X,J_Y,J_Z

REAL*8K_X,K_Y,K_Z

REAL*8Bij

REAL*8EXP

REAL*8TMP

I3=I*3-2

I_X=ZAHYO(I3)

I_Y=ZAHYO(I3+1)

I_Z=ZAHYO(I3+2)

TMP=0.0D0

DO520L=1,LIST(0,I)

IDXJ=LIST(L,I)

J=LIST(L+MAX_LIST_N,I)

J3=J*3-2

J_X=ZAHYO(J3)

J_Y=ZAHYO(J3+1)

J_Z=ZAHYO(J3+2)

ZETA=0.0D0

DO510M=1,LIST(0,I)

IF(L.EQ.M)THEN

GOTO510

ENDIF

IDXK=LIST(M,I)

K=LIST(M+MAX_LIST_N,I)

K3=K*3-2

K_X=ZAHYO(K3)

K_Y=ZAHYO(K3+1)

K_Z=ZAHYO(K3+2)

GCOS=

# (

# (J_X-I_X)*(K_X-I_X)+

# (J_Y-I_Y)*(K_Y-I_Y)+

# (J_Z-I_Z)*(K_Z-I_Z)

# )/KYORI(IDXJ)/KYORI(IDXK)

IF(KYORI(IDXK).EQ.0.0D0)THEN

WRITE(*,*)KYORI(IDXK),I,J,K

G=(PRM_C*PRM_C)/(PRM_D*PRM_D)

-# (PRM_C*PRM_C)/

# (PRM_D*PRM_D+(PRM_H-GCOS)*(PRM_H-GCOS))

G=PRM_A*(G+1.0D0)

ZETA=ZETA+CUTOFF(IDXK)*G

510 CONTINUE

Bij=(1.0+(ZETA)**(PRM_ETA))**(-PRM_DELTA)

TMP=TMP+

# CUTOFF(IDXJ)*

# (

# PRM_EA*EXP(-PRM_LUMBDA1*KYORI(IDXJ))+

# (PRM_EB)*Bij*EXP(-PRM_LUMBDA2*KYORI(IDXJ))

# )

520 CONTINUE

TERSOFF_I=TMP

RETURN

c599 STOP

END

601 REAL*8FUNCTIONTERSOFF(N,ZAHYO,LIST,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERI

INTEGERN

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 TERSOFF_I

TERSOFF=0.0D0

DO610I=1,N

TERSOFF=TERSOFF+

# TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

610 CONTINUE

TERSOFF=TERSOFF/2.0D0

RETURN

c699 STOP

END

701 SUBROUTINECALC_DIFF1(N,ZAHYO,LIST,KYORI,CUTOFF,DIFF1)

INCLUDE'PARAMETER'

INTEGERN,N3

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 DIFF1(MAX_ATOM3)

INTEGERI,ID3

REAL*8 ZAHYO_ORG

REAL*8TERSOFF_LI

REAL*8TMP

N3=N*3

DO710I=1,N3

ID3=(I+2)/3

ZAHYO_ORG=ZAHYO(I)

ZAHYO(I)=ZAHYO_ORG+EPS1

CALLRECALC(ID3,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TERSOFF_LI(ID3,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I)=ZAHYO_ORG-EPS1

CALLRECALC(ID3,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

-# TERSOFF_LI(ID3,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I)=ZAHYO_ORG

CALLRECALC(ID3,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP/(2.0*EPS1)

DIFF1(I)=-TMP

710 CONTINUE

c799 STOP

END

801 SUBROUTINERECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERI,I3

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERJ,J3

INTEGERIDXJ

INTEGERM

REAL*8TMP_R

REAL*8TMP_CUTOFF

REAL*8SIN

REAL*8SQRT

I3=I*3-2

DO810M=1,LIST(0,I)

IDXJ=LIST(M,I)

J=LIST(M+MAX_LIST_N,I)

IDXJ=LIST(M,I)

J3=J*3-2

TMP_R=

# SQRT ((ZAHYO(J3)-ZAHYO(I3))**2+

# (ZAHYO(J3+1)-ZAHYO(I3+1))**2+

# (ZAHYO(J3+2)-ZAHYO(I3+2))**2 )

KYORI(IDXJ)=TMP_R

TMP_CUTOFF=1.0D0

IF(TMP_R.GE.(PRM_CR-PRM_CD) )THEN

TMP_CUTOFF=0.5D0*

# (1.0D0-SIN(PI*(TMP_R-PRM_CR)/(2.0D0*PRM_CD)))

ENDIF

IF(TMP_R.GE.(PRM_CR+PRM_CD) )THEN

TMP_CUTOFF=0.0D0

ENDIF

CUTOFF(IDXJ)=TMP_CUTOFF

810 CONTINUE

RETURN

c899 STOP

END

901 REAL*8FUNCTIONTERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERI

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 TERSOFF_I

INTEGERL

INTEGERJ

TERSOFF_LI=TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

DO910L=1,LIST(0,I)

J=LIST(L+MAX_LIST_N,I)

TERSOFF_LI=TERSOFF_LI+

# TERSOFF_I(J,ZAHYO,LIST,KYORI,CUTOFF)

910 CONTINUE

RETURN

c999 STOP

END

1001SUBROUTINEMAKE_LIST2(N,LIST,LIST2)

INCLUDE'PARAMETER'

INTEGERN

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERLIST2(0:MAX_LIST2_N,MAX_ATOM)

INTEGERI,J,K,L,M

DO1010I=1,N

DO1005J=1,LIST(0,I)

L=LIST(J+MAX_LIST_N,I)

DO1003K=1,LIST(0,L)

M=LIST(K+MAX_LIST_N,L)

IF(M.EQ.I)THEN

GOTO1003

ENDIF

IF(M.EQ.L)THEN

GOTO1003

ENDIF

IF(LIST2(0,I).EQ.MAX_LIST2_N)THEN

WRITE(*,*)'MAX_LIST2_Nisoverflow'

&,i,LIST2(0,i),MAX_LIST2_N,MAX_ATOM

STOP

ENDIF

LIST2(0,I)=LIST2(0,I)+1

LIST2(LIST2(0,I),I)=M

1003 CONTINUE

1005 CONTINUE

1010CONTINUE

RETURN

c1099STOP

END

1101SUBROUTINECALC_DIFF2

#(N,ZAHYO,LIST,LIST2,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERN,N3

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERLIST2(0:MAX_LIST2_N,MAX_ATOM)

REAL*8 ZAHYO(MAX_ATOM3)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

INTEGERI,J,K

INTEGERL

N3=N*3

C DO1110I=1,MAX_ATOM3

C DIFF2(0,I)=0

C1110CONTINUE

DO1150I=1,N

C 同一原子の座標系

CALLCALC_DIFF2_1

# (I,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

C 隣合う原子の座標系

DO1145L=1,LIST(0,I)

J=LIST(L+MAX_LIST_N,I)

CALLCALC_DIFF2_2

# (I,J,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

1145 CONTINUE

C 第二隣接の座標系

DO1146L=1,LIST2(0,I)

J=LIST2(L,I)

CALLCALC_DIFF2_3

# (I,J,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

1146 CONTINUE

1150CONTINUE

RETURN

c1199STOP

END

1201SUBROUTINECALC_DIFF2_1

# (I,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERI

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

REAL*8 ZAHYO(MAX_ATOM3)

REAL*8 KYORI(MAX_DATA_IDX)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 TERSOFF_LI

INTEGERI3,J3

INTEGERII,JJ

INTEGERI3II,J3JJ

REAL*8X,Y

REAL*8TMP

REAL*8DATA

I3=I*3-3

J3=I3

DO1230II=1,3

DO1220JJ=1,3

I3II=I3+II

J3JJ=J3+JJ

IF(I3II.NE.J3JJ)THEN

X=ZAHYO(I3II)

Y=ZAHYO(J3JJ)

ZAHYO(I3II)=X+EPS2

ZAHYO(J3JJ)=Y+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP+

# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X+EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

-# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

-# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

DATA=TMP/(8.0D0*EPS2*EPS2)

ZAHYO(I3II)=X

ZAHYO(J3JJ)=Y

ELSE

X=ZAHYO(I3II)

ZAHYO(I3II)=X+2.0D0*EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-2.0D0*EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP+

# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

-# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

-# TERSOFF_LI(I,ZAHYO,LIST,KYORI,CUTOFF)

DATA=TMP/(3.0D0*EPS2*EPS2)

ZAHYO(I3II)=X

ENDIF

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLADD_DIFF2(DATA,I3II ,J3JJ,DIFF2,DIFF2_DATA)

1220 CONTINUE

1230CONTINUE

RETURN

c1299STOP

1301SUBROUTINEADD_DIFF2(DATA,I3II,J3JJ,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERI3II,J3JJ

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DATA

IF(DIFF2(0,I3II).EQ.MAX_DIFF2_LIST)THEN

WRITE(*,*)'MAX_DIFF2_LISTisoverflow.'

STOP

ENDIF

DIFF2(0,I3II)=DIFF2(0,I3II)+1

DIFF2(DIFF2(0,I3II),I3II)=J3JJ

DIFF2_DATA(DIFF2(0,I3II),I3II)=DATA

C WRITE(*,*)I3II,J3JJ,DATA

RETURN

c1349STOP

END

1351SUBROUTINEADD2_DIFF2(DATA,I3II,J3JJ,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERI3II,J3JJ

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DATA

INTEGERI

DO1360I=1,DIFF2(0,I3II)

IF(DIFF2(I,I3II).EQ.J3JJ)THEN

DIFF2_DATA(I,I3II)=DIFF2_DATA(I,I3II)+DATA

GOTO1380

ENDIF

1360CONTINUE

WRITE(*,*)'errorADD2_DIFF2'

STOP

C WRITE(*,*)I3II,J3JJ,DATA

1380RETURN

c1399STOP

END

1401SUBROUTINECALC_DIFF2_2

# (I,J,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERI,J

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERLIST_IJ(0:MAX_LIST_IJ)

REAL*8 ZAHYO(MAX_ATOM3)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 TERSOFF_I

REAL*8 TERSOFF_LIJ

INTEGERI3,J3

INTEGERII,JJ

INTEGERI3II,J3JJ

REAL*8X,Y

REAL*8TMP

REAL*8DATA

CALLMAKE_LIST_IJ(I,J,LIST_IJ,LIST)

I3=I*3-3

J3=J*3-3

DO1430II=1,3

DO1420JJ=1,3

I3II=I3+II

J3JJ=J3+JJ

X=ZAHYO(I3II)

Y=ZAHYO(J3JJ)

ZAHYO(I3II)=X+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

# +TERSOFF_I(J,ZAHYO,LIST,KYORI,CUTOFF)

# +TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# +TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

# +TERSOFF_I(J,ZAHYO,LIST,KYORI,CUTOFF)

# +TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X+EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# -TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

# -TERSOFF_I(J,ZAHYO,LIST,KYORI,CUTOFF)

# -TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# -TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

# -TERSOFF_I(J,ZAHYO,LIST,KYORI,CUTOFF)

# -TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

DATA=TMP/(8.0D0*EPS2*EPS2)

ZAHYO(I3II)=X

ZAHYO(J3JJ)=Y

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

CALLADD_DIFF2(DATA,I3II,J3JJ,DIFF2,DIFF2_DATA)

1420 CONTINUE

1430CONTINUE

RETURN

c1499STOP

END

1501SUBROUTINEMAKE_LIST_IJ(I,J,LIST_IJ,LIST)

INCLUDE'PARAMETER'

INTEGERI,J

INTEGERLIST_IJ(0:MAX_LIST_IJ)

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERL,M

LIST_IJ(0)=0

DO1540L=1,LIST(0,I)

DO1530M=1,LIST(0,J)

IF(LIST(L+MAX_LIST_N,I)

# .NE.LIST(M+MAX_LIST_N,J))THEN

GOTO1530

ENDIF

IF(LIST_IJ(0).EQ.MAX_LIST_IJ) THEN

WRITE(*,*)'MAX_LIST_IJisoverflow.'

ENDIF

LIST_IJ(0)=LIST_IJ(0)+1

LIST_IJ(LIST_IJ(0))=LIST(L+MAX_LIST_N,I)

1530 CONTINUE

1540CONTINUE

RETURN

c1599STOP

END

1601REAL*8FUNCTIONTERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERLIST_IJ(0:MAX_LIST_IJ)

REAL*8 ZAHYO(MAX_ATOM3)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 TERSOFF_I

INTEGERI,L

TERSOFF_LIJ =0.0D0

DO1610L=1,LIST_IJ(0)

I=LIST_IJ(L)

TERSOFF_LIJ=TERSOFF_LIJ+

# TERSOFF_I(I,ZAHYO,LIST,KYORI,CUTOFF)

1610 CONTINUE

RETURN

c1699 STOP

END

1701SUBROUTINECALC_DIFF2_3

# (I,J,ZAHYO,LIST,KYORI,CUTOFF,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERI,J

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERLIST_IJ(0:MAX_LIST_IJ)

REAL*8 ZAHYO(MAX_ATOM3)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 TERSOFF_LIJ

INTEGERI3,J3

INTEGERII,JJ

INTEGERI3II,J3JJ

REAL*8X,Y

REAL*8TMP

REAL*8DATA

CALLMAKE_LIST_IJ(I,J,LIST_IJ,LIST)

I3=I*3-3

J3=J*3-3

DO1730II=1,3

DO1720JJ=1,3

I3II=I3+II

J3JJ=J3+JJ

X=ZAHYO(I3II)

Y=ZAHYO(J3JJ)

ZAHYO(I3II)=X+EPS2

ZAHYO(J3JJ)=Y+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# +TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X+EPS2

ZAHYO(J3JJ)=Y-EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# -TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X-EPS2

ZAHYO(J3JJ)=Y+EPS2

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

TMP=TMP

# -TERSOFF_LIJ(LIST_IJ,ZAHYO,LIST,KYORI,CUTOFF)

ZAHYO(I3II)=X

ZAHYO(J3JJ)=Y

CALLRECALC(I,ZAHYO,LIST,KYORI,CUTOFF)

CALLRECALC(J,ZAHYO,LIST,KYORI,CUTOFF)

CALLADD_DIFF2(DATA,I3II ,J3JJ,DIFF2,DIFF2_DATA)

1720 CONTINUE

1730CONTINUE

RETURN

c1799STOP

END

1801SUBROUTINECONJGRAD(N,ZAHYO,DIFF1,DIFF2,DIFF2_DATA)

INCLUDE'PARAMETER'

INTEGERN

REAL*8ZAHYO(MAX_ATOM3)

REAL*8DIFF1(MAX_ATOM3)

INTEGERDIFF2(0:MAX_DIFF2_LIST,MAX_ATOM3)

REAL*8 DIFF2_DATA(MAX_DIFF2_LIST,MAX_ATOM3)

INTEGERN3

REAL*8P(MAX_ATOM3)

REAL*8R(MAX_ATOM3)

REAL*8AP(MAX_ATOM3)

REAL*8X(MAX_ATOM3)

REAL*8NORM_R2,NORM_R2_

REAL*8PAP

REAL*8A

REAL*8C

INTEGERI,J,K

INTEGERL

N3=N*3

NORM_R2=0.0D0

DO1810I=1,N3

X(I)=0.0D0

R(I)=DIFF1(I)

P(I)=DIFF1(I)

NORM_R2=NORM_R2+R(I)*R(I)

1810CONTINUE

C WRITE(*,*)0,NORM_R2

DO1860K=1,N3

IF(NORM_R2 .LT.1.0D-6)THEN

GOTO1865

ENDIF

DO1820I=1,N3

AP(I)=0.0D0

DO1815L=1,DIFF2(0,I)

J=DIFF2(L,I)

AP(I)=AP(I)+P(J)*DIFF2_DATA(L,I)

1815 CONTINUE

1820 CONTINUE

PAP=0.0D0

DO1830I=1,N3

PAP=PAP+P(I)*AP(I)

1830 CONTINUE

A=NORM_R2/PAP

C WRITE(*,*)'A=',A

NORM_R2_=0.0D0

DO1840I=1,N3

X(I)=X(I)+A*P(I)

R(I)=R(I)-A*AP(I)

NORM_R2_=NORM_R2_+R(I)*R(I)

1840 CONTINUE

C WRITE(*,*)K,NORM_R2_

C=NORM_R2_/NORM_R2

IF(C.GT.1.0D0)THEN

GOTO1865

NORM_R2=NORM_R2_

DO1850I=1,N3

P(I)=R(I)+C*P(I)

1850 CONTINUE

1860CONTINUE

1865DO1870I=1,N3

ZAHYO(I)=ZAHYO(I)+X(I)

1870CONTINUE

RETURN

c1899STOP

END

1901SUBROUTINEMAKE_LIST_VDW(N,ZAHYO,LIST_VDW,KYORI,CUTOFF,IDX

#,LIST,LIST2,AN)

INCLUDE'PARAMETER'

INTEGERN,N3

REAL*8 ZAHYO(MAX_ATOM3)

CHARACTER*8 AN(MAX_ATOM)

INTEGERLIST_VDW(0:MAX_LIST_VN2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

INTEGERIDX

INTEGERLIST(0:MAX_LIST_N2,MAX_ATOM)

INTEGERLIST2(0:MAX_LIST2_N,MAX_ATOM)

INTEGERI,K,J

INTEGERE,F,G

INTEGERL,M

INTEGERI3

INTEGERTX,TY,TZ

INTEGERTI,TJ,TI3,TJ3

REAL*8TMP_R,TMP_CUTOFF

C REAL*8SIN

C INTEGERIDX

N3=N*3

C リスト配列の初期化

DO1905I=1,MAX_ATOM

LIST_VDW(0,I)=0

1905 CONTINUE

C 系の座標の最大値-最小値を検索する

C 一度、大まかに原子をグルーピングする。

C 最大値最小値から、メッシュの個数を決める

C 全ての原子をMESHに グルーピングする。

DO1925TI=1,N

DO1924TJ=1,N

IF(TI.LE.TJ)THEN

GOTO1924

ENDIF

TI3=TI*3-2

TJ3=TJ*3-2

C

C 原子間距離の計算

C

TMP_R=

# ((ZAHYO(TJ3 )-ZAHYO(TI3 ))**2+

# (ZAHYO(TJ3+1)-ZAHYO(TI3+1))**2+

# (ZAHYO(TJ3+2)-ZAHYO(TI3+2))**2 )**0.5d0

C

C 範囲外のとき飛ばす。

IF(TMP_R.GT.(PRM_VCR2+PRM_VCD2))THEN

GOTO1924

ENDIF

C 同一分子内は 無視

IF(AN(TI).EQ. AN(TJ))THEN

ENDIF

CWRITE(*,*)AN(TI),AN(TJ)

C LISTの配列があふれる時STOP

IF((LIST_VDW(0,TI).EQ.MAX_LIST_VN).OR.

# (LIST_VDW(0,TJ).EQ.MAX_LIST_VN))THEN

WRITE(*,*)'LIST_VNisoverflow:MAX_LIST_VN.'

STOP

ENDIF

IDX=IDX+1

KYORI(IDX)=TMP_R

LIST_VDW(0,TI)=LIST_VDW(0,TI)+1

LIST_VDW(LIST_VDW(0,TI),TI )=IDX

LIST_VDW(LIST_VDW(0,TI)+MAX_LIST_VN,TI)=TJ

LIST_VDW(0,TJ)=LIST_VDW(0,TJ)+1

LIST_VDW(LIST_VDW(0,TJ),TJ )=IDX

LIST_VDW(LIST_VDW(0,TJ)+MAX_LIST_VN,TJ)=TI

C

C カットオフ関数を計算

C

TMP_CUTOFF=0.0D0

IF(TMP_R.GE.(PRM_VCR-PRM_VCD))THEN

TMP_CUTOFF=0.5D0*

# (1.0D0+SIN(PI*(TMP_R-PRM_VCR)/(2.0D0*PRM_VCD)))

ENDIF

IF(TMP_R.GE.(PRM_VCR+PRM_VCD))THEN

TMP_CUTOFF=1.0D0

ENDIF

IF(TMP_R.GE.(PRM_VCR2-PRM_VCD2))THEN

TMP_CUTOFF=0.5D0*

# (1.0D0-SIN(PI*(TMP_R-PRM_VCR2)/(2.0D0*PRM_VCD2)))

ENDIF

IF(TMP_R.GE.(PRM_VCR2+PRM_VCD2))THEN

TMP_CUTOFF=0.0D0

ENDIF

CUTOFF(IDX) =TMP_CUTOFF

1924 CONTINUE

1925 CONTINUE

C DO1952I=1,N

C write(*,*)"--",I

C DO1951J=1,LIST_VDW(0,I)

C WRITE(*,*)LIST_VDW(J+MAX_LIST_VN,I)

C1951 CONTINUE

C1952 CONTINUE

1969 RETURN

c1999 STOP

END

C

C原子Iに関したVanDerWaalsポテンシャル

C

2001REAL*8FUNCTIONVDW_I(I,ZAHYO,LIST_VDW,KYORI,CUTOFF)

INCLUDE'PARAMETER'

INTEGERI

REAL*8 ZAHYO(MAX_ATOM3)

INTEGERLIST_VDW(0:MAX_LIST_VN2,MAX_ATOM)

REAL*8 KYORI(MAX_DATA_IDX)

REAL*8 CUTOFF(MAX_DATA_IDX)

REAL*8 R,U

REAL*8VDW_FUNC

INTEGERL,IDXJ

U=0.0D0

DO2010L=1,LIST_VDW(0,I)

IDXJ=LIST_VDW(L,I)

R=KYORI(IDXJ)

U=U+CUTOFF(IDXJ)*VDW_FUNC(R)

2010CONTINUE

VDW_I=U

C write(*,*)"VDW",U,R

ドキュメント内 C60内包カーボンナノチューブの構造 (ページ 47-71)

関連したドキュメント