tommao 发表于 2019-12-30 16:22:50

求帮助!PSCAD仿真运行错误,但是应该是Fortran上的语法错误

本人在做PSCAD(电力仿真软件)模型的仿真,元件程序用的是fortran语言,这里是一个排序的程序,但是初学fortran,出现了一些语法错误,希望大佬们指点
   
      #STORAGE INTEGER:$(DimIdx)+1
      REAL allocatable::frr(:)
这里就是想声明一个动态数组,其实我也不知道是不是该用动态数组,数组的大小是随输入参数变的
      #LOCAL INTEGER i,j,k,mystore,in_last
      allocate(frr($DimIdx))
这里就是分配动态数组的空间,$DimIdx在PSCAD里就是输入的参数
       mystore=NSTORI
PSCAD用STORI存储序列,NSTORI就是这个序列的序号而已
      in_last=STORI(mystore)   
将上一仿真步长的输入(一个整数)给变量in_last
       IF ($In>STORI(mystore))THEN
      j=0
      k=$DimIdx-STORI(mystore)
       DO i=1,$DimIdx
      IF(STORI(mystore+i) .EQ. 0)THEN
         frr(j)=$Vcap(i)
         j=j+1
      ELSE
          frr(k)=$Vcap(i)
          k=k+1
      ENDIF
       END DO
根据存储序列中第2到$DimIdx+1个数的值(上一仿真步长的触发信号,不是0就是1)将输入的数组重新排列(上一周期是触发信号是0的放在一起,是1的放在一起)
      IF ($Iac>=0)THEN
         CALL idcdd_sort(frr,$DimIdx,$DimIdx-STORI(mystore)-1,$In-STORI(mystore),$Indx)
      ELSE
         CALL ixcdd_sort(frr,$DimIdx,$DimIdx-STORI(mystore)-1,$In-STORI(mystore),$Indx)
      ENDIF
这里就是调用C函数了,C函数都已经在文件里写好了,下面的elseif 和else 与之前的相似,不再做过多说明

       ELSEIF ($In .EQ. STORI(mystore)) THEN
      j=0
      k=$DimIdx-STORI(mystore)
       DO i=1,$DimIdx
         IF(STORI(mystore+i) .EQ. 0)THEN
          frr(j)=$Vcap(i)
          j=j+1
         ELSE
          frr(k)=$Vcap(i)
          k=k+1
         ENDIF
       END DO
         IF ($Iac>=0)THEN
         CALL idcde_sort(frr,$DimIdx,$DimIdx-STORI(mystore)-1,$Indx)
         ELSE
         CALL ixcde_sort(frr,$DimIdx,$DimIdx-STORI(mystore)-1,$Indx)
         ENDIF

      ELSE
      j=0
      k=STORI(mystore)
      DO i=1,$DimIdx
         IF(STORI(mystore+i) .EQ. 1)THEN
          frr(j)=$Vcap(i)
          j=j+1
         ELSE
          frr(k)=$Vcap(i)
          k=k+1
         ENDIF
      END DO
      IF ($Iac>=0)THEN
      CALL idcdx_sort(frr,$DimIdx,STORI(mystore)-1,STORI(mystore)-$In,$Indx)
      ELSE
      CALL ixcdx_sort(frr,$DimIdx,STORI(mystore)-1,STORI(mystore)-$In,$Indx)
      ENDIF

      ENDIF
      NSTORI = NSTORI+1+$DimIdx
      #LOCAL INTEGER Ki
      DO Ki=1,$DimIdx
       STORI(mystore+Ki) = $Indx(Ki)
      END DO
这里是将此时的触发序列存入存储序列,供下一仿真步长使用
      STORI(mystore) = $In
这里是将此时的输入存入存储序列
运行出现了以下错误
Description
REAL allocatable::frr(:)
Error: Syntax error in data declaration at (1)

Description
Ammc.f:893.18:
allocate(frr(200))
Error: Syntax error in ALLOCATE statement at (1)

Description
Ammc.f:901.22:
frr(j)=VcB(i)
Error: Unexpected STATEMENT FUNCTION statement at (1)


问题总结:1是否要用动态数组?
2我的数组声明语句是不是错了,怎么改
3还有其他什么错误
大佬们,帮我解决一下,万分感谢!!!

necrohan 发表于 2019-12-31 09:17:53

如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号

tommao 发表于 2019-12-31 11:25:52

necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

好的,很有帮助,感谢

tommao 发表于 2019-12-31 12:45:33

necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

还有个问题,我加上了逗号,出现了以下问题翻译过来是
描述分析器:在->REAL,allocatable::frr中参数太少


necrohan 发表于 2019-12-31 16:02:37

本帖最后由 necrohan 于 2019-12-31 16:08 编辑

tommao 发表于 2019-12-31 12:45
还有个问题,我加上了逗号,出现了以下问题翻译过来是
描述分析器:在->REAL,allocatable::frr中参数 ...
REAL,allocatable::frr(:)
allocate(frr(10))
deallocate(frr)
end
我对你这个编译器不熟悉。
你编译一下上面的程序试试,我用IVF能通过。

tommao 发表于 2019-12-31 17:08:03

necrohan 发表于 2019-12-31 16:02
REAL,allocatable::frr(:)
allocate(frr(10))
deallocate(frr)


那就是没问题了,感谢
页: [1]
查看完整版本: 求帮助!PSCAD仿真运行错误,但是应该是Fortran上的语法错误