Fortran Coder

查看: 16863|回复: 10
打印 上一主题 下一主题

[文件读写] 做动力学结束后产生的文件读取问题

 关闭 [复制链接]

40

帖子

11

主题

0

精华

大宗师

F 币
4125 元
贡献
1857 点

规矩勋章

QQ
跳转到指定楼层
楼主
发表于 2016-3-5 10:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做分子动力学结束后会产生一个文件,本人想把其中有用的信息提取出,但是代码编完后只读取了其中的一个模块,后面的部分并没有读入进去,求助大家,是什么地方出了问题?
[Fortran] 纯文本查看 复制代码
    program readdata
    implicit none
    character(len=15)::str
    real*8,allocatable::time(:),kinet(:),inter(:),temp(:),dipole(:), &
    totenergy(:),poten(:),k(:),pressure(:),rd(:),density(:)
    integer::ierr,count,i,j
    open(10,file='mdstat.txt',status='old')
    open(11,file='mdstat.tem',status='unknown')
    count=1
    do
        read(10,"(a15)",iostat=ierr) str
        if(ierr/=0) exit
        if (str=='Simulation Time') then
            count=count+1
        end if
    end do
    allocate(time(count))
    allocate(kinet(count))
    allocate(inter(count))
    allocate(temp(count))
    allocate(dipole(count))
    allocate(totenergy(count))
    allocate(poten(count))
    allocate(pressure(count))
    allocate(density(count))
    allocate(k(count))
    allocate(rd(count))
    rewind(10)

    do i=1,count
        do j=1,3
            read(10,*)
        end do
        read(10,200) time(i)
        read(10,200) totenergy(i)
        read(10,200) poten(i)
        read(10,200) kinet(i)
        read(10,200) inter(i)
        read(10,200) temp(i)
        read(10,200) pressure(i)
        read(10,200) density(i)
        read(10,200) dipole(i)
        !	if(dipole(i).gt.32.0)then
        !	dipole(i)=dipole(i)-4.0
        !	endif
        !	if(dipole(i).lt.16.0)then
        !	dipole(i)=dipole(i)+4.0
        !	endif
    end do
200 format(22x,f14.4)
    do i=1,count
        write(11,"(3x,9f14.4)") time(i),totenergy(i),poten(i),kinet(i),&
        inter(i), temp(i),pressure(i),density(i),dipole(i)
    end do
    end program readdata

mdstat.txt

625.98 KB, 下载次数: 11

读取的文件

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
where is dream,where is home

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2016-3-5 18:27:43 | 只看该作者
你这种数据结构,用派生类型会比较方便。

以下代码,你的问题我都在注释里说明了

[Fortran] 纯文本查看 复制代码
Program Readdata
  Implicit None
  Character (Len=64) :: str ! //修改为64
  Type :: OneRec
    Real (Kind=8) :: time, totenergy, poten, kinet, inter, temp
    Real (Kind=8) :: pressure, density, dipole
  End Type OneRec
  Integer :: ierr, count, i
  Type (OneRec), Allocatable :: myrec(:)
  Open (10, File='mdstat.txt', Status='old')
  Open (11, File='mdstat.tem', Status='unknown')
  count = 0 !// 初值为 0
  Do
    Read (10, '(a16)', Iostat=ierr) str ! //修改为16
    If (ierr/=0) Exit
    If (str(1:16)==' Simulation Time') count = count + 1 ! //前面加个空格
  End Do
  Allocate (myrec(count))
  Rewind (10)
  i = 1
  Do
    Read (10, '(a64)', Iostat=ierr) str
    If (ierr/=0) Exit
    If (str(1:16)==' Simulation Time') Then
      Read (str(22:), *) myrec(i)%time
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%totenergy
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%poten
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%kinet
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%inter
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%temp
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%pressure
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%density
      Read (10, '(a64)', Iostat=ierr) str
      Read (str(22:), *) myrec(i)%dipole
      i = i + 1
    End If
  End Do
  Do i = 1, count
    Write (11, '(3x,9f14.4)') myrec(i)
  End Do
End Program Readdata

40

帖子

11

主题

0

精华

大宗师

F 币
4125 元
贡献
1857 点

规矩勋章

QQ
板凳
 楼主| 发表于 2016-3-5 20:23:14 | 只看该作者
谢谢老大,我这编程经验还是太少了,虽然现在已经基本掌握了规则,可是编的程序感觉还是比较繁琐,不过老大的好,我再慢慢积累吧以及多读一读优秀的代码。谢谢老大
where is dream,where is home

29

帖子

3

主题

0

精华

熟手

F 币
214 元
贡献
112 点
地板
发表于 2016-3-30 12:56:47 | 只看该作者
涨姿势了
回复

使用道具 举报

40

帖子

11

主题

0

精华

大宗师

F 币
4125 元
贡献
1857 点

规矩勋章

QQ
5#
 楼主| 发表于 2016-3-31 09:48:22 | 只看该作者

当然,老大的方法总是很好,想达到他的境界得常看书,常写码。
where is dream,where is home

29

帖子

3

主题

0

精华

熟手

F 币
214 元
贡献
112 点
6#
发表于 2016-4-1 11:55:57 | 只看该作者
呵呵,大哥所言极是!

40

帖子

11

主题

0

精华

大宗师

F 币
4125 元
贡献
1857 点

规矩勋章

QQ
7#
 楼主| 发表于 2016-4-2 09:52:20 | 只看该作者
深流水静水流深 发表于 2016-4-1 11:55
呵呵,大哥所言极是!

O(∩_∩)O~天天升群旗,唱群歌~守护群
where is dream,where is home

29

帖子

3

主题

0

精华

熟手

F 币
214 元
贡献
112 点
8#
发表于 2016-4-2 22:10:33 | 只看该作者
天天升群旗,唱群歌~守护群

40

帖子

11

主题

0

精华

大宗师

F 币
4125 元
贡献
1857 点

规矩勋章

QQ
9#
 楼主| 发表于 2016-4-3 08:37:40 | 只看该作者
深流水静水流深 发表于 2016-4-2 22:10
天天升群旗,唱群歌~守护群

赞,大赞,超赞
where is dream,where is home

29

帖子

3

主题

0

精华

熟手

F 币
214 元
贡献
112 点
受到警告 10#
发表于 2016-4-4 16:26:42 | 只看该作者
呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-3 17:40

Powered by Tencent X3.4

© 2013-2024 Tencent

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