Fortran Coder

标题: R不能设置成动态数组 [打印本页]

作者: FLY    时间: 2014-7-22 11:43
标题: R不能设置成动态数组
本帖最后由 FLY 于 2014-7-22 14:09 编辑

[Fortran] 纯文本查看 复制代码
do i=1,200,1
         R(1,1)=sqrt(dot_product(A(:,1),A(:,1)))!用Gram_Schmidt分解求QR分解
         Q(:,1)=A(:,1)/R(1,1)
         do k=2,N,1
            forall(j=1:k-1) R(j,k)=dot_product(Q(:,j),A(:,k))   
            Temp=A(:,k)
            do j=1,k-1!此处使用Forall会产生一个警告
               Temp=Temp-Q(:,j)*R(j,k)
            end do   
            R(k,k)=sqrt(dot_product(Temp,Temp))
            Q(:,k)=Temp/R(k,k)
         end do
        A=matmul(R,Q)!分解完成,开始迭代
end do

给位,上面的一段程序中,不知为何R不能设置成动态数组,我用的最新的IVF编译器。QA都可以设置成动态数组。
事实上,当把R设置成动态数组后,也不会报错,但是计算的结果是不对的。(注:这段程序是用来求解全部的特征值)
求指点。。。


解决了,谢谢围观朋友。特别感谢五楼。我fortran用的时间不长,我以前一直用的VB,搞混了。VB变量不用初始化,默认为0,而FORTRAN需要。

作者: vvt    时间: 2014-7-22 11:52
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。
作者: FLY    时间: 2014-7-22 12:21
vvt 发表于 2014-7-22 11:52
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。 ...

前面都是最基本的声明部分
[Fortran] 纯文本查看 复制代码
implicit none
      real::P_reaArr_A(:,:),EigenValue(:)
      real::R(N,N)
      real,allocatable::A(:,:),Q(:,:),Temp(:)
      real::Err,ds
      integer::i,j,k,N,Error
      Err=1E-6
      N=size(P_reaArr_A,1)
      allocate(A(N,N),stat=Error)
      allocate(Q(N,N),stat=Error)
      !allocate(R(N,N),stat=Error)
      !write(*,*) Error
      allocate(Temp(N),stat=Error)
      A=P_reaArr_A



作者: FLY    时间: 2014-7-22 12:23
vvt 发表于 2014-7-22 11:52
建议你给全代码。或者稍微全一些的代码。最好是给两种:一种是固定大小,一种是动态数组。 ...

你看我的声明部分,按理说A,Q,Temp能运行,那么R也能啊,但是如果R是动态数组,那么计算结果是错的
作者: fcode    时间: 2014-7-22 12:53
因为你的代码不全,无法帮你跑启动动态调试,只能看代码猜。

你试试 R 分配以后,令 R = 0.0 试试。再把 forall 改为 Do 循环试试。
作者: FLY    时间: 2014-7-22 14:07
fcode 发表于 2014-7-22 12:53
因为你的代码不全,无法帮你跑启动动态调试,只能看代码猜。

你试试 R 分配以后,令 R = 0.0 试试。再把 f ...

谢谢,果然如你所说,应该初始化一下




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