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