Fortran Coder

查看: 22748|回复: 12
打印 上一主题 下一主题

[文件读写] csv数据读取并在subroutine中使用

[复制链接]

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
跳转到指定楼层
楼主
发表于 2020-5-10 22:08:52 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
求助大神,之前通过common语句可以实现文件读取后数据在不同的subroutine中使用,在编写新的子程序的时候发现数据传递不成功了?
请问是代码出了问题吗?请问有没有更好的办法可以实现在一个subroutine中读取数据后,在另一个subroutine中直接调用呢?感谢!

[Fortran] 纯文本查看 复制代码
      SUBROUTINE UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2)
C     
      integer, parameter :: n = 24 
      real :: SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
      common SPZFS,QW,FS,TDL,BDL,LDL
      integer :: i                                                    !计数器            
      if( LOP .eq. 0) then
C     读数据      
          open(107,file='D:\Desktop\read\weatherdata.csv',status='old')
              do i=1,n
               read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
              end do
          close(107)
      end if     
      RETURN
      END      
      
      
      SUBROUTINE DFLUX(FLUX,SOL,KSTEP,KINC,TIME,NOEL,NPT,COORDS,
     1 JLTYP,TEMP,PRESS,SNAME)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION FLUX(2), TIME(2), COORDS(3)
      CHARACTER*80 SNAME 
      
      integer, parameter :: n = 24 
      real :: SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
      common SPZFS,QW,FS,TDL,BDL,LDL    
      
      IF (SNAME .EQ. 'ASSEMBLY_SURF-4') THEN              
          flux(1)=0.5*SPZFS(KINC+1)
      END IF                
      
      RETURN
      END    
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
13#
 楼主| 发表于 2020-5-18 15:42:20 | 只看该作者
vvt 发表于 2020-5-11 19:28
1. 没有program也可以使用module,并不影响。
2. module没有限制不能使用read操作。
3. 多个subroutine可 ...

谢谢您!已经解决了

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
12#
 楼主| 发表于 2020-5-18 15:41:20 | 只看该作者
necrohan 发表于 2020-5-11 14:04
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。

感谢!已经解决了!

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
11#
发表于 2020-5-11 19:31:28 | 只看该作者
[Fortran] 纯文本查看 复制代码
Module var_mod
  integer, parameter ::n = 24
  real SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
End Module var_mod

subroutine test
  use var_mod
  implicit none
  integer ::i
  open(107,file='D:\Desktop\read\weatherdata.csv',status='old')
  do i=1,n
    read(107,*) SPZFS(i),QW(i),FS(i),TDL(i),BDL(i),LDL(i)
  end do
  close(107)
end subroutine test


program main
  use var_mod
  implicit none
  call test
  write(*,*)SPZFS(n)
end

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
10#
发表于 2020-5-11 19:28:38 | 只看该作者
cyzhang 发表于 2020-5-11 10:35
感谢您的回复!
我现在做的是abaqus这个软件的二次开发,只能对这些subroutine中的特定函数进行定义,即 ...

1. 没有program也可以使用module,并不影响。
2. module没有限制不能使用read操作。
3. 多个subroutine可以 use 同一个module,或者不同module,都可以。
4. module可以只用来共享数据,也可以执行读取操作。

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

9#
发表于 2020-5-11 14:04:25 | 只看该作者
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
8#
 楼主| 发表于 2020-5-11 11:24:26 | 只看该作者
vvt 发表于 2020-5-11 08:17
详解  http://common.w.fcode.cn/

您好!我参考http://bbs.fcode.cn/thread-1878-1-2.html 这个帖子中fcode大神的回复写了如下的代码,希望实现subroutine中读取如2楼中所示的数据,在program中调用其第一列数据,但是运行后结果是 1.58329436E+32 ,不知问题出在哪里,您能否给指点一二?

[Fortran] 纯文本查看 复制代码
subroutine test
    implicit none
    integer, parameter ::n = 24
    real SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
    integer ::i
        open(107,file='D:\Desktop\read\weatherdata.csv',status='old')
        do i=1,n
        read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
        end do
        close(107)
end subroutine test


program main
    implicit none
    integer, parameter ::n = 24
    real SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
    call test
    write(*,*)SPZFS(n)
end

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
7#
 楼主| 发表于 2020-5-11 10:38:13 | 只看该作者
vvt 发表于 2020-5-11 08:17
详解  http://common.w.fcode.cn/

感谢您的回复!
能否请您帮忙看一下我的代码是否有语法错误?之前用common的方法,实现了读取txt的数据,并在两个subroutine中使用;这一次读取csv的数据后,使用common语句在另一个subroutine中却没有成功使用这些数据。
再次感谢!

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
6#
 楼主| 发表于 2020-5-11 10:35:38 | 只看该作者
Transpose 发表于 2020-5-11 07:27
common太不灵活了,用module,在需要调用的子程序里use 就可以共享变量

感谢您的回复!
我现在做的是abaqus这个软件的二次开发,只能对这些subroutine中的特定函数进行定义,即没有program,只有若干单独的subroutine,计算时在软件中勾选上该文件即可在计算中调用,实现二次开发。
所以,如果想用module的话,我必须写在subroutine中,但好像module中不能进行read操作。
请问:1.我可以在一个subroutine中使用module,然后在另一个subroutine中调用这个module吗?
2.如果1可行,那么我如何在subroutine的module中实现读取csv中的数据呢?
再次感谢!

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
5#
发表于 2020-5-11 08:17:53 | 只看该作者
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 22:20

Powered by Tencent X3.4

© 2013-2024 Tencent

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