|
|
【答案】应助回帖
要使用全局变量,在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 |
|