necrohan 发表于 2019-12-31 16:02 那就是没问题了,感谢 |
本帖最后由 necrohan 于 2019-12-31 16:08 编辑 tommao 发表于 2019-12-31 12:45 [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#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能通过。 |
necrohan 发表于 2019-12-31 09:17 好的,很有帮助,感谢 |
|
如果数组的大小是随输入参数变的,那么用动态数组很合适。 REAL allocatable写法不对,中间加逗号 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2025-11-5 02:44