Fortran Coder

查看: 13355|回复: 5
打印 上一主题 下一主题

[文件读写] 输出求助

[复制链接]

23

帖子

9

主题

0

精华

熟手

F 币
134 元
贡献
82 点
跳转到指定楼层
楼主
发表于 2017-10-28 22:42:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现有10帧数据,1帧里143个数,每一帧都会得到m值并将其记录在(17,file='NUMH.txt') 中,现在问题是生成的这个文件是空的,单独抽出1帧计算是有输出的,不知问题在哪,望各位帮助,谢谢。
[Fortran] 纯文本查看 复制代码
     program analysis Hbond between ON and NN
      implicit none
      real(4)::N(16,3),O(24,3),H(63,3)
      real(4)::S(8,3),C(32,3)
      character::u
      real(4)::NX(16),NY(16),NZ(16)
      real(4)::OX(24),OY(24),OZ(24)
      real(4)::HX(63),HY(63),HZ(63)
      real(4)::RNO(384),RNH(1008)
      integer::i,j,k,nn,m   
c     open(17,file='NUMH.txt')  
      open(11,file='TRAJEC.xyz')      
     
      do i=1,10
        
          read(11,*)u
          read(11,*)u,u
          open(14,file='N.txt')
          do k=1,16
            read(11,*)u,N(k,:)
            write(14,*)'N',N(k,:)
          enddo
          close(14)
          do k=1,8
            read(11,*)u,S(k,:)
          enddo
          
          open(15,file='O.txt')
          do k=1,24
            read(11,*)u,O(k,:)
            write(15,*)'O',O(k,:)
          enddo
          close(15)
          do k=1,32
            read(11,*)u,C(k,:)
          enddo
          
          open(16,file='H.txt')
          nn=0
          do k=1,63
            nn=1+nn
            read(11,*)u,H(k,:)
            write(16,*)'H',nn,H(k,:)
          enddo
          close(16)
          call distin(NX,NY,NZ,OX,OY,OZ,HX,HY,HZ,nn,RNO,RNH,u,m)
          write(17,*)m
      enddo
      close(17)
      close(11)
      end
      
      subroutine distin(NX,NY,NZ,OX,OY,OZ,HX,HY,HZ,nn,RNO,RNH,u,m)
      implicit none
      real(4)::NX(16),NY(16),NZ(16)
      real(4)::OX(24),OY(24),OZ(24)
      real(4)::HX(63),HY(63),HZ(63)
      real(4)::nn(63),RNO(384),RNH(63)
      real(4)::THETA(63),COSYTHETA(63)
      real(4)::VNOX(63),VNOY(63),VNOZ(63)
      real(4)::VNHX(63),VNHY(63),VNHZ(63)
      character::u
      integer::i,j,k,m
      open(14,file='N.txt')
      open(15,file='O.txt')
      open(16,file='H.txt')
      open(17,file='NUMH.txt')
      
      do i=1,16
        read(14,*)u,NX(i),NY(i),NZ(i)
      enddo
      close(14)
      do i=1,24
        read(15,*)u,OX(i),OY(i),OZ(i)
      enddo      
      close(15)
      do i=1,63
        read(16,*)u,nn(i),HX(i),HY(i),HZ(i)
      enddo
      close(16)
      do i=1,16
        do j=1,24
          RNO(i)=sqrt((NX(i)-OX(j))**2+(NY(i)-OY(j))**2+
     X                    (NZ(i)-OZ(j))**2)
          if(RNO(i).lt.2.6) then
            do k=1,63
               m=0.d0+k
              RNH(k)=sqrt((NX(i)-HX(k))**2+(NY(i)-HY(k))**2+
     X                    (NZ(i)-HZ(k))**2)
              if(RNH(k).lt.1.4) then
              
              VNOX(k)=OX(j)-NX(i)
              VNOY(k)=OY(j)-NY(i)
              VNOZ(k)=OZ(j)-NZ(i)
              VNHX(k)=HX(k)-NX(i)
              VNHY(k)=HY(k)-NY(i)
              VNHZ(k)=HZ(k)-NZ(i)
              
              COSYTHETA(k)=(VNOX(k)*VNHX(k)+VNOY(k)*VNHY(k)+VNOZ(k)*VNHZ(k))/
     X                                   RNO(i)/RNH(k)
     
                 THETA(k)=ACOS(COSYTHETA(k))
                if(THETA(k).lt.0.5) then
                m=m
                    write(17,*)m
                endif
              endif
            enddo
          endif
        enddo
      enddo
      return
      end

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-10-29 10:14:03 | 只看该作者
你在主程序里 open(17,file='NUMH.txt') ,在子程序里就不需要Open了。
一般也不需要在子程序里write(17
否则你会输出2次。

23

帖子

9

主题

0

精华

熟手

F 币
134 元
贡献
82 点
板凳
 楼主| 发表于 2017-10-29 13:18:42 | 只看该作者
fcode 发表于 2017-10-29 10:14
你在主程序里 open(17,file='NUMH.txt') ,在子程序里就不需要Open了。
一般也不需要在子程序里write(17
否 ...

  多谢,我修改了下程序,现在问题是当不加l=1,10时,做单帧计算可以输出文件12,但是加上l=1,10时,文件12的大小是0bytes,不知是不是这行加的语法又问题,因为要分析的TRAJEC.xyz文件有10帧。多谢!
[Fortran] 纯文本查看 复制代码
      program analysis Hbond
      implicit none
      real(4)::NX(16),NY(16),NZ(16)
      real(4)::OX(24),OY(24),OZ(24)
      real(4)::HX(63),HY(63),HZ(63)
      real(4)::S(8,3),C(32,3)
      real(4)::RNO(384),RNH(63)
      real(4)::THETA(63),COSYTHETA(63)
      real(4)::VNOX(63),VNOY(63),VNOZ(63)
      real(4)::VNHX(63),VNHY(63),VNHZ(63)
      character::u
      integer::i,j,k,m,l
      open(11,file='TRAJEC.xyz')
      do l=1,10      
        read(11,*)u,u,u
        do j=1,16
          read(11,*)u,NX(j),NY(j),NZ(j)          
        enddo
        do j=1,8
          read(11,*)u,S(j,:)
        enddo
        do j=1,24
          read(11,*)u,OX(j),OY(j),OZ(j)
        enddo
        do j=1,32
          read(11,*)u,C(j,:)
        enddo
        do j=1,63
          read(11,*)u,HX(j),HY(j),HZ(j)
        enddo
        
        do i=1,16
          do j=1,24
            open(12,file='NUMH.txt')
            RNO(i)=sqrt((NX(i)-OX(j))**2+(NY(i)-OY(j))**2+
     X                    (NZ(i)-OZ(j))**2)
            if(RNO(i).lt.2.6) then
              do k=1,63
                 m=0.d0+k
                RNH(k)=sqrt((NX(i)-HX(k))**2+(NY(i)-HY(k))**2+
     X                    (NZ(i)-HZ(k))**2)
                if(RNH(k).lt.1.4) then
              
                VNOX(k)=OX(j)-NX(i)
                VNOY(k)=OY(j)-NY(i)
                VNOZ(k)=OZ(j)-NZ(i)
                VNHX(k)=HX(k)-NX(i)
                VNHY(k)=HY(k)-NY(i)
                VNHZ(k)=HZ(k)-NZ(i)
              
                COSYTHETA(k)=(VNOX(k)*VNHX(k)+VNOY(k)*VNHY(k)+VNOZ(k)*VNHZ(k))/
     X                                   RNO(i)/RNH(k)
     
                 THETA(k)=ACOS(COSYTHETA(k))
                  if(THETA(k).lt.0.5) then                    
                    write(12,*)l
                      write(12,*)k
                  endif
                endif
              enddo
            endif
          enddo
        enddo
      enddo
      end

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2017-10-29 14:16:07 | 只看该作者
open(12,file='NUMH.txt')
放到循环外面去,你要慎重考虑open语句的位置。

你需要知道这些事情:
1.文件打开之后,在关闭之前,不能再次打开。
2.文件关闭之后,重新打开,如果写入内容,默认会覆盖原有内容。

所以总体的习惯是,在需要文件之前,打开。然后陆陆续续写入。当不需要写入之后,再关闭。

很少需要把open写在循环里面,这种比较少(除非批量处理多个文件)。如果你确实需要这样,别忘了close

23

帖子

9

主题

0

精华

熟手

F 币
134 元
贡献
82 点
5#
 楼主| 发表于 2017-10-29 14:21:58 | 只看该作者
fcode 发表于 2017-10-29 14:16
open(12,file='NUMH.txt')
放到循环外面去,你要慎重考虑open语句的位置。

修改之后,文件12依然没有大小
[Fortran] 纯文本查看 复制代码
      program analysis Hbond
          implicit none
          real(4)::NX(16),NY(16),NZ(16)
          real(4)::OX(24),OY(24),OZ(24)
          real(4)::HX(63),HY(63),HZ(63)
          real(4)::S(8,3),C(32,3)
          real(4)::RNO(384),RNH(63)
          real(4)::THETA(63),COSYTHETA(63)
      real(4)::VNOX(63),VNOY(63),VNOZ(63)
          real(4)::VNHX(63),VNHY(63),VNHZ(63)
          character::u
          integer::i,j,k,m,l
          open(11,file='TRAJEC.xyz')
          open(12,file='NUMH.txt')
c          do l=1,10      
            read(11,*)u,u,u
                do j=1,16
                  read(11,*)u,NX(j),NY(j),NZ(j)                  
                enddo
                do j=1,8
                  read(11,*)u,S(j,:)
                enddo
                do j=1,24
                  read(11,*)u,OX(j),OY(j),OZ(j)
                enddo
                do j=1,32
                  read(11,*)u,C(j,:)
                enddo
            do j=1,63
              read(11,*)u,HX(j),HY(j),HZ(j)
            enddo
                
                do i=1,16
              do j=1,24
                    RNO(i)=sqrt((NX(i)-OX(j))**2+(NY(i)-OY(j))**2+
     X                            (NZ(i)-OZ(j))**2)
                if(RNO(i).lt.2.6) then
                      do k=1,63
                             m=0.d0+k
                            RNH(k)=sqrt((NX(i)-HX(k))**2+(NY(i)-HY(k))**2+
     X                            (NZ(i)-HZ(k))**2)
                    if(RNH(k).lt.1.4) then
                          
                            VNOX(k)=OX(j)-NX(i)
                            VNOY(k)=OY(j)-NY(i)
                            VNOZ(k)=OZ(j)-NZ(i)
                            VNHX(k)=HX(k)-NX(i)
                            VNHY(k)=HY(k)-NY(i)
                            VNHZ(k)=HZ(k)-NZ(i)
                          
                            COSYTHETA(k)=(VNOX(k)*VNHX(k)+VNOY(k)*VNHY(k)+VNOZ(k)*VNHZ(k))/
     X                                                   RNO(i)/RNH(k)
         
                             THETA(k)=ACOS(COSYTHETA(k))
                      if(THETA(k).lt.0.5) then                                                      
                                        write(12,*)l
                                      write(12,*)k
                                  endif
                            endif
                          enddo
                    endif
                  enddo
            enddo
c          enddo
          end

a.xyz

6.45 KB, 下载次数: 1

TRAJEC.xyz

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2017-10-29 14:43:07 | 只看该作者
有呀,我得到结果
           1
           2
           1
          15
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 12:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表