24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1376  |  回复: 14

superhugo

木虫 (正式写手)

【答案】应助回帖

引用回帖:
8楼: Originally posted by huruiusst at 2012-05-15 14:02:37:
请问动态数组怎么定义为全局变量?

试试将数组定义修改为如下格式看看。我曾经也遇到过和你一样的情况。
real,allocatable:: TE(:,

allocate(TE(100,5000))
11楼2012-05-15 15:37:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huruiusst

木虫 (小有名气)

引用回帖:
11楼: Originally posted by superhugo at 2012-05-15 15:37:56:
试试将数组定义修改为如下格式看看。我曾经也遇到过和你一样的情况。
real,allocatable:: TE(:,

allocate(TE(100,5000))

但是将动态数组放入全局变量commn当中,编译就出错了?
SLS,MD,HRSG
12楼2012-05-15 15:51:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huruiusst

木虫 (小有名气)

引用回帖:
10楼: Originally posted by Carpathia at 2012-05-15 15:04:19:
编译选项用/heep-arrays

你说的不是很清楚,能否具体点,我用的是CVF 6
SLS,MD,HRSG
13楼2012-05-15 15:53:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

superhugo

木虫 (正式写手)

【答案】应助回帖

引用回帖:
12楼: Originally posted by huruiusst at 2012-05-15 15:51:42:
但是将动态数组放入全局变量commn当中,编译就出错了?

要使用全局变量,在FORTRAN90和VF6.5中只需在MODULE中定义好,在使用到这些变量的主/子程序中只需USE 该MODULE名即可,在任何一个程序中改变了变量的值,那么在任何一处该变量的值就发生了改变,程序调用中无需传递参数或返回参数值。而局部变量则只在子程序中定义,子程序结束该变量也就无效了。  
要定义动态数组的话,只需在MODULE中定义迟型数组(只知道数组维数不知道大小),而后在程序中USE 该MODULE名,再给该数组分配空间,实现动态数组的定义。在传统有限元编程中,使用两个预先定义好的整型数组和实型数组,确定实际内存空间需要后还要去检查内存需要是否大于预定义数组大小,没有使用动态分配数组方便。  
示例程序(有限元网格信息的获取部分)如下:  
MODULE DATA_MODULE  
  
INTEGER, POINTER :: EL_NODE(:, ! 单元组成节点  
REAL, POINTER :: ND_XY(:, ) ! 节点坐标  
  
   ......  
  
END MODULE  
  
PROGRAM MAIN  
  
  USE DATA_MODULE  
        
  CALL INFO_MESH()  ! 获取有限元网格信息  
  
   ......  
  
END   
  
SUBROUTINE INFO_MESH()  
  
    USE DATA_MODULE  
  
   ! 确定节点、单元总数  
    CALL NUM_ND_EL()   
    ! 分配单元组成节点、节点坐标数组空间  
    ALLOCATE (EL_NODE(3, NELEM), ND_XY(2, NNODE))   
    ! 获得节点坐标、单元组成节点信息  
    CALL INFO_ND_EL()   
   
END  
  
SUBROUTINE NUM_ND_EL()  
  
   USE DATA_MODULE  
  
   ! 顺序读取节点坐标文件,确定总节点数NNODE  
   OPEN (10, DEFAULTFILE='D:/TEST DATA', FILE='NODE1.DAT', ACCESS='SEQUENTIAL', STATUS='OLD', IOSTAT=IV)  
   NNODE=0  
   1 READ (10, FMT=*, END=2, IOSTAT=IV)  
   ! 在此没有读入数据,每执行READ语句一次,文件指针下移一条记录位置,直至文件结束  
   NNODE=NNODE+1  
   GOTO 1  
   2 CLOSE(10)  
  
   ! 顺序读取单元节点文件,确定总单元数NELEM  
   100 OPEN (12, DEFAULTFILE='D:/TEST DATA', FILE='ELEMENT1.DAT', ACCESS='SEQUENTIAL', STATUS='OLD', IOSTAT=IV)  
    NELEM=0  
   3 READ (12, FMT=*, END=4, IOSTAT=IV)  
    NELEM=NELEM+1  
    GOTO 3  
    4 CLOSE(12)  
  
END  
  
SUBROUTINE INFO_ND_EL()  
  
  USE DATA_MODULE  
  
  OPEN (10, DEFAULTFILE='D:/TEST DATA', FILE='NODE1.DAT', ACCESS='SEQUENTIAL', STATUS='OLD', IOSTAT=IV)  
  READ (10, FMT="(I12, 2F12.5)", IOSTAT=IV) (K, (ND_XY(I, J), I=1, 2), J=1, NNODE) ! NNODE为总节点数  
  
  OPEN (12, DEFAULTFILE='D:/TEST DATA', FILE='ELEMENT1.DAT', ACCESS='SEQUENTIAL', STATUS='OLD', IOSTAT=IV)  
  READ (12, FMT="(4I8)", IOSTAT=IV) (K, (EL_NODE(I, J), I=1, 3), J=1, NELEM) ! NELEM为总单元数  
  
END

参考:http://www.baisi.net/thread-767035-1-1.html

» 本帖已获得的红花(最新10朵)

14楼2012-05-15 17:16:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huruiusst

木虫 (小有名气)

送鲜花一朵
引用回帖:
14楼: Originally posted by superhugo at 2012-05-15 17:16:29:
要使用全局变量,在FORTRAN90和VF6.5中只需在MODULE中定义好,在使用到这些变量的主/子程序中只需USE 该MODULE名即可,在任何一个程序中改变了变量的值,那么在任何一处该变量的值就发生了改变,程序调用中无需传 ...

感谢
SLS,MD,HRSG
15楼2012-05-17 13:55:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 huruiusst 的主题更新
信息提示
请填处理意见