Fortran Coder

标题: csv数据读取并在subroutine中使用 [打印本页]

作者: cyzhang    时间: 2020-5-10 22:08
标题: csv数据读取并在subroutine中使用
求助大神,之前通过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   

作者: cyzhang    时间: 2020-5-10 22:10
数据比较简单,就是几列数,这几列数在不同的subroutine中会用到。

数据.png (14.88 KB, 下载次数: 381)

数据.png

作者: cyzhang    时间: 2020-5-10 22:13
是做abaqus的二次开发
作者: Transpose    时间: 2020-5-11 07:27
common太不灵活了,用module,在需要调用的子程序里use 就可以共享变量
作者: vvt    时间: 2020-5-11 08:17
详解  http://common.w.fcode.cn/
作者: cyzhang    时间: 2020-5-11 10:35
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中的数据呢?
再次感谢!
作者: cyzhang    时间: 2020-5-11 10:38
vvt 发表于 2020-5-11 08:17
详解  http://common.w.fcode.cn/

感谢您的回复!
能否请您帮忙看一下我的代码是否有语法错误?之前用common的方法,实现了读取txt的数据,并在两个subroutine中使用;这一次读取csv的数据后,使用common语句在另一个subroutine中却没有成功使用这些数据。
再次感谢!
作者: cyzhang    时间: 2020-5-11 11:24
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


作者: necrohan    时间: 2020-5-11 14:04
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。
作者: vvt    时间: 2020-5-11 19:28
cyzhang 发表于 2020-5-11 10:35
感谢您的回复!
我现在做的是abaqus这个软件的二次开发,只能对这些subroutine中的特定函数进行定义,即 ...

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

作者: vvt    时间: 2020-5-11 19:31
[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

作者: cyzhang    时间: 2020-5-18 15:41
necrohan 发表于 2020-5-11 14:04
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。

感谢!已经解决了!
作者: cyzhang    时间: 2020-5-18 15:42
vvt 发表于 2020-5-11 19:28
1. 没有program也可以使用module,并不影响。
2. module没有限制不能使用read操作。
3. 多个subroutine可 ...

谢谢您!已经解决了




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2