Fortran Coder

标题: 求帮助!PSCAD仿真运行错误,但是应该是Fortran上的语法错误 [打印本页]

作者: tommao    时间: 2019-12-30 16:22
标题: 求帮助!PSCAD仿真运行错误,但是应该是Fortran上的语法错误
本人在做PSCAD(电力仿真软件)模型的仿真,元件程序用的是fortran语言,这里是一个排序的程序,但是初学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
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号
作者: tommao    时间: 2019-12-31 11:25
necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

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

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



作者: necrohan    时间: 2019-12-31 16:02
本帖最后由 necrohan 于 2019-12-31 16:08 编辑
tommao 发表于 2019-12-31 12:45
还有个问题,我加上了逗号,出现了以下问题翻译过来是
描述分析器:在->REAL,allocatable::frr中参数 ...

[Fortran] 纯文本查看 复制代码
REAL,allocatable::frr(:)
allocate(frr(10))
deallocate(frr)
end

我对你这个编译器不熟悉。
你编译一下上面的程序试试,我用IVF能通过。
作者: tommao    时间: 2019-12-31 17:08
necrohan 发表于 2019-12-31 16:02
[mw_shl_code=fortran,true]REAL,allocatable::frr(:)
allocate(frr(10))
deallocate(frr)

那就是没问题了,感谢




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