Fortran Coder

标题: fortran中‘:'在数组循环用的应用问题 [打印本页]

作者: aliouying    时间: 2014-3-1 11:11
标题: fortran中‘:'在数组循环用的应用问题
今天调试程序的时候发现一个非常有意思的问题,我的编译器是IVF2013 update1,平台是VS2012,系统win7 32bit

我把程序单独拿出来了,数据见文件。
程序如下:

[Fortran] 纯文本查看 复制代码
Program MemTest
Implicit None
Integer :: nEle, nNod
Integer, Allocatable    :: emap(:,:)
Integer, Allocatable    :: nEleIn(:),nodEle(:,:)
Integer :: i, j


Open( Unit = 11, File = 'in.dat' )
    Read(11,*) nEle, nNod
    allocate( emap(3,nEle) )
    Read(11,*) emap
Close( Unit = 11 )


    allocate( nEleIn( nNod ), nodEle( nNod,15) )
    nEleIn = 0
    nodEle = 0
!
! Loop all element
!
DO i = 1, nEle
    nelein(emap(:,i)) = nelein(emap(:,i)) + 1
    nodele(emap(:,i),nelein(emap(:,i)))   = i
EndDo

    Write(*,*) nEleIn(88)
    write(*,*) nodEle( 88, : )
   
   
! Anothe Method

! initial zeros
    nEleIn = 0
    nodEle = 0
DO i = 1, nEle
    ForAll( j = 1 : 3 )
        nelein(emap(j,i)) = nelein(emap(j,i)) + 1
        nodele(emap(j,i),nelein(emap(j,i)))   = i
    EndForAll
EndDo

    Write(*,*) nEleIn(88)
    write(*,*) nodEle( 88, : )
   
    !
    ! deallocate Memory
    !
    Deallocate( emap, nEleIn, nodEle )
   
    stop
End Program MemTest


输出结果为:


附件,输入数据文件:

out.jpg (23.78 KB, 下载次数: 937)

out.jpg

in.rar

3.27 KB, 下载次数: 2


作者: fcode    时间: 2014-3-1 11:21
没发现亮点啊
作者: aliouying    时间: 2014-3-1 11:48
好吧,其实是应该注意下矩阵的赋值的问题,很容易出错
作者: 楚香饭    时间: 2014-3-1 12:12
版主的新手帖,速度围观。

嗯数组下标来自于另一个数组的值,a(b(i)) 这种,特别需要额外注意。
作者: aliouying    时间: 2014-3-1 13:51
chuxf 发表于 2014-3-1 12:12
版主的新手帖,速度围观。

嗯数组下标来自于另一个数组的值,a(b(i)) 这种,特别需要额外注意。 ...

这种还算比较好,比如a(b),若a,b是一维数组,为了表征b是一维数组,可以写成a(b(:))
若a是二维数组,调用的时候a(b(1:3),b(1:3))实际是一个小矩阵的范围,而不是行和列都是a(b(1),b(1)),a(b(2),b(2)),a(b(3),b(3))

当然这些都是小问题,我只是举个例子,写顺手偷懒了容易出错。
作者: 楚香饭    时间: 2014-3-1 13:58
你的意思是说 a( b(1:3) , b(1:3) ) 实际有9个元素,而非 3 个,是吧?
作者: aliouying    时间: 2014-3-1 15:52
chuxf 发表于 2014-3-1 13:58
你的意思是说 a( b(1:3) , b(1:3) ) 实际有9个元素,而非 3 个,是吧?

必须啊




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