Fortran Coder

查看: 13466|回复: 5
打印 上一主题 下一主题

[流程控制] 求帮助!PSCAD仿真运行错误,但是应该是Fortran上的语法错误

[复制链接]

4

帖子

1

主题

0

精华

入门

F 币
37 元
贡献
18 点
跳转到指定楼层
楼主
发表于 2019-12-30 16:22:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本人在做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还有其他什么错误
大佬们,帮我解决一下,万分感谢!!!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

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

4

帖子

1

主题

0

精华

入门

F 币
37 元
贡献
18 点
板凳
 楼主| 发表于 2019-12-31 11:25:52 | 只看该作者
necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

好的,很有帮助,感谢

4

帖子

1

主题

0

精华

入门

F 币
37 元
贡献
18 点
地板
 楼主| 发表于 2019-12-31 12:45:33 | 只看该作者
necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

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


250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

5#
发表于 2019-12-31 16:02:37 | 只看该作者
本帖最后由 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能通过。

4

帖子

1

主题

0

精华

入门

F 币
37 元
贡献
18 点
6#
 楼主| 发表于 2019-12-31 17:08:03 | 只看该作者
necrohan 发表于 2019-12-31 16:02
[mw_shl_code=fortran,true]REAL,allocatable::frr(:)
allocate(frr(10))
deallocate(frr)

那就是没问题了,感谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 23:16

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表