You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fortran中创建数组并按指定列数值升序排序输出行

按第二列整数值升序排序Fortran输出

现有Fortran代码读取输入文件后直接逐行处理并输出,导致结果未按输出行的第二列(整数值)升序排列。要实现目标输出,需先收集所有处理后的数据,排序后再写入文件,修改方案如下:

输入文件

h5     1     1.0080      0.086     A    2.42146271591e-01    6.276000e-02
  ho     1     1.0080      0.443     A    0.00000000000e+00    0.000000e+00
   c     6    12.0100      0.632     A    3.39966950842e-01    3.598240e-01
   o     8    16.0000     -0.546     A    2.95992190115e-01    8.786400e-01
  oh     8    16.0000     -0.615     A    3.06647338784e-01    8.803136e-01

修改后的代码

INTEGER, PARAMETER :: N = 5  ! 数据行数
    INTEGER NIB(N), NIA
    REAL NRA, NRB(N), NRC(N), NRD(N)
    REAL FACTOR_1, FACTOR_2
    CHARACTER*2 ATOM
    CHARACTER*1 TYPE
    INTEGER I, J, TEMP_INT
    REAL TEMP_REAL

    OPEN(3, FILE='input')

    FACTOR_1 = 10.0
    FACTOR_2 = 0.239006

    ! 读取并处理所有数据,存入数组
    DO I = 1, N
        READ(3,*) ATOM, NIA, NRA, NRB(I), TYPE, NRC(I), NRD(I)
        
        IF (ATOM.EQ.'c') THEN
            NRC(I) = NRC(I) * FACTOR_1        
            NRD(I) = NRD(I) * FACTOR_2
            NIB(I) = 1
        ELSE IF (ATOM.EQ.'h5') THEN
            NRC(I) = NRC(I) * FACTOR_1 
            NRD(I) = NRD(I) * FACTOR_2
            NIB(I) = 2
        ELSE IF (ATOM.EQ.'o') THEN
            NRC(I) = NRC(I) * FACTOR_1        
            NRD(I) = NRD(I) * FACTOR_2
            NIB(I) = 3
        ELSE IF (ATOM.EQ.'oh') THEN             
            NRC(I) = NRC(I) * FACTOR_1
            NRD(I) = NRD(I) * FACTOR_2
            NIB(I) = 4
        ELSE IF (ATOM.EQ.'ho') THEN
            NRC(I) = NRC(I) * FACTOR_1
            NRD(I) = NRD(I) * FACTOR_2
            NIB(I) = 5
        END IF
    END DO
    CLOSE(3)

    ! 按NIB数组升序排序(冒泡排序,适配小数据量)
    DO I = 1, N-1
        DO J = I+1, N
            IF (NIB(I) .GT. NIB(J)) THEN
                ! 交换NIB
                TEMP_INT = NIB(I)
                NIB(I) = NIB(J)
                NIB(J) = TEMP_INT
                ! 交换NRB
                TEMP_REAL = NRB(I)
                NRB(I) = NRB(J)
                NRB(J) = TEMP_REAL
                ! 交换NRD
                TEMP_REAL = NRD(I)
                NRD(I) = NRD(J)
                NRD(J) = TEMP_REAL
                ! 交换NRC
                TEMP_REAL = NRC(I)
                NRC(I) = NRC(J)
                NRC(J) = TEMP_REAL
            END IF
        END DO
    END DO

    ! 写入排序后的数据
    OPEN(4, FILE='lammps.data', STATUS='NEW')
    DO I = 1, N
        WRITE(4,100) 'pair_coeff', NIB(I), NIB(I), NRB(I), NRD(I), NRC(I)
100     FORMAT (A10,1X,I3,1X,I3,1X,F10.6,1X,F10.6,1X,F10.6)
    END DO
    CLOSE(4)

END 

修改说明

  • 定义对应数据类型的数组,存储所有处理后的NIB、NRB、NRD、NRC值
  • 先完成全量数据的读取和处理,将结果存入数组,替代原代码边读边写的逻辑
  • 用冒泡排序对数组按NIB升序排列,确保所有关联数据同步交换
  • 最后循环输出排序后的数组内容,得到目标结果

内容的提问来源于stack exchange,提问作者gunnerBR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:22:32