2016-03-15 118 views
-2

我是fortran的新手,现在需要在fortran中生成所选行和列的点生成。代码如下(不完全):dot_product函数在fortran中出现“语法错误”

module parameters 
implicit none 
    REAL, PARAMETER  :: b = 0.99, d = 0.025, a = 0.36 
    REAL, PARAMETER  :: klb = 0.01, inc = 0.025, kub = 45.0 
    INTEGER, PARAMETER :: length_grid_k = (kub-klb)/inc + 1 
    INTEGER, PARAMETER :: length_z = 2 
    REAL , PARAMETER  :: toler = 1.e-4    ! Numerical tolerance 
    !REAL,DIMENSION(:,:), ALLOCATABLE :: P   ! Trasition matrix of technology process 
    !REAL,DIMENSION(:,:), ALLOCATABLE :: y 


end module 

! ============================================================================================ 
module global 
USE parameters 
implicit none ! change from determinstic case: value fun (value and value_new)is a k*z matrix now 
    REAL   :: Kgrid(length_grid_k), value(length_grid_k,length_z), g_k(length_grid_k,length_z) 
    REAL     :: vtmp(length_grid_k,length_grid_k), value_new(length_grid_k,length_z) 
end module 

! ============================================================================================ 

PROGRAM HW2Stochastic 
    REAL    :: total, etime, dist 
    REAL, DIMENSION(2)  :: elapsed 
    REAL, DIMENSION(2,2) :: P 
    REAL, DIMENSION(2) :: y ! all declarations have to precede all executable statements 
    P(1,:) = (/0.977, 0.023/) 
    P(2,:) = (/0.074, 0.926/) 
    y  = (/1.25, 0.2/) 


    call solution 

    total=etime(elapsed) 


    PRINT*,'--------------------------------------------------' 
    PRINT*,'total time elpased =',total 
    PRINT*,'--------------------------------------------------' 


END PROGRAM HW2Stochastic 

! ============================================================================================ 
subroutine solution 
USE parameters 
USE global 

    IMPLICIT NONE 

    INTEGER :: iter, index_k, index_z, index_kp 
    REAL :: diff, k, kp, c , z, y 

    INTEGER :: i = 1, l , m 


    do while (i<=length_grid_k) !do loop for assigning capital grid K 
    Kgrid(i) = klb + (i-1)*inc 
    !write(*,*) i, Kgrid(i) 
    i = i + 1 
    end do 


    iter = 1 
    diff = 1000.d0 
    ! value = 0.*Kgrid  !Initial Value guess 
    do l = 1, length_z ! Intial value guess in stochastic case, a matrix of zeros 
     do m = 1, length_grid_k 
     value (l,m) = 0 
     end do 
    end do  

    do while (diff>= toler) 

!------------------ 
! loop over k(t) 
!------------------ 

     do index_k = 1, length_grid_k    ! Capital grid 
      k = Kgrid(index_k) 
     vtmp(index_k,:) = -1.0e-16 ! initial matrix used to store value fun 


!---------------------------- 
! (new) loop over z(t) 
!---------------------------- 

     do index_z = 1, length_z  
      z = y(index_z) 

!------------------- 
! loop over k(t+1) 
!-------------------  
         do index_kp = 1, length_grid_k 
          kp = Kgrid(index_kp) 
          c = z*k**a+(1.-d)*k-kp ! add technology shock 

           if (c>0.) then 
          vtmp(index_k,index_kp) = log(c)+b*dot_product(P(index_z,:),value(:,index_kp)) ! potential bug, 

          endif 

          end do 

        value_new(index_k,index_z) = MAXVAL(vtmp(index_k,:)) !Determines the maximum value of the elements in an array value 
      g_k(index_k,index_z) = Kgrid(MAXLOC(vtmp(index_k,:),1)) !Collect policy function (but no use in this program) 

     end do 
    end do        ! returns the location of the first element in array having the maximum value (in this case, of each row) 

     diff = maxval(abs(value_new-value))/ABS(value_new(length_grid_k,length_z)) ! different from determinstic 
     value = value_new 


     print*, 'Iteration =',iter,'sup_norm =',diff 
       iter = iter+1 

    enddo 

    print *, ' ' 
    print *, 'Successfully converged with sup_norm ', diff 
     !print *, g_k 

    !CALL [email protected](d, Kgrid, g_k, length_grid_k) 


     open (UNIT=1,FILE='valuefun',STATUS='replace') 
    do index_k = 1, length_grid_k 
    do index_z = 1, length_z 
      WRITE(UNIT=1,FMT=*) value(index_k,index_z) 
    end do 
    end do 
    close (UNIT=1) 

end subroutine 

所以你可以看到P是(lengh_z,length_z)矩阵和value是(length_z,length_grid_k)的设计矩阵。 然而,使用gfortran 4.6.3,我得到了以下错误消息:

test.f90:101.84: 

        vtmp(index_k,index_kp) = log(c)+b*dot_product(P(index_z,:),v 

我Fortran编译器的版本是gcc-FORTRAN-4.7.2-1-的mingw32斌 错误:语法错误在(1)

enter image description here

+1

你已经发布*类似你的代码,*类似于*编译器产生的错误信息。准确地发布你的代码并发布完整的错误消息,你可能会有一些帮助的希望。 –

+0

扩展现有评论:“所以你可以看到'P'是一个(lengh_z,length_z)矩阵,'value'是一个(length_z,length_grid_k)矩阵......”。那么,不,我们不能看到,因为你没有提供声明。 –

+0

我已更正格式,因此错误消息不是以代码格式显示,谢谢@HighPerformanceMark。 – zlqs1985

回答

0

现在你已经告诉我们你的代码,正是编译器抱怨的问题是再明显参数列表。不知怎的,你的编译器是看到只有在发现错误的行的一部分,特别是部分:

   vtmp(index_k,index_kp) = log(c)+b*dot_product(P(index_z,:),v 

这不是有效的语法片段,因此错误。

很难说为什么编译器只读取行的前80个字符,因为您没有向我们展示如何编译它。但一个解决方案是对缩进不太热情,并将该行左移约16个字符。

另一种解决方案是告诉你的编译器需要更长的行 - 它的文档会告诉你如何。

我敢肯定这是一个重复的问题,但我现在没有时间去寻找原作。

而且,如前所述,严重的语法错误不是代码中唯一的错误,它只是提示错误消息的错误。

+0

好吧,我这次添加了屏幕截图。看起来编译器相信我在'dot_product'函数的末尾丢失了一个括号,我不这样做。它发生在第60个字符位置,明显不超过80个字符的阈值。我的fortran编译器的版本是gcc-fortran-4.7.2-1-mingw32-bin – zlqs1985