如何在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
相关产品推荐
相关产品推荐

