Fortran Coder

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

查看数: 12986 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-12-30 16:22

正文摘要:

本人在做PSCAD(电力仿真软件)模型的仿真,元件程序用的是fortran语言,这里是一个排序的程序,但是初学fortran,出现了一些语法错误,希望大佬们指点 [Fortran] 纯文本查看 复制代码       &nb ...

回复

tommao 发表于 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)

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

[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
这里是将此时的输入存入存储序列

我对你这个编译器不熟悉。
你编译一下上面的程序试试,我用IVF能通过。
tommao 发表于 2019-12-31 11:25:52
necrohan 发表于 2019-12-31 09:17
如果数组的大小是随输入参数变的,那么用动态数组很合适。
REAL allocatable写法不对,中间加逗号 ...

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

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

GMT+8, 2024-5-9 02:47

Powered by Tencent X3.4

© 2013-2024 Tencent

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