fortran中的dot_product函数“语法错误”,能帮我看一下吗?

新手上路,请多包涵

我是Fortran的初学者,想写一个随机bellman方程,拿别人的一个code改了一下,代码如下(比较长)

============================================================================================
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

    
end subroutine

P 是一个(length_z, length_z) 的矩阵,value是一个(length_z, length_grid_k)的矩阵
现在问题是里面的一个向量乘法函数 dot_product 报错,错误信息是
“snytax error in argument list ”
指向dot_product函数的第一个参数: P(index_z,:),我不知道我的写法哪里有问题?
有Fortran用的熟的同学帮我看看,多谢
fortran

阅读 5.6k
2 个回答

估计没有人回答

你的子程序里面都没定义P啊,也没写Implicit none,默认是个单变量,你当数组使用肯定报错的
Implicit none 是个好习惯,建议养成

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进