Fortran Coder

csv数据读取并在subroutine中使用

查看数: 22140 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-5-10 22:08

正文摘要:

求助大神,之前通过common语句可以实现文件读取后数据在不同的subroutine中使用,在编写新的子程序的时候发现数据传递不成功了? 请问是代码出了问题吗?请问有没有更好的办法可以实现在一个subroutine中读取数据后 ...

回复

cyzhang 发表于 2020-5-18 15:42:20
vvt 发表于 2020-5-11 19:28
1. 没有program也可以使用module,并不影响。
2. module没有限制不能使用read操作。
3. 多个subroutine可 ...

谢谢您!已经解决了
cyzhang 发表于 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。

感谢!已经解决了!
vvt 发表于 2020-5-11 19:31:28
[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    
vvt 发表于 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可以只用来共享数据,也可以执行读取操作。
necrohan 发表于 2020-5-11 14:04:25
read(107,*) SPZFS(n),QW(n),FS(n),TDL(n),BDL(n),LDL(n)
把这里的n都改成i。
cyzhang 发表于 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] 纯文本查看 复制代码
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-11 10:38:13
vvt 发表于 2020-5-11 08:17
详解  http://common.w.fcode.cn/

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

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

GMT+8, 2024-5-9 11:36

Powered by Tencent X3.4

© 2013-2024 Tencent

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