Fortran Coder

查看: 22037|回复: 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 点
 楼主| 发表于 2020-5-10 22:10:23 | 显示全部楼层
数据比较简单,就是几列数,这几列数在不同的subroutine中会用到。
数据.png

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
 楼主| 发表于 2020-5-10 22:13:10 | 显示全部楼层
是做abaqus的二次开发

155

帖子

2

主题

1

精华

大师

Vim

F 币
944 元
贡献
461 点

规矩勋章

发表于 2020-5-11 07:27:39 | 显示全部楼层
common太不灵活了,用module,在需要调用的子程序里use 就可以共享变量

953

帖子

0

主题

0

精华

大师

F 币
180 元
贡献
73 点

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

QQ
发表于 2020-5-11 08:17:53 | 显示全部楼层

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
 楼主| 发表于 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中的数据呢?
再次感谢!

8

帖子

1

主题

0

精华

入门

F 币
47 元
贡献
23 点
 楼主| 发表于 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 点
 楼主| 发表于 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

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

发表于 2020-5-11 14:04:25 | 显示全部楼层
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。

953

帖子

0

主题

0

精华

大师

F 币
180 元
贡献
73 点

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

QQ
发表于 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可以只用来共享数据,也可以执行读取操作。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-3-29 03:54

Powered by Tencent X3.4

© 2013-2024 Tencent

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