Fortran Coder

查看: 99|回复: 1

[通用算法] PSCAD排序

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
5 点
发表于 2021-11-11 11:42:07 | 显示全部楼层 |阅读模式
MMC里如何对于多个子模块电容电压排序,还需要知道排序后的子模块电容的编号,从而确定是否让该子模块投切。有相关算法吗,求求大佬帮忙
回复

使用道具 举报

646

帖子

2

主题

0

精华

大宗师

F 币
3196 元
贡献
2001 点
发表于 2021-11-11 21:21:46 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
!代码仅为讲解原理所用,未经过验证
!  未经过验证
!  未经过验证
!------------------------------
module sortMod
  type UDT
    real x, y
    character str*40
  end type
  !升序排列
contains
  !单元素排序
  subroutine sortScale(a)
    implicit none
    real a(:), b
    integer i, j
    do i = 1, size(a)-1
      do j = i+1, size(a)
        if(a(i)>a(j)) then
          b=a(i)
          a(i)=a(j)
          a(j)=b
        end if
      end do
    end do
  end subroutine
  !按第一列对整行排序
  subroutine sortArray(a)
    implicit none
    real a(:,:), b(size(a,1))
    integer i, j
    do i = 1, size(a,2)-1
      do j = i+1, size(a,2)
        if(a(1,i)>a(1,j)) then
          b=a(:,i)
          a(:,i)=a(:,j)
          a(:,j)=b
        end if
      end do
    end do
  end subroutine 
  !按前两列对整行排序
  subroutine sortArray2(a)
    implicit none
    real a(:,:), b(size(a,1))
    integer i, j
    do i = 1, size(a,2)-1
      do j = i+1, size(a,2)
        if(a(1,i)==a(1,j)) then
          if(a(2,i)>a(2,j)) then
            b=a(:,i)
            a(:,i)=a(:,j)
            a(:,j)=b
          end if
        else if(a(1,i)>a(1,j)) then
          b=a(:,i)
          a(:,i)=a(:,j)
          a(:,j)=b   
        end if
      end do
    end do
  end subroutine 
  !按前两列对整行排序,效果同sortArray2, 但更简洁
  !适用于按照前n列排序
  subroutine sortArray3(a)
    implicit none
    real a(:,:), b(size(a,1)), hugeval
    integer i, j
    hugeval = maxval(abs(a(2,:)))*1.1 !大于第二列最大绝对值
    do i = 1, size(a,2)-1
      do j = i+1, size(a,2)
        if(a(1,i)*hugeval+a(2,i)>hugeval*a(1,j)+a(2,j)) then
          b=a(:,i)
          a(:,i)=a(:,j)
          a(:,j)=b   
        end if
      end do
    end do
  end subroutine 
  !自定义数据排序
  subroutine sortUDT(a)
    implicit none
    type(UDT) a(:), b
    integer i, j
    do i = 1, size(a)-1
      do j = i+1, size(a)
        if(a(i)%x>a(j)%x) then
          b=a(i)
          a(i)=a(j)
          a(j)=b
        end if
      end do
    end do
  end subroutine
end module 
  
    

评分

参与人数 1F 币 +3 贡献 +3 收起 理由
fcode + 3 + 3

查看全部评分

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2021-12-3 03:13

Powered by Tencent X3.4

© 2013-2021 Tencent

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