主题:一个编程思路/方法的讨论
最近师弟我在算rotation matrix elemetns相关的,其中有一条是closure的check。具体数学公式之类不详细解释,换成通俗语言问题是这样的:
文件A: 有160个数据,分别是x1(i),y1(i),z1(i)
文件B: 有160个数据,分别是x2(i),y2(i),z2(i)
经过简单运算,二文件数据之差是 x(i),y(i),z(i)
现有S=3(COS(X)^2-1)/2的计算公式,其中COS(X)^2是由x(i),y(i),z(i)运算得来。
现在写的程序是这样的:
program main implicit none integer i,j integer ios integer m,n character(160) :: filename1,filename2,filename3,filename4,tmp integer id integer n1,n2 real x1,y1,z1 real x2,y2,z2 real x(10000),y(10000),z(10000) real v1,v2,v3 real a,b,c real up,down,coss(10000),s1(10000),s2(10000),s3(10000),avg integer GetFileN,ii,jj character(len=10)::status print*, 'Running...' filename1='c6_' filename2='c8_' do m=1,1 ! number of files to read write(tmp,*)m open(10,file=trim(filename1)//trim(adjustl(tmp)) 1//'.dat',status='old' ) open(20,file=trim(filename2)//trim(adjustl(tmp)) 1//'.dat',status='old' ) do i=1,GetFileN(10) read(10,*,iostat=ios) n1,x1,y1,z1 !read c6 read(20,*,iostat=ios) n2,x2,y2,z2 !read c8 if (ios /=0) then exit endif x(i)=x2-x1 !c8-c6 x y(i)=y2-y1 !c8-c6 y z(i)=z2-z1 !c8-c6 z c print*,x(i),y(i),z(i) c write(30,'(3f12.5)')x(i),y(i),z(i) a=0 b=0 c=1 ! labframe up=(x(i)*a+y(i)*b+z(i)*c)*(x(i)*a+y(i)*b+z(i)*c) down=(x(i)*x(i)+y(i)*y(i)+z(i)*z(i))*(a*a+b*b+c*c) coss(i)=up/down ! cos(i)^2 c print*, coss(i) s1(i)=(3*coss(i)-1)/2 !n=0 d00 s2(i)=-sqrt(1.5)*sqrt(1-coss(i))*sqrt(coss(i)) ! n=1 d10 s3(i)=sqrt(0.375)*(1-coss(i)) !n=2 d20 c print*, s1(i) c print*, s2(i) c print*, s3(i) enddo enddo print*, 'Done.' close(10) close(20) end integer function GetFileN(iFileUnit) implicit none logical , parameter :: b = .True. integer , intent( IN ) :: iFileUnit character*(1) :: c GetFileN = 0 rewind( iFileUnit ) do while (b) read( iFileUnit , * ,end =999 ,Err = 999 )c GetFileN = GetFileN + 1 end Do 999 rewind( iFileUnit ) return end function GetFileN 请忽略n1和n2,不需要他们参与计算。并且对应A和B两种文件其实每种有上万个(所以用了的写法。其他s2和s3是另外两个需要计算的公式。trim(filename1)//trim(adjustl(tmp)) 1//'.dat')
因为最后需要对这个求出的s1,s2,s3值求平均,用现在的写法计算起来超!慢。我想请教各位师兄师姐有没有别的办法可以更快的计算,谢谢您的指教!