一个生成碳纳米管坐标的fortran程序

一个生成碳纳米管坐标的fortran程序

     欧阳剑   2008 10月   ouyjian0426@163.com

 

在编写过程中,先是自己用作图软件coredraw画了一个二维蜂房结构图,在图书馆找了本一个叫成会明的人写的关于碳纳米管的书,了解了碳纳米管的一些结构参数的表示,在图上琢磨了一阵,写了这个程序,还发现没什么大错误.

!!!!!!!!!!!!以下是代码!!!!!!!!!!!!!!!!!!!!!!

!!!!运行前,创建一个名为 mn.in 的文件,用记事本打开,在里面输入mn,用空格隔开,保存.

!!!!运行得到的xyz.dat 文件就是碳纳米管中碳原子的坐标.可以用orign软件生成图形.

!!! 目前没有去考虑c-c键长

!!! 还有就是不知道怎么去把相邻的碳原子用线连起来.

 

program ouyjian’s carbon nanotubes

implicit none

integer:: m,n,ma,na,maa,naa

real:: mb,nb,lb2,lb

real::l2,l,cosa,cosb,cosc,la2,la,c2

integer::mt,nt,dr

integer::gcd,dmn

real::lt2,lt,angc,sinc,angd,za,xa,ya,r,pi,xaa,yaa,zaa

!ange is the angle between (mb,nb)and a1

!angf is the angle between (mb,nb)and (m,n)

real::ange,cose,cosf,xb,yb,zb,anga,sinf,angg

open (unit = 15, file='mn.in')

open (unit = 5, file='mn.out')

open (unit = 9,file='xyz.dat')

Read (15,*) m,n

!l is the distance of (m,n),and it's the tube's girth

l2=m*m+n*n+m*n

l=sqrt(l2)

pi = 3.1415926535

!r is rhe radious of the tube

r=l/(2*pi)

ma = 0

na = 0

zaa=0.0

xaa=0.0

yaa=0.0

 dmn = gcd(m,n)

 if(mod((m-n),3)==0) then

  dr = 3*dmn

 else

  dr = dmn

    endif

mt = (2*n+m)/dr  

nt = -(2*m+n)/dr

lt2 = mt*mt +nt*nt + mt*nt

lt = sqrt(lt2)

cosa=(2*m+n)/(2*l)

anga=acos(cosa)

 

ma_loop:do

ma = ma + 1

  na = nt - 1

  na_loop:do

  na = na + 1

!la is the distance of (ma,na)

la2=ma*ma+na*na+ma*na

la=sqrt(la2)

!c is the distance between (m,n)and (ma,na)

c2=(m-ma)*(m-ma)+(n-na)*(n-na)+(m-ma)*(n-na)

cosb=(2*ma+na)/(2*la)

!angc is the angle between (m,n) and (ma,na)

cosc=(la2+l2-c2)/(2*la*l)

angc=acos(cosc)

sinc=sin(angc)

za=la*sinc

angd=la*cosc*2*pi/l

xa=r*sin(angd)

ya=-r*cos(angd)

  if(za<=(lt+0.001).and.la*cosc<=l.and.cosc>=0) then

    if(na<=0) then

    maa = ma

    naa = na

    xaa = xa

    yaa = ya

    zaa = za

    mb = maa - 0.333333333

    nb = naa - 0.333333333

    lb2 = mb*mb + nb*nb + mb*nb

    lb = sqrt(lb2)

    cose = (2*mb+nb)/(2*lb)

    ange = acos(cose)

    if(nb<=0)then

    cosf = cos(anga+ange)

    sinf = sin(anga+ange)

    else

      cosf=cos(anga-ange)

      sinf=sin(anga-ange)

      endif

      angg = 2*pi*lb*cosf/l

      xb = r*sin(angg)

      yb = -r*cos(angg)

      zb = lb*sinf 

    write(5,*)ma,na

    write(5,*)mb,nb

    write(9,*) xaa,'       ',yaa,'      ',zaa

    write(9,*) xb,' ',yb,' ',zb,

    else if(na>0.and.cosc>=cosa.and.cosb>=cosa) then

    maa = ma

    naa = na

    xaa = la*cosc

    xaa = xa

    yaa = ya

    zaa = za

    mb = maa - 0.333333333

    nb = naa - 0.333333333

        lb2 = mb*mb + nb*nb + mb*nb

    lb = sqrt(lb2)

    cose = (2*mb+nb)/(2*lb)

    ange = acos(cose) 

    if(nb<=0)then

    cosf = cos(anga+ange)

    sinf = sin(anga+ange)

    else

      cosf=cos(anga-ange)

      sinf=sin(anga-ange)

      endif

     

      angg = 2*pi*lb*cosf/l

      xb = r*sin(angg)

      yb = -r*cos(angg)

      zb = lb*sinf

    write(5,*)ma,na

    write(5,*)mb,nb

    write(9,*) xaa,'       ',yaa,'      ',zaa

    write(9,*) xb,' ',yb,' ',zb,

     endif

   endif

  if ( na >= n) exit na_loop

 

if ( ma >= (mt + m + 1)) exit ma_loop

  end do na_loop

end do ma_loop

close(15)

close(5)

close(9)

 

end program ouyjian’s carbon nanotubes

 

 

integer function gcd(mm,nn) result(cd)

if (mm < nn)  then

   cc = mm; mm = nn; nn = cc

end if

i = 0

do while(i <= mm)

  i = i + 1

  if(mod(mm,i) == 0.and.mod(nn,i)==0) then

    cd = i

    end if

  end do

end function gcd

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值